SELECT @local_variable (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric SQL-Datenbank in Microsoft Fabric SQL in Microsoft Fabric
Legt eine lokale Variable auf den Wert eines Ausdrucks fest.
Zum Zuweisen von Variablen empfiehlt es sich, dass Sie SET @local_variable anstelle von SELECT @local_variable verwenden.
Transact-SQL-Syntaxkonventionen
Syntax
SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
[ ,...n ] [ ; ]
Argumente
@local_variable
Eine deklarierte Variable, der ein Wert zugewiesen werden soll.
{ } =
| +=
| -=
| *=
| /=
| %=
| &=
| ^=
| |=
Den Wert auf der rechten Seite der Variablen auf der linken Seite zuweisen.
Verbundzuweisungsoperator:
Operator | Aktion |
---|---|
= | Weist der Variable den darauf folgenden Ausdruck zu. |
+= | Addition und Zuweisung |
-= | Subtraktion und Zuweisung |
*= | Multiplikation und Zuweisung |
/= | Division und Zuweisung |
%= | Modulo und Zuweisung |
&= | Bitweises UND und Zuweisung |
^= | Bitweises XOR und Zuweisung |
|= | Bitweises OR und Zuweisung |
expression
Beliebiger gültiger Ausdruck. Er enthält eine skalare Unterabfrage.
Bemerkungen
SELECT @local_variable dient in der Regel dazu, einen einzelnen Wert in die Variable zurückzugeben. Wenn es sich bei expression jedoch um den Namen einer Spalte handelt, können auch mehrere Werte zurückgegeben werden. Falls die SELECT-Anweisung mehr als einen Wert zurückgibt, wird der Variablen der zuletzt zurückgegebene Wert zugewiesen.
Wenn die SELECT-Anweisung keine Zeilen zurückgibt, behält die Variable ihren derzeitigen Wert bei. Ist expression eine skalare Unterabfrage, die keinen Wert zurückgibt, wird die Variable auf NULL festgelegt.
Eine SELECT-Anweisung kann mehrere lokale Variablen initialisieren.
Hinweis
Eine SELECT-Anweisung, die eine Variablenzuweisung enthält, kann nicht zugleich zur Durchführung der normalen Abrufvorgänge für Resultsets verwendet werden.
Beispiele
A. Verwenden von SELECT @local_variable zum Zurückgeben eines einzelnen Wertes
Das folgende Beispiel weist der Variable @var1
den Wert „Generic Name“ (generischer Name) zu. Die Abfrage der Tabelle Store
gibt keine Zeilen zurück, da der für CustomerID
angegebene Wert nicht in der Tabelle enthalten ist. Die Variable behält den Wert „Generic Name“ bei.
In diesem Beispiel wird die Beispieldatenbank AdventureWorksLT
verwendet. Weitere Informationen finden Sie unter AdventureWorks-Beispieldatenbanken. Die Datenbank AdventureWorksLT
wird als Beispieldatenbank für Azure SQL-Datenbank verwendet.
-- Uses AdventureWorks2022LT
DECLARE @var1 VARCHAR(30);
SELECT @var1 = 'Generic Name';
SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000; --Value does not exist
SELECT @var1 AS 'ProductName';
Hier sehen Sie das Ergebnis.
ProductName
------------------------------
Generic Name
B. Verwenden von SELECT @local_variable zum Zurückgeben von NULL
Das folgende Beispiel weist der Variable @var1
mithilfe einer Unterabfrage einen Wert zu. Da der für CustomerID
angeforderte Wert nicht vorhanden ist, gibt die Unterabfrage keinen Wert zurück, und die Variable wird auf NULL
festgelegt.
In diesem Beispiel wird die Beispieldatenbank AdventureWorksLT
verwendet. Weitere Informationen finden Sie unter AdventureWorks-Beispieldatenbanken. Die Datenbank AdventureWorksLT
wird als Beispieldatenbank für Azure SQL-Datenbank verwendet.
-- Uses AdventureWorksLT
DECLARE @var1 VARCHAR(30);
SELECT @var1 = 'Generic Name';
SELECT @var1 = (SELECT [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000); --Value does not exist
SELECT @var1 AS 'Company Name';
Hier sehen Sie das Ergebnis.
Company Name
----------------------------
NULL
C. Antimusterverwendung der rekursiven Variablenzuweisung
Vermeiden Sie das folgende Muster für die rekursive Verwendung von Variablen und Ausdrücken:
SELECT @Var = <expression containing @Var>
FROM
...
In diesem Fall kann nicht garantiert werden, dass @Var
zeilenweise aktualisiert wird. Beispielsweise kann @Var
auf den ursprünglichen Wert @Var
für alle Zeilen festgelegt werden. Dies liegt daran, dass die Reihenfolge und Häufigkeit, in der die Zuweisungen verarbeitet werden, nicht determinant sind. Dies gilt für Ausdrücke mit variablen Zeichenfolgenverkettungen, wie unten gezeigt, aber auch für Ausdrücke mit Nicht-Zeichenfolgenvariablen oder „+=“-Formatoperatoren. Verwenden Sie stattdessen Aggregationsfunktionen für einen setbasierten Vorgang anstelle eines Zeile-für-Zeile-Vorgangs.
Erwägen Sie für die Zeichenfolgenverkettung stattdessen die STRING_AGG
-Funktion, die in SQL Server 2017 (14.x) eingeführt wurde, für Szenarios, in denen eine geordnete Zeichenfolgenverkettung gewünscht ist. Weitere Informationen finden Sie unter STRING_AGG (Transact-SQL).
Die Transact-SQL-Codebeispiele in diesem Artikel verwenden die AdventureWorks2022
- oder AdventureWorksDW2022
-Beispieldatenbank, die Sie von der Homepage Microsoft SQL Server Samples and Community Projects herunterladen können.
Das folgende Beispiel sollte vermieden werden, da die ORDER BY-Klausel verwendet wird, um Verkettungen zu ordnen, und dies dazu führen kann, dass die Liste unvollständig ist:
DECLARE @List AS nvarchar(max);
SELECT @List = CONCAT(COALESCE(@List + ', ',''), p.LastName)
FROM Person.Person AS p
WHERE p.FirstName = 'William'
ORDER BY p.BusinessEntityID;
SELECT @List;
Resultset:
(No column name)
---
Walker
Gehen Sie stattdessen wie folgt vor:
DECLARE @List AS nvarchar(max);
SELECT @List = STRING_AGG(p.LastName,', ') WITHIN GROUP (ORDER BY p.BusinessEntityID)
FROM Person.Person AS p
WHERE p.FirstName = 'William';
SELECT @List;
Resultset:
(No column name)
---
Vong, Conner, Hapke, Monroe, Richter, Sotelo, Vong, Ngoh, White, Harris, Martin, Thompson, Martinez, Robinson, Clark, Rodriguez, Smith, Johnson, Williams, Jones, Brown, Davis, Miller, Moore, Taylor, Anderson, Thomas, Lewis, Lee, Walker
Siehe auch
- DECLARE @local_variable (Transact-SQL)
- Ausdrücke (Transact-SQL)
- Verbundoperatoren (Transact-SQL)
- SELECT (Transact-SQL)