SELECT @local_variable (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPoint de terminaison analytique SQL dans Microsoft FabricEntrepôt dans Microsoft Fabric

Affecte à une variable locale la valeur d’une expression.

Pour affecter des valeurs aux variables, il est recommandé d’utiliser SET @local_variable à la place de SELECT @local_variable.

Conventions de la syntaxe Transact-SQL

Syntaxe

SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
    [ ,...n ] [ ; ]

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez la Documentation sur les versions antérieures.

Arguments

@local_variable

Variable déclarée à laquelle doit être affectée une valeur.

{ = | += | -= | *= | /= | %= | &= | ^= | |= }
Assignez la valeur située à droite à la variable située à gauche.

Opérateur d'assignation composé :

Opérateur Action
= Affecte à la variable l’expression qui suit.
+= Additionner et assigner
-= Soustraire et assigner
*= Multiplier et assigner
/= Diviser et assigner
%= Modulo et assigner
&= AND au niveau du bit et assigner
^= XOR au niveau du bit et assigner
|= OR au niveau du bit et assigner

expression

Toute expression valide. Cela comprend une sous-requête scalaire.

Notes

L’instruction SELECT @local_variable est généralement utilisée pour retourner une valeur unique vers la variable. Toutefois, quand expression correspond au nom d’une colonne, plusieurs valeurs peuvent être retournées. Si l'instruction SELECT retourne plusieurs valeurs, la dernière valeur retournée est affectée à la variable.

Si l'instruction SELECT ne retourne aucune ligne, la variable conserve sa valeur actuelle. Si expression est une sous-requête scalaire qui ne retourne aucune valeur, la valeur affectée à la variable est NULL.

Une instruction SELECT peut initialiser plusieurs variables locales.

Notes

Une instruction SELECT contenant une affectation de variable ne peut pas être utilisée pour effectuer également des opérations d'extraction habituelles dans les jeux de résultats.

Exemples

R. Utiliser SELECT @local_variable pour retourner une valeur unique

Dans l’exemple suivant, la variable @var1 se voit attribuer « Generic Name » comme valeur. La requête sur la table Store ne retourne aucune ligne car la valeur spécifiée pour CustomerID n’existe pas dans la table. La variable conserve la valeur « Generic Name ».

Cet exemple utilise l'exemple de base de données AdventureWorksLT. Pour plus d'informations, consultez Exemples de bases de données AdventureWorks. La base de données AdventureWorksLT est utilisée comme base de données pour Azure SQL Database.

-- Uses AdventureWorks2022LT
DECLARE @var1 VARCHAR(30);
SELECT @var1 = 'Generic Name';

SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000; --Value does not exist
SELECT @var1 AS 'ProductName';

Voici le jeu de résultats obtenu.

ProductName
------------------------------
Generic Name

B. Utiliser SELECT @local_variable pour retourner une valeur Null

Dans l'exemple suivant, une sous-requête est utilisée pour affecter une valeur à @var1. Comme la valeur demandée pour CustomerID n’existe pas, la sous-requête ne retourne pas de valeur, et la variable se voit affecter la valeur NULL.

Cet exemple utilise l'exemple de base de données AdventureWorksLT. Pour plus d'informations, consultez Exemples de bases de données AdventureWorks. La base de données AdventureWorksLT est utilisée comme base de données pour Azure SQL Database.

-- Uses AdventureWorksLT
DECLARE @var1 VARCHAR(30);
SELECT @var1 = 'Generic Name';

SELECT @var1 = (SELECT [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000); --Value does not exist

SELECT @var1 AS 'Company Name';

Voici le jeu de résultats obtenu.

Company Name
----------------------------
NULL

C. Utilisation anti-modèle de l’affectation de variables récursives

Évitez le modèle suivant pour l’utilisation récursive des variables et des expressions :

SELECT @Var = <expression containing @Var>
FROM
...

Dans ce cas, il n’est pas garanti que @Var soit mis à jour ligne par ligne. Par exemple, @Var peut être défini sur la valeur initiale de @Var pour toutes les lignes. C’est parce que l’ordre et la fréquence de traitement des affectations ne sont pas déterminants. Cela s’applique aux expressions qui contiennent une concaténation de chaînes de variables, comme illustré ci-dessous, mais aussi aux expressions avec des variables non-chaîne ou des opérateurs de style + =. Utilisez des fonctions d’agrégation à la place pour une opération basée sur un ensemble plutôt qu’une opération ligne par ligne.

Pour la concaténation de chaînes, utilisez plutôt la fonction STRING_AGG, introduite dans SQL Server 2017 (14.x), pour les scénarios où la concaténation de chaînes ordonnées est souhaitée. Pour plus d’informations, consultez STRING_AGG (Transact-SQL).

Cet article requiert l'exemple de base de données AdventureWorks2022, que vous pouvez télécharger à partir de la page d'accueil des exemples et projets de communautés Microsoft SQL Server.

Un exemple à éviter, où l’utilisation de la clause ORDER BY pour tenter de trier la concaténation entraîne la création d’une liste incomplète :

DECLARE @List AS nvarchar(max);
SELECT @List = CONCAT(COALESCE(@List + ', ',''), p.LastName)
  FROM Person.Person AS p
  WHERE p.FirstName = 'William'
  ORDER BY p.BusinessEntityID;
SELECT @List;

Jeu de résultats :

(No column name)
---
Walker

Envisagez plutôt :

DECLARE @List AS nvarchar(max);
SELECT @List = STRING_AGG(p.LastName,', ') WITHIN GROUP (ORDER BY p.BusinessEntityID)
  FROM Person.Person AS p
  WHERE p.FirstName = 'William';
SELECT @List;

Jeu de résultats :

(No column name)
---
Vong, Conner, Hapke, Monroe, Richter, Sotelo, Vong, Ngoh, White, Harris, Martin, Thompson, Martinez, Robinson, Clark, Rodriguez, Smith, Johnson, Williams, Jones, Brown, Davis, Miller, Moore, Taylor, Anderson, Thomas, Lewis, Lee, Walker

Voir aussi

Étapes suivantes