DECLARE @local_variable (Transact-SQL)DECLARE @local_variable (Transact-SQL)

GILT FÜR: JaSQL Server JaAzure SQL-Datenbank JaAzure Synapse Analytics (SQL DW) JaParallel Data Warehouse APPLIES TO: YesSQL Server YesAzure SQL Database YesAzure Synapse Analytics (SQL DW) YesParallel Data Warehouse

Variablen werden im Hauptteil eines Batchs oder einer Prozedur mit einer DECLARE-Anweisung deklariert. Die Werte werden mithilfe einer SET- oder SELECT-Anweisung zugewiesen.Variables are declared in the body of a batch or procedure with the DECLARE statement and are assigned values by using either a SET or SELECT statement. Cursorvariablen können mit dieser Anweisung deklariert und mit anderen cursorspezifischen Anweisungen verwendet werden.Cursor variables can be declared with this statement and used with other cursor-related statements. Nach der Deklaration werden alle Variablen mit NULL initialisiert, es sei denn, ein Wert wurde als Teil der Deklaration angegeben.After declaration, all variables are initialized as NULL, unless a value is provided as part of the declaration.

Symbol für Themenlink Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

-- Syntax for SQL Server and Azure SQL Database  
  
DECLARE   
{   
    { @local_variable [AS] data_type  [ = value ] }  
  | { @cursor_variable_name CURSOR }  
} [,...n]   
| { @table_variable_name [AS] <table_type_definition> }   
  
<table_type_definition> ::=   
     TABLE ( { <column_definition> | <table_constraint> } [ ,...n] )   
  
<column_definition> ::=   
     column_name { scalar_data_type | AS computed_column_expression }  
     [ COLLATE collation_name ]   
     [ [ DEFAULT constant_expression ] | IDENTITY [ (seed ,increment ) ] ]   
     [ ROWGUIDCOL ]   
     [ <column_constraint> ]   
  
<column_constraint> ::=   
     { [ NULL | NOT NULL ]   
     | [ PRIMARY KEY | UNIQUE ]   
     | CHECK ( logical_expression )   
     | WITH ( <index_option > )  
     }   
  
<table_constraint> ::=   
     { { PRIMARY KEY | UNIQUE } ( column_name [ ,...n] )   
     | CHECK ( search_condition )   
     }   
  
<index_option> ::=  
See CREATE TABLE for index option syntax.  
  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
DECLARE   
{{ @local_variable [AS] data_type } [ =value [ COLLATE <collation_name> ] ] } [,...n]  
  

ArgumenteArguments

@local_variable@local_variable
Der Name einer Variablen.Is the name of a variable. Variablennamen müssen mit einem at-Zeichen (@) beginnen.Variable names must begin with an at (@) sign. Die Namen lokaler Variablen müssen den Regeln für Bezeichner entsprechen.Local variable names must comply with the rules for identifiers.

data_typedata_type
Ein vom System bereitgestellter, CLR-benutzerdefinierter Tabellentyp (Common Language Runtime) oder Aliasdatentyp.Is any system-supplied, common language runtime (CLR) user-defined table type, or alias data type. Eine Variable kann nicht den Datentyp text, ntext oder image haben.A variable cannot be of text, ntext, or image data type.

Weitere Informationen zu Systemdatentypen finden Sie unter Datentypen (Transact-SQL).For more information about system data types, see Data Types (Transact-SQL). Weitere Informationen zu CLR-benutzerdefinierten Typen oder Aliasdatentypen finden Sie unter CREATE TYPE (Transact-SQL).For more information about CLR user-defined types or alias data types, see CREATE TYPE (Transact-SQL).

=value=value
Weist der Variablen inline einen Wert zu.Assigns a value to the variable in-line. Der Wert kann eine Konstante oder ein Ausdruck sein; auf jeden Fall muss er mit dem Typ der Variablendeklaration übereinstimmen oder implizit in diesen Typ konvertiert werden können.The value can be a constant or an expression, but it must either match the variable declaration type or be implicitly convertible to that type. Weitere Informationen finden Sie unter Expressions (Transact-SQL).For more information, see Expressions (Transact-SQL).

@cursor_variable_name@cursor_variable_name
Der Name einer Cursorvariablen.Is the name of a cursor variable. Cursorvariablennamen müssen mit einem at-Zeichen (@) beginnen und den Regeln für Bezeichner entsprechen.Cursor variable names must begin with an at (@) sign and conform to the rules for identifiers.

CURSORCURSOR
Gibt an, dass die Variable eine lokale Cursorvariable ist.Specifies that the variable is a local cursor variable.

@table_variable_name@table_variable_name
Der Name einer Variablen vom Typ table.Is the name of a variable of type table. Variablennamen müssen mit einem at-Zeichen (@) beginnen und den Regeln für Bezeichner entsprechen.Variable names must begin with an at (@) sign and conform to the rules for identifiers.

<table_type_definition><table_type_definition>
Definiert den Datentyp table.Defines the table data type. Die Tabellendeklaration schließt Spaltendefinitionen, Namen, Datentypen und Einschränkungen ein.The table declaration includes column definitions, names, data types, and constraints. Die einzigen zulässigen Einschränkungstypen sind PRIMARY KEY, UNIQUE, NULL und CHECK.The only constraint types allowed are PRIMARY KEY, UNIQUE, NULL, and CHECK. Ein Aliasdatentyp kann nicht als Skalar-Spaltendatentyp verwendet werden, wenn eine Regel oder Standarddefinition an den Typ gebunden ist.An alias data type cannot be used as a column scalar data type if a rule or default definition is bound to the type.

<table_type_definition> ist eine Teilmenge von Informationen, die zum Definieren einer Tabelle in CREATE TABLE verwendet werden.<table_type_definiton> Is a subset of information used to define a table in CREATE TABLE. Darin sind Elemente und wichtige Definitionen eingeschlossen.Elements and essential definitions are included here. Weitere Informationen finden Sie unter CREATE TABLE (Transact-SQL).For more information, see CREATE TABLE (Transact-SQL).

nn
Ein Platzhalter, der angibt, dass mehrere Variablen angegeben und ihnen Werte zugewiesen werden können.Is a placeholder indicating that multiple variables can be specified and assigned values. Beim Deklarieren von table-Variablen muss die table-Variable die einzige Variable sein, die in der DECLARE-Anweisung deklariert wird.When declaring table variables, the table variable must be the only variable being declared in the DECLARE statement.

column_namecolumn_name
Der Name der Spalte in der Tabelle.Is the name of the column in the table.

scalar_data_typescalar_data_type
Gibt an, dass die Spalte ein skalarer Datentyp ist.Specifies that the column is a scalar data type.

computed_column_expressioncomputed_column_expression
Ein Ausdruck, der den Wert einer berechneten Spalte definiert.Is an expression defining the value of a computed column. Sie wird mithilfe anderer Spalten derselben Tabelle mit einem Ausdruck berechnet.It is computed from an expression using other columns in the same table. Eine berechnete Spalte kann beispielsweise die Definition cost AS price * qty aufweisen. Der Ausdruck kann der Name einer nicht berechneten Spalte, eine Konstante, eine integrierte Funktion, eine Variable oder eine beliebige durch einen oder mehrere Operatoren verbundene Kombination der genannten Möglichkeiten sein.For example, a computed column can have the definition cost AS price * qty. The expression can be a noncomputed column name, constant, built-in function, variable, or any combination of these connected by one or more operators. Der Ausdruck kann keine Unterabfrage oder benutzerdefinierte Funktion sein.The expression cannot be a subquery or a user-defined function. Der Ausdruck kann nicht auf einen CLR-benutzerdefinierten Typ verweisen.The expression cannot reference a CLR user-defined type.

[ COLLATE collation_name][ COLLATE collation_name]
Gibt die Sortierung für die Spalte an.Specifies the collation for the column. Als collation_name kann entweder der Name einer Windows-Sortierung oder ein SQL-Sortierungsname verwendet werden. Dieses Element gilt nur für Spalten der Datentypen char, varchar, text, nchar, nvarchar und ntext.collation_name can be either a Windows collation name or an SQL collation name, and is applicable only for columns of the char, varchar, text, nchar, nvarchar, and ntext data types. Wenn collation_name nicht angegeben ist, wird der Spalte die Sortierung des benutzerdefinierten Datentyps zugewiesen, wenn es sich um eine Spalte von einem benutzerdefinierten Datentyp handelt, oder es wird die Sortierung der aktuellen Datenbank zugewiesen.If not specified, the column is assigned either the collation of the user-defined data type (if the column is of a user-defined data type) or the collation of the current database.

Weitere Informationen zu den Windows- und SQL-Sortierungsnamen finden Sie unter COLLATE (Transact-SQL).For more information about the Windows and SQL collation names, see COLLATE (Transact-SQL).

DEFAULTDEFAULT
Gibt den Wert an, der für die Spalte bereitgestellt wird, wenn kein Wert explizit angegeben wurde.Specifies the value provided for the column when a value is not explicitly supplied during an insert. DEFAULT-Definitionen können auf alle Spalten angewendet werden, mit Ausnahme der als timestamp definierten Spalten sowie von Spalten mit der IDENTITY-Eigenschaft.DEFAULT definitions can be applied to any columns except those defined as timestamp or those with the IDENTITY property. DEFAULT-Definitionen werden entfernt, wenn die Tabelle gelöscht wird.DEFAULT definitions are removed when the table is dropped. Es kann nur ein konstanter Wert wie eine Zeichenfolge, eine Systemfunktion, z. B. SYSTEM_USER(), oder NULL als Standardwert verwendet werden.Only a constant value, such as a character string; a system function, such as a SYSTEM_USER(); or NULL can be used as a default. Um die Kompatibilität mit früheren Versionen von SQL ServerSQL Server aufrechtzuerhalten, ist es möglich, einer DEFAULT-Definition einen Einschränkungsnamen zuzuweisen.To maintain compatibility with earlier versions of SQL ServerSQL Server, a constraint name can be assigned to a DEFAULT.

constant_expressionconstant_expression
Eine Konstante, ein NULL-Wert oder eine Systemfunktion, die bzw. der als Standardwert für die Spalte verwendet wird.Is a constant, NULL, or a system function used as the default value for the column.

IDENTITYIDENTITY
Gibt an, dass es sich bei der neuen Spalte um eine Identitätsspalte handelt.Indicates that the new column is an identity column. Wenn der Tabelle eine neue Zeile hinzugefügt wird, stellt SQL ServerSQL Server einen eindeutigen, inkrementellen Wert für die Spalte bereit.When a new row is added to the table, SQL ServerSQL Server provides a unique incremental value for the column. Identitätsspalten werden in der Regel in Verbindung mit PRIMARY KEY-Einschränkungen verwendet, um als eindeutiger Zeilenbezeichner für die Tabelle zu dienen.Identity columns are commonly used in conjunction with PRIMARY KEY constraints to serve as the unique row identifier for the table. Die IDENTITY-Eigenschaft kann folgenden Spalten zugewiesen werden: tinyint, smallint, int, decimal(p,0) oder numeric(p,0) .The IDENTITY property can be assigned to tinyint, smallint, int, decimal(p,0), or numeric(p,0) columns. Es kann nur eine Identitätsspalte pro Tabelle erstellt werden.Only one identity column can be created per table. Gebundene Standardwerte und DEFAULT-Einschränkungen können nicht mit einer Identitätsspalte verwendet werden.Bound defaults and DEFAULT constraints cannot be used with an identity column. Sie müssen entweder den Ausgangswert und den Schrittweitenwert oder keinen von beiden angeben.You must specify both the seed and increment, or neither. Wurden Ausgangswert und inkrementeller Wert nicht angegeben, ist der Standardwert (1,1).If neither is specified, the default is (1,1).

seedseed
Der Wert, der für die erste in die Tabelle geladene Zeile verwendet wird.Is the value used for the very first row loaded into the table.

incrementincrement
Der Schrittweitenwert, der zum Identitätswert der zuvor geladenen Zeile addiert wird.Is the incremental value added to the identity value of the previous row that was loaded.

ROWGUIDCOLROWGUIDCOL
Gibt an, dass die neue Spalte eine Spalte mit für alle Zeilen global eindeutigen Bezeichnern ist.Indicates that the new column is a row global unique identifier column. Nur eine uniqueidentifier-Spalte pro Tabelle kann als ROWGUIDCOL-Spalte gekennzeichnet werden.Only one uniqueidentifier column per table can be designated as the ROWGUIDCOL column. Die ROWGUIDCOL-Eigenschaft kann nur einer uniqueidentifier-Spalte zugewiesen werden.The ROWGUIDCOL property can be assigned only to a uniqueidentifier column.

NULL | NOT NULLNULL | NOT NULL
Gibt an, ob NULL in der Variablen zulässig ist.Indicates if null is allowed in the variable. Die Standardeinstellung ist NULL.The default is NULL.

PRIMARY KEYPRIMARY KEY
Eine Einschränkung, die Entitätsintegrität für eine bestimmte Spalte (oder Spalten) durch einen eindeutigen Index erzwingt.Is a constraint that enforces entity integrity for a given column or columns through a unique index. Es kann nur eine PRIMARY KEY-Einschränkung pro Tabelle erstellt werden.Only one PRIMARY KEY constraint can be created per table.

UNIQUEUNIQUE
Eine Einschränkung, die Entitätsintegrität für eine bestimmte Spalte (oder Spalten) durch einen eindeutigen Index bereitstellt.Is a constraint that provides entity integrity for a given column or columns through a unique index. Eine Tabelle kann mehrere UNIQUE-Einschränkungen haben.A table can have multiple UNIQUE constraints.

CHECKCHECK
Eine Einschränkung, die Domänenintegrität erzwingt, indem die möglichen Eingabewerte für eine oder mehrere Spalten beschränkt wird.Is a constraint that enforces domain integrity by limiting the possible values that can be entered into a column or columns.

logical_expressionlogical_expression
Ein logischer Ausdruck, der TRUE oder FALSE zurückgibt.Is a logical expression that returns TRUE or FALSE.

BemerkungenRemarks

Variablen werden oft in einem Batch oder einer Prozedur als Zähler für WHILE, LOOP oder für IF...ELSE-Blöcke verwendet.Variables are often used in a batch or procedure as counters for WHILE, LOOP, or for an IF...ELSE block.

Variablen können nur in Ausdrücken verwendet werden und stellen keinen Ersatz für Objektnamen oder Schlüsselwörter dar.Variables can be used only in expressions, not in place of object names or keywords. Um dynamische SQL-Anweisungen zu erstellen, verwenden Sie EXECUTE.To construct dynamic SQL statements, use EXECUTE.

Der Gültigkeitsbereich einer lokalen Variablen ist der Batch, in dem sie deklariert ist.The scope of a local variable is the batch in which it is declared.

Eine Tabellenvariable ist nicht zwingend speicherresident.A table variable is not necessarily memory resident. Wenn nicht genügend Speicherplatz vorhanden ist, können die Seiten, die einer Tabellenvariablen zugehörig sind, an tempdb gesendet werden.Under memory pressure, the pages belonging to a table variable can be pushed out to tempdb.

Auf eine Cursorvariable, der aktuell ein Cursor zugewiesen ist, kann in folgenden Anweisungen als Quelle verwiesen werden:A cursor variable that currently has a cursor assigned to it can be referenced as a source in a:

  • CLOSE-Anweisung.CLOSE statement.

  • DEALLOCATE-Anweisung.DEALLOCATE statement.

  • FETCH-Anweisung.FETCH statement.

  • OPEN-Anweisung.OPEN statement.

  • Positionierte DELETE- oder UPDATE-Anweisung.Positioned DELETE or UPDATE statement.

  • SET CURSOR VARIABLE-Anweisung (auf der rechten Seite).SET CURSOR variable statement (on the right side).

Bei all diesen Anweisungen wird von SQL ServerSQL Server ein Fehler ausgelöst, wenn eine Cursorvariable vorhanden ist, auf die verwiesen wird, für die aber aktuell kein Cursor zugeordnet ist.In all of these statements, SQL ServerSQL Server raises an error if a referenced cursor variable exists but does not have a cursor currently allocated to it. Ist keine Cursorvariable vorhanden, auf die verwiesen wird, wird von SQL ServerSQL Server der gleiche Fehler ausgelöst wie für eine nicht deklarierte Variable eines anderen Typs.If a referenced cursor variable does not exist, SQL ServerSQL Server raises the same error raised for an undeclared variable of another type.

Eine Cursorvariable hat folgende Eigenschaften:A cursor variable:

  • Sie kann das Ziel eines Cursortyps oder einer anderen Cursorvariablen sein.Can be the target of either a cursor type or another cursor variable. Weitere Informationen finden Sie unter SET @local_variable (Transact-SQL).For more information, see SET @local_variable (Transact-SQL).

  • Auf sie kann als Ziel eines Ausgabecursorparameters in einer EXECUTE-Anweisung verwiesen werden, wenn der Cursorvariablen aktuell kein Cursor zugewiesen ist.Can be referenced as the target of an output cursor parameter in an EXECUTE statement if the cursor variable does not have a cursor currently assigned to it.

  • Sie sollte als Zeiger auf den Cursor verstanden werden.Should be regarded as a pointer to the cursor.

BeispieleExamples

A.A. Verwenden von DECLAREUsing DECLARE

Im folgenden Beispiel werden mithilfe der lokalen Variablen @find Kontaktinformationen für alle Nachnamen abgerufen, die mit Man beginnen.The following example uses a local variable named @find to retrieve contact information for all last names beginning with Man.

USE AdventureWorks2012;  
GO  
DECLARE @find varchar(30);   
/* Also allowed:   
DECLARE @find varchar(30) = 'Man%';   
*/  
SET @find = 'Man%';   
SELECT p.LastName, p.FirstName, ph.PhoneNumber  
FROM Person.Person AS p   
JOIN Person.PersonPhone AS ph ON p.BusinessEntityID = ph.BusinessEntityID  
WHERE LastName LIKE @find;  
  

Hier ist das Resultset.Here is the result set.

LastName            FirstName               Phone
------------------- ----------------------- -------------------------
Manchepalli         Ajay                    1 (11) 500 555-0174
Manek               Parul                   1 (11) 500 555-0146
Manzanares          Tomas                   1 (11) 500 555-0178
 
(3 row(s) affected)

B.B. Verwenden von DECLARE mit zwei VariablenUsing DECLARE with two variables

Im folgenden Beispiel werden die Namen von Vertriebsmitarbeitern von Adventure Works CyclesAdventure Works Cycles abgerufen, die in der Vertriebsregion Nordamerika tätig sind und im laufenden Jahr bereits einen Umsatz von mindestens 2.000.000 USD erzielt haben.The following example retrieves the names of Adventure Works CyclesAdventure Works Cycles sales representatives who are located in the North American sales territory and have at least $2,000,000 in sales for the year.

USE AdventureWorks2012;  
GO  
SET NOCOUNT ON;  
GO  
DECLARE @Group nvarchar(50), @Sales money;  
SET @Group = N'North America';  
SET @Sales = 2000000;  
SET NOCOUNT OFF;  
SELECT FirstName, LastName, SalesYTD  
FROM Sales.vSalesPerson  
WHERE TerritoryGroup = @Group and SalesYTD >= @Sales;  

C.C. Deklarieren einer Variablen vom Typ "table"Declaring a variable of type table

Im folgenden Beispiel wird eine table-Variable erstellt, die die in der OUTPUT-Klausel der UPDATE-Anweisung angegebenen Werte speichert.The following example creates a table variable that stores the values specified in the OUTPUT clause of the UPDATE statement. Es folgen zwei SELECT-Anweisungen, die die Werte in @MyTableVar und die Ergebnisse des Updatevorgangs in der Employee-Tabelle zurückgeben.Two SELECT statements follow that return the values in @MyTableVar and the results of the update operation in the Employee table. Beachten Sie, dass sich die Ergebnisse in der INSERTED.ModifiedDate-Spalte von den Werten in der ModifiedDate-Spalte in der Employee-Tabelle unterscheiden.Note that the results in the INSERTED.ModifiedDate column differ from the values in the ModifiedDate column in the Employee table. Der Grund dafür ist, dass der AFTER UPDATE-Trigger, der den Wert von ModifiedDate auf das aktuelle Datum aktualisiert, in der Employee-Tabelle definiert wird.This is because the AFTER UPDATE trigger, which updates the value of ModifiedDate to the current date, is defined on the Employee table. Die von OUTPUT zurückgegebenen Spalten spiegeln jedoch die Daten wider, bevor Trigger ausgelöst werden.However, the columns returned from OUTPUT reflect the data before triggers are fired. Weitere Informationen finden Sie unter OUTPUT-Klausel (Transact-SQL).For more information, see OUTPUT Clause (Transact-SQL).

USE AdventureWorks2012;  
GO  
DECLARE @MyTableVar table(  
    EmpID int NOT NULL,  
    OldVacationHours int,  
    NewVacationHours int,  
    ModifiedDate datetime);  
UPDATE TOP (10) HumanResources.Employee  
SET VacationHours = VacationHours * 1.25   
OUTPUT INSERTED.BusinessEntityID,  
       DELETED.VacationHours,  
       INSERTED.VacationHours,  
       INSERTED.ModifiedDate  
INTO @MyTableVar;  
--Display the result set of the table variable.  
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate  
FROM @MyTableVar;  
GO  
--Display the result set of the table.  
--Note that ModifiedDate reflects the value generated by an  
--AFTER UPDATE trigger.  
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate  
FROM HumanResources.Employee;  
GO  

D:D. Deklarieren einer Variablen vom Typ 'user-defined table'Declaring a variable of user-defined table type

Im folgenden Beispiel wird ein Tabellenwertparameter oder eine Tabellenvariable mit dem Namen @LocationTVP erstellt.The following example creates a table-valued parameter or table variable called @LocationTVP. Dies erfordert einen entsprechenden benutzerdefinierten Tabellentyp mit dem Namen LocationTableType.This requires a corresponding user-defined table type called LocationTableType. Weitere Informationen zum Erstellen eines benutzerdefinierten Tabellentyps finden Sie unter CREATE TYPE (Transact-SQL).For more information about how to create a user-defined table type, see CREATE TYPE (Transact-SQL). Weitere Informationen zu Tabellenwertparametern finden Sie unter Use Table-Valued Parameters (Database Engine) (Verwenden von Tabellenwertparametern (Datenbank-Engine)).For more information about table-valued parameters, see Use Table-Valued Parameters (Database Engine).

DECLARE @LocationTVP   
AS LocationTableType;  

Beispiele: Azure Synapse Analytics (SQL Data Warehouse)Azure Synapse Analytics (SQL Data Warehouse) und Parallel Data WarehouseParallel Data WarehouseExamples: Azure Synapse Analytics (SQL Data Warehouse)Azure Synapse Analytics (SQL Data Warehouse) and Parallel Data WarehouseParallel Data Warehouse

E.E. Verwenden von DECLAREUsing DECLARE

Im folgenden Beispiel werden mithilfe der lokalen Variablen @find Kontaktinformationen für alle Nachnamen abgerufen, die mit Walt beginnen.The following example uses a local variable named @find to retrieve contact information for all last names beginning with Walt.

-- Uses AdventureWorks  
  
DECLARE @find varchar(30);  
/* Also allowed:   
DECLARE @find varchar(30) = 'Man%';  
*/  
SET @find = 'Walt%';  
  
SELECT LastName, FirstName, Phone  
FROM DimEmployee   
WHERE LastName LIKE @find;  

F.F. Verwenden von DECLARE mit zwei VariablenUsing DECLARE with two variables

Das folgende Beispiel ruft Variablen ab, um die Vor- und Nachnamen von Mitarbeitern in der DimEmployee-Tabelle anzugeben.The following example retrieves uses variables to specify the first and last names of employees in the DimEmployee table.

-- Uses AdventureWorks  
  
DECLARE @lastName varchar(30), @firstName varchar(30);  
  
SET @lastName = 'Walt%';  
SET @firstName = 'Bryan';  
  
SELECT LastName, FirstName, Phone  
FROM DimEmployee   
WHERE LastName LIKE @lastName AND FirstName LIKE @firstName;  

Weitere InformationenSee Also

EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
Integrierte Funktionen (Transact-SQL) Built-in Functions (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
table (Transact-SQL) table (Transact-SQL)
Vergleichen von typisiertem XML mit nicht typisiertem XMLCompare Typed XML to Untyped XML