85 votes

SQL Views - pas de variables ?

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'.

67voto

spencer7593 Points 29263

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

0 votes

Son efficacité est-elle similaire à celle d'une vue ?

0 votes

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

50voto

datenstation Points 609

Vous pouvez utiliser WITH pour définir vos expressions. Ensuite, faites un simple Sub-SELECT pour accéder à ces définitions.

CREATE VIEW MyView
AS
  WITH MyVars (SomeVar, Var2)
  AS (
    SELECT
      'something' AS 'SomeVar',
      123 AS 'Var2'
  )

  SELECT *
  FROM MyTable
  WHERE x = (SELECT SomeVar FROM MyVars)

3 votes

C'est une constante, pas une variable !

2 votes

@Vladislav Il peut tout aussi bien utiliser les données (filtrées ?) d'une table.

18voto

Daniel Neel Points 105

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

0 votes

Merci pour la correction - mise à jour pour utiliser le CROSS APPLY à la place.

0 votes

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 ?

1 votes

@T_D vous pouvez créer et utiliser 'CTE' dans 'View'.

7voto

Oleg Melnikov Points 1070

@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

4voto

Hogan Points 30189

Oui, c'est correct, vous ne pouvez pas avoir de variables dans les vues. (il existe également d'autres restrictions).

Les vues peuvent être utilisées dans les cas où le résultat peut être remplacé par une instruction de sélection.

0 votes

Une fonction de table peut être remplacée dans une instruction select et elle possède des variables locales.

0 votes

Ê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 ?

1 votes

@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.com

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.

Powered by:

X