Variablen (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-Endpunkt in Microsoft FabricWarehouse in Microsoft Fabric

Eine lokale Transact-SQL-Variable ist ein Objekt, das einen einzelnen Datenwert eines bestimmten Typs aufnehmen kann. Variablen in Batches und Skripts werden in der Regel wie folgt verwendet:

  • Als Zähler zählen Sie entweder, wie oft eine Schleife ausgeführt wird, oder um zu steuern, wie oft die Schleife ausgeführt wird.
  • Zur Aufnahme eines Datenwerts, der von einer Anweisung zur Ablaufsteuerung getestet werden soll.
  • Zum Speichern eines Datenwerts, der vom Rückgabecode einer gespeicherten Prozedur oder vom Funktionsrückgabewert zurückgegeben werden soll.

Hinweise

Die Namen einiger Transact-SQL-Systemfunktionen beginnen mit zwei @-Zeichen (@@). Obwohl in früheren Versionen von SQL Server die @@ Funktionen als globale Variablen bezeichnet werden, @@ sind Funktionen keine Variablen, und sie haben nicht dasselbe Verhalten wie Variablen. Die @@ Funktionen sind Systemfunktionen, und ihre Syntaxverwendung folgt den Regeln für Funktionen.

Variablen können nicht in einer Ansicht verwendet werden.

Änderungen an Variablen werden durch das Rollback einer Transaktion nicht beeinträchtigt.

Deklarieren einer Transact-SQL-Variablen

Die DECLARE Anweisung initialisiert eine Transact-SQL-Variable durch:

  • Zuweisen eines Namens. Der Name muss ein einzelnes @-Zeichen als erstes Zeichen enthalten.

  • Zuweisen eines vom System bereitgestellten oder benutzerdefinierten Datentyps und einer Länge. Für numerische Variablen werden außerdem die Genauigkeit und die Dezimalstellen zugewiesen. Für Variablen vom Typ XML kann eine optionale Schemaauflistung zugewiesen werden.

  • Festlegen des Werts auf NULL.

Die folgende DECLARE Anweisung erstellt beispielsweise eine lokale Variable @mycounter mit einem Int-Datentyp . Standardmäßig lautet NULLder Wert für diese Variable .

DECLARE @MyCounter INT;

Zum Deklarieren von mehreren lokalen Variablen verwenden Sie ein Komma nach der ersten definierten lokalen Variablen und geben dann den Namen und den Datentyp der nächsten lokalen Variablen an.

Die folgende DECLARE Anweisung erstellt z. B. drei lokale Variablen mit dem Namen @LastName@FirstName und @StateProvinceinitialisiert die einzelnen Variablen wie NULLfolgt:

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

Der Gültigkeitsbereich einer Variablen ist der Bereich von Transact-SQL-Anweisungen, die auf die Variable verweisen können. Der Bereich einer Variablen dauert ab dem Punkt, an dem sie deklariert wird, bis zum Ende des Batches oder der gespeicherten Prozedur, in der sie deklariert wird. Das folgende Skript generiert z. B. einen Syntaxfehler, da die Variable in einem Batch (getrennt durch die GO Schlüsselwort (keyword)) deklariert und in einer anderen referenziert wird:

USE AdventureWorks2022;
GO

DECLARE @MyVariable INT;

SET @MyVariable = 1;
GO

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

Variablen weisen einen lokalen Bereich auf und sind nur innerhalb des Batches oder der Prozedur sichtbar, in dem sie definiert sind. Im folgenden Beispiel hat der geschachtelte Bereich, der für die Ausführung sp_executesql erstellt wurde, keinen Zugriff auf die variable, die im höheren Bereich deklariert ist, und Gibt und Fehler zurück.

DECLARE @MyVariable INT;
SET @MyVariable = 1;
EXECUTE sp_executesql N'SELECT @MyVariable'; -- this produces an error

Festlegen eines Werts in einer Transact-SQL-Variablen

Wenn eine Variable zum ersten Mal deklariert wird, wird der Wert auf NULL. Verwenden Sie die SET Anweisung, um einer Variablen einen Wert zuzuweisen. Diese Methode ist für die Zuweisung eines Werts zu einer Variablen zu bevorzugen. Eine Variable kann auch einen Wert zugewiesen haben, indem in der Auswahlliste einer SELECT Anweisung verwiesen wird.

Wenn Sie einer Variablen einen Wert mit der SET-Anweisung zuweisen, geben Sie den Variablennamen und den Wert an, der der Variablen zugewiesen werden soll. Diese Methode ist für die Zuweisung eines Werts zu einer Variablen zu bevorzugen. Der folgende Batch deklariert z. B. zwei Variablen, weist ihnen Werte zu und verwendet sie dann in der WHERE-Klausel einer SELECT-Anweisung:

USE AdventureWorks2022;
GO

-- Declare two variables.
DECLARE @FirstNameVariable NVARCHAR(50),
    @PostalCodeVariable 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,
    StateProvinceName,
    CountryRegionName
FROM HumanResources.vEmployee
WHERE FirstName = @FirstNameVariable
    OR PostalCode = @PostalCodeVariable;
GO

Einer Variablen kann außerdem ein Wert zugewiesen werden, indem auf sie in einer Auswahlliste verwiesen wird. Wenn in einer Auswahlliste auf eine Variable verwiesen wird, sollte ihm ein skalarer Wert zugewiesen werden, oder die SELECT Anweisung sollte nur eine Zeile zurückgeben. Zum Beispiel:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

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

Warnung

Wenn in einer einzelnen SELECT Anweisung mehrere Zuordnungsklauseln vorhanden sind, garantiert SQL Server nicht die Reihenfolge der Auswertung der Ausdrücke. Effekte sind nur sichtbar, wenn verweise zwischen den Zuordnungen vorhanden sind.

Wenn eine SELECT Anweisung mehr als eine Zeile zurückgibt und die Variable auf einen nichtcalaren Ausdruck verweist, wird die Variable auf den Wert festgelegt, der für den Ausdruck in der letzten Zeile des Resultsets zurückgegeben wird. Beispielsweise wird im folgenden Batch @EmpIDVariable auf den BusinessEntityID Wert der letzten zurückgegebenen Zeile festgelegt, also 1:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

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

SELECT @EmpIDVariable;
GO

Beispiel

Das folgende Skript erstellt eine kleine Testtabelle, die mit 26 Zeilen aufgefüllt wird. Das Skript verwendet eine Variable zur Durchführung von drei Aufgaben:

  • Steuern, wie viele Zeilen eingefügt werden, indem gesteuert wird, wie oft die Schleife durchlaufen wird.
  • Bereitstellen des Werts, der in die Spalte mit ganzen Zahlen eingefügt wird.
  • Fungieren als Teil des Ausdrucks, der Buchstaben generiert, die in die Zeichenspalte eingefügt werden sollen.
-- Create the table.
CREATE TABLE TestTable (cola INT, colb CHAR(3));
GO

SET NOCOUNT ON;
GO

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

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

-- Test the variable to see if the loop is finished.
WHILE (@MyCounter < 26)
BEGIN;
    -- Insert a row into the table.
    INSERT INTO TestTable
    VALUES
        -- 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'.
        (
        @MyCounter,
        CHAR((@MyCounter + ASCII('a')))
        );

    -- Increment the variable to count this iteration
    -- of the loop.
    SET @MyCounter = @MyCounter + 1;
END;
GO

SET NOCOUNT OFF;
GO

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

DROP TABLE TestTable;
GO