Comment puis-je me Déclarer la variable scalaire” en VUE dans Sql Server (2005)
Im essayant de créer un VUE dans SQL Server 2005.
Le code SQL est travaille en tant que telle (Im en utilisant dans VS2008), mais dans SQL Server Im incapable de la sauver, comme message d'erreur "Déclarer la variable scalaire @date de début" et de "Déclarer la variable scalaire @date de fin" s'affiche.
Voici le code:
WITH Calendar AS (SELECT CAST(@StartDate AS datetime) AS Date
UNION ALL
SELECT DATEADD(d, 1, Date) AS Expr1
FROM Calendar AS Calendar_1
WHERE (DATEADD(d, 1, Date) < @EndDate))
SELECT C.Date, C2.Country, COALESCE (SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers]
FROM Calendar AS C CROSS JOIN
dbo.Country AS C2 LEFT OUTER JOIN
dbo.Requests AS R ON C.Date BETWEEN R.[Start date] AND R.[End date] AND R.CountryID = C2.CountryID
GROUP BY C.Date, C2.Country
Et ma question est bien sûr exactement comment dois-je les déclarer?
J'ai essayé de placer le premier dans le code:
DECLARE @StartDate smalldatetime
DECLARE @EndDate smalldatetime
Mais qui na pas faire le truc, comme je m'y attendais - il ne m'a donné une autre pop-up message:
"Declare cursor SQL construire ou de la déclaration n'est pas pris en charge."
OriginalL'auteur Jack Johnstone | 2010-08-13
Vous devez vous connecter pour publier un commentaire.
Comme Alex K a mentionné, vous devriez l'écrire comme un inline fonction à valeur de table. Voici la l'article que décrit à ce sujet.
En bref, la syntaxe serait quelque chose comme
Vous pouvez avoir une requête select (cependant complexe, peuvent utiliser CTE). Et puis vous devrez l'utiliser comme
La baisse de fonctions est qu'elles sont très peu performants si vous voulez vous joindre ou de filtre.
ce que vous dites est généralement vrai pour les multi-déclaration TVF et de fonctions scalaires. Cependant, la solution proposée ici utilise inline fonction à valeur de table. Autant que je sache, SQL Server permettrait d'élargir l'UDF dans la requête (comme fait dans la vue). Par conséquent, contrairement à ce que vous l'avez dit, ils fonctionnent beaucoup mieux dans la jointure/filtre (en supposant que les tables participantes a des indices appropriés) ou, au moins, il ne devrait pas y avoir de pénalité impliquée (autres que les extra analyse) pour l'utilisation de inline TVF. Reportez-vous à la blogs.msdn.com/b/psssql/archive/2010/10/28/...
Y aurait-il un autre avantage de l'ajout AVEC SCHEMABINDING?
SCHEMABINDING est toujours bénéfique en raison de dépendances associées vérifie (c'est à dire en évitant la rupture de l'UDF, en raison de modifications de schéma). Mais si vous demandez du point de vue des performances, il n'y a aucun avantage - qui s'applique à des fonctions scalaires (voir blogs.msdn.com/b/sqlprogrammability/archive/2006/05/12/...)
OriginalL'auteur VinayC
Si par VUE vous dire un SQL Server native vue (
CREATE VIEW ...
), alors vous ne pouvez pas utiliser des variables locales à tous (vous pouvez utiliser une table udf à la place).Si vous voulez dire quelque chose d'autre, puis d'ajouter
DECLARE @StartDate DATETIME, @EndDate DATETIME
fait cette affirmation analyser fine, c'est l'intégralité du SQL?OriginalL'auteur Alex K.
Voici un exemple de requête qui utilise CTE pour bien imiter variable interne de la construction. Vous pouvez essayer de l'exécuter dans votre version de SQL Server.
rendement de sortie:
aussi via
JOIN
aussi via
CROSS APPLY
OriginalL'auteur Oleg Melnikov
essayez de remplacer tous vos @X @Y A. X, A. Y, ajoutez à votre code:
From (SELECT X = 'literalX', Y = 'litéralement"), Un
ensuite, vous avez mis tout votre littéraux en un seul endroit et ne disposent que d'un seul exemplaire.
OriginalL'auteur G Clayton