Variablen (Transact-SQL)Variables (Transact-SQL)

DIESES THEMA GILT FÜR: jaSQL Server (ab 2008)jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Eine lokale Transact-SQL-Variable ist ein Objekt, das einen einzelnen Datenwert eines bestimmten Typs aufnehmen kann.A Transact-SQL local variable is an object that can hold a single data value of a specific type. Variablen in Batches und Skripts werden in der Regel wie folgt verwendet:Variables in batches and scripts are typically used:

  • Als Zähler, der entweder zählt, wie häufig eine Schleife durchlaufen wird, oder der steuert, wie häufig die Schleife durchlaufen werden soll.As a counter either to count the number of times a loop is performed or to control how many times the loop is performed.
  • Zur Aufnahme eines Datenwerts, der von einer Anweisung zur Ablaufsteuerung getestet werden soll.To hold a data value to be tested by a control-of-flow statement.
  • Zum Speichern eines Datenwerts, der vom Rückgabecode einer gespeicherten Prozedur oder vom Funktionsrückgabewert zurückgegeben werden soll.To save a data value to be returned by a stored procedure return code or function return value.
Hinweis

Die Namen einiger Funktionen der Transact-SQL-System beginnen mit zwei am -Zeichen (@@).The names of some Transact-SQL system functions begin with two at signs (@@). Obwohl in früheren Versionen von SQL ServerSQL Server, die @@functions bezeichnet werden, als globale Variablen, sie sind keine Variablen und verfügen nicht über die gleichen Verhaltensweisen wie Variablen.Although in earlier versions of SQL ServerSQL Server, the @@functions are referred to as global variables, they are not variables and do not have the same behaviors as variables. Der @@functions sind Systemfunktionen und deren Syntaxverwendung der Regeln für Funktionen.The @@functions are system functions, and their syntax usage follows the rules for functions.

Das folgende Skript erstellt eine kleine Testtabelle, die mit 26 Zeilen aufgefüllt wird.The following script creates a small test table and populates it with 26 rows. Das Skript verwendet eine Variable zur Durchführung von drei Aufgaben:The script uses a variable to do three things:

  • Steuern, wie viele Zeilen eingefügt werden, indem gesteuert wird, wie oft die Schleife durchlaufen wird.Control how many rows are inserted by controlling how many times the loop is executed.
  • Bereitstellen des Werts, der in die Spalte mit ganzen Zahlen eingefügt wird.Supply the value inserted into the integer column.
  • Fungieren als Teil des Ausdrucks, der Buchstaben generiert, die in die Zeichenspalte eingefügt werden sollen.Function as part of the expression that generates letters to be inserted into the character column.
-- 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

Deklarieren einer Transact-SQL-VariablenDeclaring a Transact-SQL Variable

DECLARE-Anweisung initialisiert eine Transact-SQL-Variable durch:The DECLARE statement initializes a Transact-SQL variable by:

  • Zuweisen eines Namens.Assigning a name. Der Name muss ein einzelnes @-Zeichen als erstes Zeichen enthalten.The name must have a single @ as the first character.
  • Zuweisen eines vom System bereitgestellten oder benutzerdefinierten Datentyps und einer Länge.Assigning a system-supplied or user-defined data type and a length. Für numerische Variablen werden außerdem die Genauigkeit und die Dezimalstellen zugewiesen.For numeric variables, a precision and scale are also assigned. Für Variablen des Typs XML kann eine optionale Schemaauflistung zugewiesen werden.For variables of type XML, an optional schema collection may be assigned.
  • Festlegen des Werts auf NULL.Setting the value to NULL.

Beispielsweise die folgenden DECLARE -Anweisung erstellt eine lokale Variable namens @mycounter mit einem Int-Datentyp.For example, the following DECLARE statement creates a local variable named @mycounter with an int data type.

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.To declare more than one local variable, use a comma after the first local variable defined, and then specify the next local variable name and data type.

Beispielsweise die folgenden DECLARE -Anweisung erstellt drei lokale Variablen namens @LastName , @FirstName und @StateProvince , und alle mit NULL initialisiert:For example, the following DECLARE statement creates three local variables named @LastName, @FirstName and @StateProvince, and initializes each to NULL:

DECLARE @LastName nvarchar(30), @FirstName nvarchar(20), @StateProvince nchar(2);

Der Gültigkeitsbereich einer Variablen ist der Bereich der Transact-SQL-Anweisungen, die die Variable verweisen können.The scope of a variable is the range of Transact-SQL statements that can reference the variable. Der Gültigkeitsbereich einer Variablen reicht von dem Punkt, an dem sie deklariert wurde, bis zum Ende des Batches oder der gespeicherten Prozedur, in dem bzw. der sie deklariert wurde.The scope of a variable lasts from the point it is declared until the end of the batch or stored procedure in which it is declared. Das folgende Skript generiert z. B. einen Syntaxfehler, weil die Variable in einem Batch deklariert wird und dann in einem anderen Batch auf sie verwiesen wird:For example, the following script generates a syntax error because the variable is declared in one batch and referenced in another:

USE AdventureWorks2014;
GO
DECLARE @MyVariable int;
SET @MyVariable = 1;
-- Terminate the batch by using the GO keyword.
GO 
-- @MyVariable has gone out of scope and no longer exists.

-- This SELECT statement generates a syntax error because it is
-- no longer legal to reference @MyVariable.
SELECT BusinessEntityID, NationalIDNumber, JobTitle
FROM HumanResources.Employee
WHERE BusinessEntityID = @MyVariable;

Variablen haben einen lokalen Gültigkeitsbereich und sind nur im Batch bzw. in der Prozedur sichtbar, in dem bzw. in der sie definiert sind.Variables have local scope and are only visible within the batch or procedure where they are defined. Im folgenden Beispiel bietet der zur Ausführung von sp_executesql erstellte geschachtelte Gültigkeitsbereich keinen Zugriff auf die Variable, die im höheren Geltungsbereich deklariert ist, und gibt einen Fehler zurück.In the following example, the nested scope created for execution of sp_executesql does not have access to the variable declared in the higher scope and returns and error.

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

Festlegen eines Werts in einer Transact-SQL-VariablenSetting a Value in a Transact-SQL Variable

Für eine Variable, die deklariert wird, wird der Wert anfangs auf NULL festgelegt.When a variable is first declared, its value is set to NULL. Verwenden Sie die SET-Anweisung, um einer Variablen einen Wert zuzuweisen.To assign a value to a variable, use the SET statement. Diese Methode ist für die Zuweisung eines Werts zu einer Variablen zu bevorzugen.This is the preferred method of assigning a value to a variable. Einer Variablen kann außerdem ein Wert zugewiesen werden, indem auf sie in der Auswahlliste einer SELECT-Anweisung verwiesen wird.A variable can also have a value assigned by being referenced in the select list of a SELECT statement.

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.To assign a variable a value by using the SET statement, include the variable name and the value to assign to the variable. Diese Methode ist für die Zuweisung eines Werts zu einer Variablen zu bevorzugen.This is the preferred method of assigning a value to a variable. Der folgende Batch deklariert z. B. zwei Variablen, weist ihnen Werte zu und verwendet sie dann in der WHERE-Klausel einer SELECT-Anweisung:The following batch, for example, declares two variables, assigns values to them, and then uses them in the WHERE clause of a SELECT statement:

USE AdventureWorks2014;
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.A variable can also have a value assigned by being referenced in a select list. Wenn auf eine Variable in einer Auswahlliste verwiesen wird, sollte ihr ein Skalarwert zugewiesen werden, oder die SELECT-Anweisung sollte nur eine Zeile zurückgeben.If a variable is referenced in a select list, it should be assigned a scalar value or the SELECT statement should only return one row. Beispiel:For example:

USE AdventureWorks2014;
GO
DECLARE @EmpIDVariable int;

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

Wenn es in einer einzelnen SELECT-Anweisung mehrere Zuordnungsklauseln gibt, kann SQL Server die Bewertungsreihenfolge der Ausdrücke nicht sicherstellen.If there are multiple assignment clauses in a single SELECT statement, SQL Server does not guarantee the order of evaluation of the expressions. Beachten Sie, dass die Auswirkungen nur dann sichtbar sind, wenn es Verweise zwischen den Zuordnungen gibt.Note that effects are only visible if there are references among the assignments.

Wenn eine SELECT-Anweisung gibt mehr als eine Zeile zurück, und die Variable auf einen nicht skalaren Ausdruck verweist, wird die Variable für den Ausdruck in der letzten Zeile des Resultsets zurückgegebenen Wert festgelegt.If a SELECT statement returns more than one row and the variable references a non-scalar expression, the variable is set to the value returned for the expression in the last row of the result set. Z. B. in den folgenden Batch @EmpIDVariable festgelegt ist, um die BusinessEntityID Wert der letzten Zeile zurückgegeben, das 1 ist:For example, in the following batch @EmpIDVariable is set to the BusinessEntityID value of the last row returned, which is 1:

USE AdventureWorks2014;
GO
DECLARE @EmpIDVariable int;

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

SELECT @EmpIDVariable;
GO

Siehe auchSee Also

Deklarieren@local_variableDeclare @local_variable

SET@local_variableSET @local_variable

WÄHLEN SIE@local_variableSELECT @local_variable