11
votes

Comment "déclarer la variable scalaire" dans une vue SQL Server (2005)

J'essaie de créer une vue dans SQL Server 2005.

Le code SQL fonctionne comme tel (je l'utilise à l'aide de VS2008), Mais dans SQL Server, je suis incapable de l'enregistrer, car le message d'erreur "déclarer la variable scalaire @stardate" et "déclarer la variable scalaire @enddate" apparaît.

Voici le code: xxx

et ma question est bien sûr - comment dois-je les déclarer?

J'ai essayé de mettre les premiers suivants dans le code : xxx

mais ce n'est pas fait l'affaire, tout comme je m'attendais - cela ne m'a donné qu'un autre message contextuel:

"Le déclarer Cursor SQL Construction ou déclaration n'est pas prise en charge. "


0 commentaires

4 Réponses :


2
votes

si par Vue Vous voulez dire une vue natif SQL Server ( Créer une vue ... ), vous ne pouvez pas utiliser de variables locales du tout (vous utiliseriez une table-valorisée udf à la place).

Si vous voulez dire quelque chose d'autre, Ajoutez Declare @startdate DateTime, @enddate DateTime Fait que l'énoncé Analyse bien, est-ce l'intégralité du SQL?


1 commentaires

Je veux dire que je dans le SQL Server Management Studio clique droit sur le dossier "Vues" et sélectionne "Nouvelle vue ..." - J'ai créé d'autres vues de cette façon, puis je les utilise dans Visual Studio 2008 (C #) à Utilisez-les lorsque vous créez des "tableaux de table", par exemple. Eh bien, qu'est-ce qu'un UDF de valorisation de la table? Où et comment puis-je le créer, savez-vous?



12
votes

Comme Alex K l'a mentionné, vous devez l'écrire sous la forme d'une fonction de table en ligne. Voici le article qui décrit à ce sujet.

En bref, la syntaxe serait quelque chose comme xxx

Vous pouvez avoir une requête sélectionnée (si complexe peut utiliser CTE). Et ensuite vous l'utiliserez comme xxx


5 commentaires

Nice, va tester cela - je le vois comme une réponse acceptable :-)


Les inconvénients des fonctions sont qu'ils sont très mal performants si vous souhaitez rejoindre ou filtrer dessus.


@IanBoyd, ce que vous dites est généralement vrai pour les fonctions TVF multi-instructions et scalaires. Cependant, la solution utilise ici une fonction de valorisation de la table en ligne. AFAIK, SQL Server élargirait l'UDF dans la requête (juste commee à la vue). Par conséquent, contrairement à ce que vous avez indiqué, ils travailleraient beaucoup mieux dans la jointure / le filtre (en supposant que les tableaux participants disposent d'indices appropriés) ou du moins, il ne devrait y avoir aucune pénalité (autre qu'une analyse supplémentaire) pour l'utilisation de TVF en ligne. Voir voir Voir blogs.msdn.com/b/psssql/archive/2010/10/28/...


Serait-il un avantage supplémentaire d'ajouter avec schéma?


@Mark, avec schéma, est toujours bénéfique en raison des contrôles de dépendance associés (c'est-à-dire éviter de casser l'UDF en raison de changements de schéma). Mais si vous demandez du point de vue de la performance, il n'y a pas d'avantage - cela s'applique aux fonctions scalaires (voir blogs.msdn.com/b/sqlprogrammabilité/archive/2006/05/12/... )



-1
votes

Essayez de remplacer tout votre @x, @y avec A.x et A.Y, ajouter à votre code: De (sélectionnez x = 'littéralx', y = 'littéralement') a Ensuite, vous avez mis tous vos littéraux à un endroit et n'en avez qu'un seul copie.


0 commentaires

1
votes

Voici une requête d'échantillon qui utilise CTE pour imiter joliment la construction variable interne. Vous pouvez le tester dans votre version de SQL Server.

WITH params AS ( SELECT varType='%Admin%', varMinStatus=1)
SELECT status, name 
    FROM sys.sysusers CROSS APPLY params
    WHERE status > varMinStatus OR name LIKE varType


0 commentaires