Partager via


Variables (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Point de terminaison d’analytique SQL dans Microsoft FabricEntrepôt dans Microsoft FabricBase de données SQL dans Microsoft Fabric

Une variable locale Transact-SQL est un objet pouvant posséder une valeur de données unique d’un type donné. Vous utilisez généralement des variables dans des lots et des scripts à des fins suivantes :

  • Utilisez une variable comme compteur pour compter le nombre de fois qu’une boucle est effectuée ou pour contrôler le nombre de fois où la boucle est effectuée.
  • Conservez une valeur de données à tester par une instruction control-of-flow.
  • Enregistrez une valeur de données à retourner par un code de retour de procédure stockée ou une valeur de retour de fonction.

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.

Remarks

Le nom de certaines fonctions système Transact-SQL commence par deux arobases (@@). Bien que les versions antérieures de SQL Server font référence aux @@ fonctions en tant que variables globales, @@ les fonctions ne sont pas des variables et n’ont pas les mêmes comportements que les variables. Les @@ fonctions sont des fonctions système et leur utilisation de la syntaxe suit les règles des fonctions.

Vous ne pouvez pas utiliser de variables dans une vue.

Les modifications apportées aux variables ne sont pas affectées par la restauration d’une transaction.

Déclarer une variable Transact-SQL

Utilisez l’instruction DECLARE pour initialiser une variable Transact-SQL par :

  • Affectation d'un nom. Le nom doit commencer par un caractère unique @ .

  • Affectation d'un type de données système ou défini par l'utilisateur, ainsi que d'une taille. Pour les variables numériques, vous pouvez affecter une échelle de précision et facultative. Pour les variables de type XML, vous pouvez éventuellement affecter une collection de schémas.

  • Définition de la valeur sur NULL.

Par exemple, l’instruction suivante DECLARE crée une variable locale nommée @mycounter avec un type de données int . Par défaut, la valeur de cette variable est NULL.

DECLARE @MyCounter AS INT;

Pour déclarer plusieurs variables locales, utilisez une virgule après la première définition de variable locale, puis spécifiez le nom et le type de données de la variable locale suivante.

Par exemple, l’instruction suivante DECLARE crée trois variables locales nommées @LastName, @FirstNameet @StateProvinceinitialise chacune à NULL:

DECLARE @LastName AS NVARCHAR (30),
        @FirstName AS NVARCHAR (20),
        @StateProvince AS NCHAR (2);

Dans un autre exemple, l’instruction suivante DECLARE crée une variable booléenne appelée @IsActive, qui est déclarée en tant que bit avec une valeur (0) :false

DECLARE @IsActive AS BIT = 0;

Portée variable

L’étendue d’une variable correspond à la plage des instructions Transact-SQL pouvant référencer cette variable. L’étendue d’une variable dure à partir du point où elle est déclarée jusqu’à la fin du lot ou de la procédure stockée dans laquelle elle est déclarée. Par exemple, le script suivant génère une erreur de syntaxe, car la variable est déclarée dans un lot (séparé par le GO mot clé) et référencée dans un autre :

USE AdventureWorks2025;
GO

DECLARE @MyVariable AS INT;
SET @MyVariable = 1;

SELECT BusinessEntityID,
       NationalIDNumber,
       JobTitle
FROM HumanResources.Employee
WHERE BusinessEntityID = @MyVariable;

Les variables ont une étendue locale et sont visibles uniquement dans le lot ou la procédure où vous les définissez. Dans l’exemple suivant, l’étendue imbriquée créée pour l’exécution de sp_executesql n’a pas accès à la variable déclarée dans l’étendue supérieure et retourne une erreur.

DECLARE @MyVariable AS INT;
SET @MyVariable = 1;

EXECUTE sp_executesql N'SELECT @MyVariable';

Cette requête génère l’erreur suivante :

Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "@MyVariable".

Définir une valeur dans une variable Transact-SQL

Lorsque vous déclarez d’abord une variable, sa valeur est NULL. Pour affecter une valeur à une variable, utilisez l’instruction SET . Cette méthode est la méthode recommandée pour affecter une valeur à une variable. Vous pouvez également affecter une valeur à une variable en le référençant dans la liste de sélection d’une SELECT instruction.

Pour affecter une variable à une valeur à l’aide de l’instruction SET , incluez le nom de la variable et la valeur à affecter à la variable. Cette méthode est la méthode recommandée pour affecter une valeur à une variable. Le lot suivant, par exemple, déclare deux variables, leur affecte une valeur et les utilise dans la clause WHERE d'une instruction SELECT :

USE AdventureWorks2025;
GO

-- Declare two variables.
DECLARE @FirstNameVariable AS NVARCHAR (50),
        @PostalCodeVariable AS NVARCHAR (15);

-- Set their values.
SET @FirstNameVariable = N'Amy';
SET @PostalCodeVariable = N'BA5 3HX';

-- Use them in the WHERE clause of a SELECT statement.
SELECT LastName,
       FirstName,
       JobTitle,
       City,
       PostalCode,
       StateProvinceName,
       CountryRegionName
FROM HumanResources.vEmployee
WHERE FirstName = @FirstNameVariable
      OR PostalCode = @PostalCodeVariable;

Vous pouvez également affecter une valeur à une variable en le référençant dans une liste de sélection. Si vous référencez une variable dans une liste de sélection, affectez-la à une valeur scalaire ou vérifiez que l’instruction SELECT retourne une seule ligne. Par exemple:

USE AdventureWorks2025;
GO

DECLARE @EmpIDVariable AS INT;

SELECT @EmpIDVariable = MAX(BusinessEntityID)
FROM HumanResources.Employee;

Warning

S’il existe plusieurs clauses d’affectation dans une seule SELECT instruction, le moteur de base de données ne garantit pas l’ordre d’évaluation des expressions. Les effets ne sont visibles que s’il existe des références entre les affectations.

Si une SELECT instruction retourne plusieurs lignes et que la variable fait référence à une expression noncalaire, la variable est définie sur la valeur retournée pour l’expression dans la dernière ligne du jeu de résultats. Par exemple, dans le lot @EmpIDVariable suivant, la valeur de la dernière ligne retournée est BusinessEntityID1:

USE AdventureWorks2025;
GO

DECLARE @EmpIDVariable AS INT;

SELECT @EmpIDVariable = BusinessEntityID
FROM HumanResources.Employee
ORDER BY BusinessEntityID DESC;

SELECT @EmpIDVariable;

Examples

Le script suivant crée une petite table test et lui attribue 26 lignes. Il utilise une variable pour effectuer trois actions :

  • vérifier le nombre de lignes insérées en contrôlant combien de fois la boucle est exécutée ;
  • fournir la valeur insérée dans la colonne INT ;
  • Fonction dans le cadre de l’expression qui génère des lettres à insérer dans la colonne de caractères.
-- Create the table.
CREATE TABLE TestTable
(
    cola INT,
    colb CHAR (3)
);

SET NOCOUNT ON;

-- Declare the variable to be used.
DECLARE @MyCounter AS INT;

-- Initialize the variable.
SET @MyCounter = 0;

-- Test the variable to see if the loop is finished.
WHILE (@MyCounter < 26)
    -- Insert a row into the table.
    BEGIN
        INSERT INTO TestTable
        -- Use the variable to provide the integer value
        -- for cola. Also use it to generate a unique letter
        -- for each row. Use the ASCII function to get the
        -- integer value of 'a'. Add @MyCounter. Use CHAR to
        -- convert the sum back to the character @MyCounter
        -- characters after 'a'.
        VALUES (
            @MyCounter,
            CHAR((@MyCounter + ASCII('a')))
        );
        -- Increment the variable to count this iteration
        -- of the loop.
        SET @MyCounter = @MyCounter + 1;
    END
SET NOCOUNT OFF;

-- View the data.
SELECT cola,
       colb
FROM TestTable;
DROP TABLE TestTable;