Variablen (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL-Analyseendpunkt in Microsoft Fabric Warehouse in Microsoft Fabric SQL-Datenbank 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 NULL
der 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 @StateProvince
initialisiert die einzelnen Variablen wie NULL
folgt:
DECLARE @LastName NVARCHAR(30), @FirstName NVARCHAR(20), @StateProvince NCHAR(2);
In einem anderen Beispiel erstellt die folgende DECLARE
Anweisung eine boolesche Variable namens @IsActive
, die als Bit mit dem Wert (0
false
) deklariert wird:
DECLARE @IsActive BIT = 0;
Bereich „Variablen“
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 das GO
Schlüsselwort) 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
Beispiele
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