Est-il possible de déclarer une variable dans une vue ? Par exemple :
Declare @SomeVar varchar(8) = 'something'
me donne l'erreur de syntaxe :
Syntaxe incorrecte à proximité du mot clé 'Declare'.
Est-il possible de déclarer une variable dans une vue ? Par exemple :
Declare @SomeVar varchar(8) = 'something'
me donne l'erreur de syntaxe :
Syntaxe incorrecte à proximité du mot clé 'Declare'.
Vous avez raison. Les variables locales ne sont pas autorisées dans un VIEW.
Vous pouvez définir une variable locale dans une fonction à valeur de table, qui renvoie un ensemble de résultats (comme le fait une vue).
http://msdn.microsoft.com/en-us/library/ms191165.aspx
par exemple
CREATE FUNCTION dbo.udf_foo()
RETURNS @ret TABLE (col INT)
AS
BEGIN
DECLARE @myvar INT;
SELECT @myvar = 1;
INSERT INTO @ret SELECT @myvar;
RETURN;
END;
GO
SELECT * FROM dbo.udf_foo();
GO
Non, les TVF sont souvent plus lents. " Les fonctions à valeur de table (TVF) de SQL Server semblent être une bonne idée, mais elles masquent une foule de problèmes de performance potentiels. Les TVF font en sorte que des parties d'un plan d'exécution restent en série (elles éviteront le parallélisme), elles produisent de mauvaises estimations de rangées, et les TVF à plusieurs états peuvent même ne pas bénéficier de la meilleure optimisation disponible. En bref - les TVFs puent." brentozar.com/blitzcache/tvf-join
EDIT : J'ai essayé d'utiliser un CTE sur ma réponse précédente qui était incorrecte, comme l'a souligné @bummi. Cette option devrait fonctionner à la place :
Voici une option utilisant un CROSS APPLY, pour contourner ce problème :
SELECT st.Value, Constants.CONSTANT_ONE, Constants.CONSTANT_TWO
FROM SomeTable st
CROSS APPLY (
SELECT 'Value1' AS CONSTANT_ONE,
'Value2' AS CONSTANT_TWO
) Constants
Cela fonctionne, mais les colonnes de l'application croisée ne sont-elles pas réinitialisées pour chaque ligne ? En particulier pour les valeurs calculées, cela signifierait une grande perte de performance. C'est juste triste que Local Variable et CTE ne sont pas disponibles dans une vue, quelqu'un a une idée pourquoi ?
@datenstation avait le bon concept. Voici un exemple fonctionnel qui utilise le CTE pour mettre en cache les noms des variables :
CREATE VIEW vwImportant_Users AS
WITH params AS (
SELECT
varType='%Admin%',
varMinStatus=1)
SELECT status, name
FROM sys.sysusers, params
WHERE status > varMinStatus OR name LIKE varType
SELECT * FROM vwImportant_Users
également via JOIN
WITH params AS ( SELECT varType='%Admin%', varMinStatus=1)
SELECT status, name
FROM sys.sysusers INNER JOIN params ON 1=1
WHERE status > varMinStatus OR name LIKE varType
également via CROSS APPLY
WITH params AS ( SELECT varType='%Admin%', varMinStatus=1)
SELECT status, name
FROM sys.sysusers CROSS APPLY params
WHERE status > varMinStatus OR name LIKE varType
Une fonction de table peut être remplacée dans une instruction select et elle possède des variables locales.
Êtes-vous en train de dire que puisqu'une déclaration de sélection ne peut pas avoir de variables locales, une vue ne le peut pas non plus ?
@JeffO "vous ne pouvez pas avoir de variables dans les vues" est ce que j'ai dit. Est-ce que ce n'est pas clair ?
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.