SELECT @local_variable (Transact-SQL)

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

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

Pour affecter des variables, utilisez SET @local_variable plutôt SELECT @local_variableque .

Conventions de la syntaxe Transact-SQL

Syntax

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

Arguments

@local_variable

Variable déclarée pour laquelle vous affectez une valeur.

{ = | += | -= | *= | /= | %= | &= | ^= | |=}

Assignez la valeur située à droite à la variable située à gauche.

Opérateur d'assignation composé :

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

expression

Toute expression valide. Ce terme inclut une sous-requête scalaire.

Remarks

Permet SELECT @local_variable de retourner une valeur unique dans 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 variable obtient la dernière valeur retournée par la requête.

Si l’instruction SELECT ne retourne aucune ligne, la variable conserve sa valeur actuelle. Si l’expression est une sous-requête scalaire qui ne retourne aucune valeur, la variable est définie sur NULL.

Une SELECT instruction peut initialiser plusieurs variables locales.

Note

Vous ne pouvez pas utiliser une instruction qui contient une SELECT affectation de variable pour effectuer également des opérations de récupération de jeu de résultats classiques.

Examples

Les exemples de code de cet article utilisent les bases de données d'exemple AdventureWorks2025 ou AdventureWorksDW2025, que vous pouvez télécharger à partir de la page d'accueil Microsoft SQL Server Samples and Community Projects.

La base de données AdventureWorksLT est utilisée comme base de données pour Azure SQL Database.

A. Utiliser SELECT @local_variable pour retourner une valeur unique

Dans l’exemple suivant, la variable @var1 obtient la valeur 'Generic Name'. 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 ».

DECLARE @var1 AS VARCHAR (30);

SELECT @var1 = 'Generic Name';

SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000;

SELECT @var1 AS 'ProductName';

Voici le jeu de résultats.

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

B. Utiliser SELECT @local_variable pour retourner une valeur Null

Dans l’exemple suivant, une sous-requête affecte 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.

DECLARE @var1 AS VARCHAR (30);

SELECT @var1 = 'Generic Name';

SELECT @var1 = (SELECT [Name]
                FROM SalesLT.Product
                WHERE ProductID = 1000000);

SELECT @var1 AS 'Company Name';

Voici le jeu de résultats.

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 qu’il @Var soit mis à jour sur une ligne par ligne. Par exemple, @Var il peut être défini sur la valeur initiale de @Var toutes les lignes. Ce comportement se produit parce que l’ordre et la fréquence dans lesquels les affectations sont traitées n’est pas déterminant. Cette règle s’applique aux expressions contenant la concaténation de chaînes de variables, comme illustré dans l’exemple suivant, mais également aux expressions avec des variables non-chaînes 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, tenez compte de la fonction STRING_AGG, introduite dans SQL Server 2017 (14.x), pour les scénarios où la concaténation de chaîne ordonnée est souhaitée. Pour plus d’informations, consultez STRING_AGG.

L’exemple suivant montre un antimodèle à éviter. L’utilisation ORDER BY dans une tentative de concaténation entraîne l’incompaténation de la liste :

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;

Voici le jeu de résultats.

(No column name)
---
Walker

Considérez 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;

Voici le 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