SET @local_variable (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
Legt die angegebene lokale Variable, die zuvor mithilfe der DECLARE @local_variable
Anweisung erstellt wurde, auf den angegebenen Wert fest.
Transact-SQL-Syntaxkonventionen
Syntax
Syntax für SQL Server, Azure SQL Database und Azure SQL Managed Instance:
SET
{ @local_variable
[ . { property_name | field_name } ] = { expression | udt_name { . | :: } method_name }
}
| { @SQLCLR_local_variable.mutator_method }
| { @local_variable
{ += | -= | *= | /= | %= | &= | ^= | |= } expression
}
| { @cursor_variable =
{ @cursor_variable | cursor_name
| { CURSOR [ [ LOCAL | GLOBAL ] ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ , ...n ] ] } ]
}
}
}
Syntax für Azure Synapse Analytics, Parallel Data Warehouse und Microsoft Fabric:
SET @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression
Argumente
@local_variable
Der Name einer Variablen eines beliebigen Typs mit Ausnahme von cursor, text, ntext, image oder table. Variablennamen müssen mit einem at-Zeichen ( @
) beginnen. Variablennamen müssen die Regeln für Bezeichner erfüllen.
property_name
Eigenschaft eines benutzerdefinierten Typs.
field_name
Öffentliches Feld eines benutzerdefinierten Typs.
udt_name
Der Name eines benutzerdefinierten CLR-Typs (Common Language Runtime).
{ . | :: }
Gibt eine Methode für einen benutzerdefinierten CLR-Typ an. Verwenden Sie für eine Instanz (nicht statische) Methode einen Punkt (.
). Verwenden Sie für eine statische Methode zwei Doppelpunkte (::
). Zum Aufrufen einer Methode, Eigenschaft oder eines Felds eines CLR-benutzerdefinierten Typs müssen Sie über die EXECUTE-Berechtigung für den Typ verfügen.
method_name ( Argument [ ,... n ] )
Methode eines benutzerdefinierten Typs, die ein oder mehrere Argumente umfassen kann, um den Status einer Instanz eines Typs zu ändern. Statische Methoden müssen öffentlich sein.
@SQLCLR_local_variable
Variable, deren Typ sich in einer Assembly befindet. Weitere Informationen finden Sie unter ClR-Integrationsprogrammierungskonzepte (Common Language Runtime).
mutator_method
Methode in der Assembly, die den Status des Objekts ändern kann. SQLMethodAttribute.IsMutator wird für diese Methode angewendet.
{ += | -= | *= | /= | %= | &= | ^= | |= }
Verbundzuweisungsoperator:
+=
– Hinzufügen und Zuweisen-=
- Subtrahieren und Zuweisen*=
- Multiplizieren und Zuweisen/=
- Dividieren und Zuweisen%=
- Modulo und Zuweisen&=
- BitweiseAND
und Zuweisen^=
- BitweiseXOR
und Zuweisen|=
- BitweiseOR
und Zuweisen
expression
Beliebiger gültiger Ausdruck.
cursor_variable
Der Name einer Cursorvariablen. Falls die Zielcursorvariable zuvor auf einen anderen Cursor verwiesen hat, wird dieser Verweis entfernt.
cursor_name
Der Name eines Cursors, der mithilfe der DECLARE CURSOR
Anweisung deklariert wird.
CURSOR
Gibt an, dass die SET
Anweisung eine Deklaration eines Cursors enthält.
SCROLL
Gibt an, dass der Cursor alle Abrufoptionen unterstützt: FIRST
, , LAST
, NEXT
, , PRIOR
, und RELATIVE
ABSOLUTE
. Sie können nicht angeben SCROLL
, wann Sie auch angeben FAST_FORWARD
.
FORWARD_ONLY
Gibt an, dass der Cursor nur die FETCH NEXT
Option unterstützt. Der Cursor wird nur in einer Richtung abgerufen, von der ersten zur letzten Zeile. Wenn Sie ohne die , oder Schlüsselwörter angebenFORWARD_ONLY
, wird der Cursor als DYNAMIC
implementiert.DYNAMIC
KEYSET
STATIC
Wenn Sie weder angeben FORWARD_ONLY
SCROLL
noch , FORWARD_ONLY
ist die Standardeinstellung, es sei denn, Sie geben die Schlüsselwörter STATIC
, , KEYSET
oder DYNAMIC
. Für STATIC
, KEYSET
und DYNAMIC
Cursor SCROLL
ist die Standardeinstellung.
STATIC
Definiert einen Cursor, der eine temporäre Kopie der von ihm zu verwendenden Daten erzeugt. Alle Anforderungen an den Cursor werden von dieser temporären Tabelle in tempdb
beantwortet. Daher werden nach der Öffnung des Cursors die an den Basistabellen vorgenommenen Änderungen in den Daten, die durch Abrufvorgänge an den Cursor zurückgegeben werden, nicht reflektiert. Außerdem unterstützt dieser Cursor keine Änderungen.
KEYSET
Gibt an, dass im Cursor die Mitgliedschaft und Reihenfolge der Zeilen fest ist, wenn der Cursor geöffnet wird. Der Satz von Schlüsseln, die die Zeilen eindeutig identifizieren, ist in die Keysettable integriert in tempdb
. Änderungen an Nichtschlüsselwerten in den Basistabellen, die vom Cursorbesitzer oder durch Ausführen eines Commits von anderen Benutzern vorgenommen wurden, werden sichtbar, wenn der Cursorbesitzer im Cursor einen Bildlauf durchführt. Von anderen Benutzern vorgenommene Einfügungen sind nicht sichtbar, und Einfügungen können nicht über einen Transact-SQL-Server-Cursor vorgenommen werden.
Wenn eine Zeile gelöscht wird, wird versucht, die Zeile abzurufen, eine @@FETCH_STATUS
von -2
. Updates von Schlüsselwerten außerhalb des Cursors sind vergleichbar mit dem Löschen der alten Zeile und dem anschließenden Einfügen der neuen Zeile. Die Zeile mit den neuen Werten ist nicht sichtbar und versucht, die Zeile mit den alten Werten abzurufen.@@FETCH_STATUS
-2
Die neuen Werte sind sichtbar, wenn die Aktualisierung durch den Cursor erfolgt, indem sie die WHERE CURRENT OF
Klausel angeben.
DYNAMIC
Definiert einen Cursor, der alle in den Zeilen vorgenommenen Datenänderungen in seinem Resultset widerspiegelt, wenn der Cursorbesitzer im Cursor einen Bildlauf durchführt. Datenwerte, Reihenfolge und Mitgliedschaft der Zeilen können sich bei jedem Abrufvorgang ändern. Die Abrufoptionen FETCH RELATIVE und FETCH ABSOLUTE werden mit dynamischen Cursorn nicht unterstützt.
FAST_FORWARD
Gibt einen FORWARD_ONLY
Cursor READ_ONLY
mit aktivierten Optimierungen an. FAST_FORWARD
kann nicht angegeben werden, wenn SCROLL
auch angegeben wird.
READ_ONLY
Verhindert, dass Updates über diesen Cursor erfolgen. Auf den Cursor kann in einer Klausel in einer WHERE CURRENT OF
UPDATE
Oder-Anweisung DELETE
nicht verwiesen werden. Diese Option überschreibt die Standardeinstellung, nach der ein Cursor aktualisiert werden kann.
SCROLL LOCKS
Gibt an, dass positionierte Updates oder Löschungen durch den Cursor garantiert erfolgreich sind. SQL Server sperrt die Zeilen, während sie in den Cursor eingelesen werden, um ihre Verfügbarkeit für spätere Änderungen sicherzustellen. Sie können nicht angeben SCROLL_LOCKS
, wann FAST_FORWARD
auch angegeben wird.
OPTIMISTIC
Gibt an, dass positionierte Updates oder Löschungen durch den Cursor nicht erfolgreich sind, wenn die Zeile seit dem letzten Einlesen in den Cursor aktualisiert wurde. SQL Server sperrt keine Zeilen, während sie in den Cursor eingelesen werden. Stattdessen wird durch Vergleiche von timestamp-Spaltenwerten (oder durch einen Prüfsummenwert, wenn die Tabelle keine timestamp-Spalte aufweist) bestimmt, ob die Zeile nach dem Einlesen in den Cursor geändert wurde. Wurde die Zeile geändert, so schlägt der versuchte positionierte Update- oder Löschvorgang fehl. Sie können nicht angeben OPTIMISTIC
, wann FAST_FORWARD
auch angegeben wird.
TYPE_WARNING
Gibt an, dass dem Client eine Warnmeldung gesendet wird, wenn der Cursor vom angeforderten Typ in einen anderen Typ implizit konvertiert wird.
FOR select_statement
Eine Standard-Anweisung SELECT
, die den Resultset des Cursors definiert. Die Schlüsselwörter FOR BROWSE
und INTO
sind innerhalb der select_statement einer Cursordeklaration nicht zulässig.
Wenn Sie einen Aggregatausdruck in das select_list verwendenDISTINCT
GROUP BY
UNION
, wird HAVING
der Cursor als .STATIC
Wenn jede zugrunde liegende Tabelle keinen eindeutigen Index und einen ISO-Cursor SCROLL
enthält oder wenn ein Transact-SQL-Cursor KEYSET
angefordert wird, ist der Cursor automatisch ein STATIC
Cursor.
Wenn select_statement eine ORDER BY
Klausel enthält, in der die Spalten keine eindeutigen Zeilenbezeichner sind, wird ein DYNAMIC
Cursor in einen KEYSET
Cursor oder in einen STATIC
Cursor konvertiert, wenn ein KEYSET
Cursor nicht geöffnet werden kann. Dieser Vorgang tritt auch für einen Cursor auf, der mithilfe der ISO-Syntax definiert wird, aber ohne das STATIC
Schlüsselwort.
READ ONLY
Verhindert, dass Updates über diesen Cursor erfolgen. Auf den Cursor kann in einer Klausel in einer WHERE CURRENT OF
UPDATE
Oder-Anweisung DELETE
nicht verwiesen werden. Diese Option überschreibt die Standardeinstellung, nach der ein Cursor aktualisiert werden kann. Dieses Schlüsselwort unterscheidet sich von der vorherigenREAD_ONLY
, indem anstelle eines Unterstrichs ein Leerzeichen vorhanden READ
ist.ONLY
UPDATE [ OF column_name [ ,... n ] ]
Definiert aktualisierbare Spalten innerhalb des Cursors. Wenn OF <column_name> [ , ...n ]
angegeben wird, können Änderungen nur in den aufgelisteten Spalten vorgenommen werden. Wenn keine Liste angegeben wird, können alle Spalten aktualisiert werden, es sei denn, der Cursor ist definiert als READ_ONLY
.
Hinweise
Nachdem eine Variable deklariert wurde, wird sie initialisiert in NULL
. Verwenden Sie die SET
Anweisung, um einen Wert zuzuweisen, der keiner NULL
deklarierten Variablen entspricht. Die SET
Anweisung, die der Variablen einen Wert zuweist, gibt einen einzelnen Wert zurück. Wenn Sie mehrere Variablen initialisieren, verwenden Sie eine separate SET
Anweisung für jede lokale Variable.
Sie können Variablen nur in Ausdrücken verwenden, nicht anstelle von Objektnamen oder Schlüsselwörtern. Verwenden Sie EXECUTE
zum Erstellen dynamischer Transact-SQL-Anweisungen .
Obwohl Syntaxregeln zum SET @cursor_variable
Einschließen der LOCAL
Syntax und GLOBAL
schlüsselwörter verwendet werden, SET @cursor_variable = CURSOR...
wird der Cursor je nach Einstellung der Standardoption für die lokale Cursordatenbank erstellt GLOBAL
LOCAL
oder verwendet.
Cursorvariablen sind stets lokal, selbst wenn sie auf einen globalen Cursor verweisen. Wenn eine Cursorvariable auf einen globalen Cursor verweist, besitzt der Cursor einen globalen und einen lokalen Verweis. Weitere Informationen finden Sie unter Beispiel D, Verwenden von SET mit einem globalen Cursor.
Weitere Informationen finden Sie unter DECLARE CURSOR (Transact-SQL).
Sie können den zusammengesetzten Zuordnungsoperator überall verwenden, wo Sie über eine Zuordnung mit einem Ausdruck auf der rechten Seite des Operators verfügen, einschließlich Variablen und einer SET
in einem , SELECT
und RECEIVE
einer UPDATE
Anweisung.
Verwenden Sie keine Variable in einer SELECT
Anweisung, um Werte zu verketten (d. h. zum Berechnen von Aggregatwerten). Unerwartete Abfrageergebnisse können auftreten, da alle Ausdrücke in der SELECT
Liste (einschließlich Zuweisungen) nicht unbedingt einmal für jede Ausgabezeile ausgeführt werden. Weitere Informationen finden Sie unter KB 287515.
Berechtigungen
Erfordert die Mitgliedschaft in der public -Rolle. Alle Benutzer können verwenden SET @local_variable
.
Beispiele
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.
A. Drucken des Werts einer Variablen, die mithilfe von SET initialisiert wird
Im folgenden Beispiel wird die @myVar
-Variable erstellt, ein Zeichenfolgenwert in die Variable aufgenommen und der Wert der @myVar
-Variablen ausgedruckt.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT @myVar;
GO
B. Verwenden einer lokalen Variablen, die einem Wert zugewiesen wurde, mithilfe von SET in einer SELECT-Anweisung
Das folgende Beispiel erstellt eine lokale Variable namens @state
und verwendet die lokale Variable in einer SELECT
Anweisung, um den Vornamen (FirstName
) und den Familiennamen (LastName
) aller Mitarbeiter zu finden, die im Status von Oregon
.
USE AdventureWorks2022;
GO
DECLARE @state CHAR(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;
GO
C. Verwenden einer zusammengesetzten Zuordnung für eine lokale Variable
Mit den beiden folgenden Beispielen wird das gleiche Ergebnis erzielt. Jedes Beispiel erstellt eine lokale Variable namens @NewBalance
, multipliziert sie mit 10
, und zeigt dann den neuen Wert der lokalen Variablen in einer SELECT
Anweisung an. Im zweiten Beispiel wird ein Verbundzuweisungsoperator verwendet.
/* Example one */
DECLARE @NewBalance INT;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT @NewBalance;
GO
/* Example Two */
DECLARE @NewBalance INT = 10;
SET @NewBalance *= 10;
SELECT @NewBalance;
GO
D: Verwenden von SET mit einem globalen Cursor
Im folgenden Beispiel wird eine lokale Variable erstellt und anschließend für die Cursorvariable der globale Cursorname festgelegt.
DECLARE my_cursor CURSOR GLOBAL
FOR SELECT * FROM Purchasing.ShipMethod
DECLARE @my_variable CURSOR ;
SET @my_variable = my_cursor ;
--There is a GLOBAL cursor declared(my_cursor) and a LOCAL variable
--(@my_variable) set to the my_cursor cursor.
DEALLOCATE my_cursor;
GO
--There is now only a LOCAL variable reference
--(@my_variable) to the my_cursor cursor.
E. Definieren eines Cursors mithilfe von SET
Dieses Beispiel verwendet die SET
-Anweisung, um einen Cursor zu definieren.
DECLARE @CursorVar CURSOR;
SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM AdventureWorks2022.HumanResources.vEmployee
WHERE LastName like 'B%';
OPEN @CursorVar;
FETCH NEXT FROM @CursorVar;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM @CursorVar
END;
CLOSE @CursorVar;
DEALLOCATE @CursorVar;
GO
F. Zuweisen eines Werts aus einer Abfrage
Das folgende Beispiel verwendet eine Abfrage, um einer Variablen einen Wert zuzuweisen.
USE AdventureWorks2022;
GO
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;
GO
G. Zuweisen eines Werts zu einer benutzerdefinierten Typvariablen durch Ändern einer Eigenschaft des Typs
Im folgenden Beispiel wird ein Wert für den benutzerdefinierten Typ Point
festgelegt, indem der Wert der X
-Eigenschaft des Typs geändert wird.
DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO
Erfahren Sie mehr über das Erstellen des Point
UDT-Verweises in diesem Beispiel und die folgenden Beispiele im Artikel Erstellen User-Defined Typen.
H. Zuweisen eines Werts zu einer benutzerdefinierten Typvariablen durch Aufrufen einer Methode des Typs
Im folgenden Beispiel wird ein Wert für den benutzerdefinierten Typ point durch Aufrufen der SetXY
-Methode des Typs festgelegt.
DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);
I. Erstellen einer Variablen für einen CLR-Typ und Aufrufen einer Mutatormethode
Im folgenden Beispiel wird eine Variable für den Typ Point
erstellt und anschließend eine Mutatormethode in Point
ausgeführt.
CREATE ASSEMBLY mytest FROM 'c:\test.dll' WITH PERMISSION_SET = SAFE
CREATE TYPE Point EXTERNAL NAME mytest.Point
GO
DECLARE @p Point = CONVERT(Point, '')
SET @p.SetXY(22, 23);
Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)
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.
J. Drucken des Werts einer Variablen, die mithilfe von SET initialisiert wird
Im folgenden Beispiel wird die @myVar
-Variable erstellt, ein Zeichenfolgenwert in die Variable aufgenommen und der Wert der @myVar
-Variablen ausgedruckt.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT TOP 1 @myVar FROM sys.databases;
K. Verwenden einer lokalen Variablen, die einem Wert zugewiesen wurde, mithilfe von SET in einer SELECT-Anweisung
Im folgenden Beispiel wird eine lokale Variable namens erstellt @dept
und diese lokale Variable in einer SELECT
Anweisung verwendet, um den Vornamen (FirstName
) und den Familiennamen (LastName
) aller Mitarbeiter zu finden, die in der Marketing
Abteilung arbeiten.
DECLARE @dept CHAR(25);
SET @dept = N'Marketing';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name
FROM DimEmployee
WHERE DepartmentName = @dept;
L. Verwenden einer zusammengesetzten Zuordnung für eine lokale Variable
Mit den beiden folgenden Beispielen wird das gleiche Ergebnis erzielt. Es wird jeweils eine lokale Variable mit dem Namen @NewBalance
erstellt, diese wird mit 10
multipliziert, und der neue Wert der lokalen Variablen wird in einer SELECT
-Anweisung angezeigt. Im zweiten Beispiel wird ein Verbundzuweisungsoperator verwendet.
/* Example one */
DECLARE @NewBalance INT;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT TOP 1 @NewBalance
FROM sys.tables;
/* Example Two */
DECLARE @NewBalance INT = 10;
SET @NewBalance *= 10;
SELECT TOP 1 @NewBalance
FROM sys.tables;
M. Zuweisen eines Werts aus einer Abfrage
Das folgende Beispiel verwendet eine Abfrage, um einer Variablen einen Wert zuzuweisen.
-- Uses AdventureWorks
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM dbo.DimCustomer);
SELECT TOP 1 @rows FROM sys.tables;