SET @local_variable (Transact-SQL)

Legt die angegebene lokale Variable, die zuvor mit der Anweisung DECLARE @local\_variable erstellt wurde, auf den angegebenen Wert fest.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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 [ 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 ] ] } ] 
      } 
    }
} 

Argumente

  • **@**local_variable
    Der Name einer Variablen eines beliebigen Typs außer cursor, text, ntextimage und table. Variablennamen müssen mit einem @-Zeichen beginnen. Variablennamen müssen den Regeln für Bezeichner entsprechen.

  • property_name
    Eigenschaft eines benutzerdefinierten Typs.

  • field_name
    Öffentliches Feld eines benutzerdefinierten Typs.

  • udt_name
    Der Name eines benutzerdefinierten CLR (Common Language Runtime)-Typs.

  • { . | :: }
    Gibt eine Methode für einen benutzerdefinierten CLR-Typ an. Verwenden Sie für eine Instanzmethode (nicht statisch) einen Punkt (.). Verwenden Sie für eine statische Methode zwei Doppelpunkte (::). Um eine Methode, eine Eigenschaft oder ein Feld eines benutzerdefinierten CLR-Typs aufzurufen, müssen Sie über die EXECUTE-Berechtigung für den entsprechenden Typ verfügen.

  • method_name**(**argument [ ,... n ] )
    Eine Methode eines benutzerdefinierten Typs, der ein oder mehrere Argumente übergeben werden, um den Status einer Instanz eines Typs zu ändern. Statische Methoden müssen öffentlich sein.

  • **@**SQLCLR_local_variable
    Eine Variable, deren Typ sich in einer Assembly befindet. Weitere Informationen finden Sie unter Programmierkonzepte für die Common Language Runtime (CLR)-Integration.

  • mutator_method
    Ist eine Methode in der Assembly, die den Status des Objekts ändern kann. SQLMethodAttribute.IsMutator wird für diese Methode angewendet.

  • { += | -= | *= | /= | %= | &= | ^= | |= }
    Verbundzuweisungsoperator:

    += Addition und Zuweisung

    -= Subtraktion und Zuweisung

    *= Multiplikation und Zuweisung

    /= Division und Zuweisung

    %= Modulo und Zuweisung

    &= Bitweises AND und Zuweisung

    ^= Bitweises XOR und Zuweisung

    |= Bitweises OR und Zuweisung

  • expression
    Ein gültiger Ausdruck.

  • cursor_variable
    Der Name einer Cursorvariablen. Wenn die Zielcursorvariable zuvor auf einen anderen Cursor verwiesen hat, wird dieser Verweis entfernt.

  • cursor_name
    Der Name eines Cursors, der mit der DECLARE CURSOR-Anweisung deklariert wurde.

  • CURSOR
    Gibt an, dass die SET-Anweisung eine Cursordeklaration enthält.

  • SCROLL
    Gibt an, dass der Cursor alle FETCH-Optionen unterstützt (FIRST, LAST, NEXT, PRIOR, RELATIVE und ABSOLUTE). Es kann nur eine der beiden Optionen SCROLL oder FAST_FORWARD angegeben werden.

  • FORWARD_ONLY
    Gibt an, dass der Cursor nur die Option FETCH NEXT unterstützt. Der Cursor kann nur in einer Richtung abgerufen werden, von der ersten zur letzten Zeile. Wenn FORWARD_ONLY ohne die Schlüsselwörter STATIC, KEYSET oder DYNAMIC angegeben wird, wird der Cursor mit der Option DYNAMIC implementiert. Wenn weder FORWARD_ONLY noch SCROLL angegeben wird, wird standardmäßig FORWARD_ONLY verwendet, es sei denn, die Schlüsselwörter STATIC, KEYSET oder DYNAMIC werden angegeben. STATIC-, KEYSET- und DYNAMIC-Cursor werden standardmäßig auf SCROLL festgelegt.

    HinweisHinweis

    In SQL Server 2000 schließen sich die Cursoroptionen FAST_FORWARD und FORWARD_ONLY gegenseitig aus. Wird eine Option angegeben, kann die andere nicht angegeben werden, und es wird ein Fehler ausgegeben. Beide Schlüsselwörter können in der gleichen DECLARE CURSOR-Anweisung verwendet werden.

  • STATIC
    Definiert einen Cursor, der eine temporäre Kopie der von ihm zu verwendenden Daten erzeugt. Sämtliche Anforderungen an den Cursor werden von dieser temporären Tabelle in tempdb beantwortet; daher werden Änderungen, die an den Basistabellen vorgenommen werden, nicht in den Daten wiedergegeben, die durch Abrufoperationen an diesem Cursor zurückgegeben wurden. Darüber hinaus lässt dieser Cursor keine Änderungen zu.

  • KEYSET
    Gibt an, dass im Cursor die Mitgliedschaft und die Reihenfolge der Zeilen fest sind, wenn der Cursor geöffnet wird. Die Menge der Schlüssel, die die Zeilen eindeutig identifizieren, wird in der keyset-Tabelle in tempdb erstellt. Ä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 scrollt. Von anderen Benutzern vorgenommene Einfügungen sind nicht sichtbar, und Einfügevorgänge können nicht über einen Transact-SQL-Servercursor durchgeführt werden.

    Wenn eine Zeile gelöscht wird, wird bei einem Versuch, die Zeile abzurufen, @@FETCH_STATUS mit dem Wert -2 zurückgegeben. Aktualisierungen von Schlüsselwerten von außerhalb des Cursors sind vergleichbar mit einem Löschen der alten Zeile, gefolgt von einem Einfügen der neuen Zeile. Die Zeile mit den neuen Werten ist nicht sichtbar, und bei Versuchen, die Zeile mit den alten Werten abzurufen, wird @@FETCH_STATUS mit dem Wert -2 zurückgegeben. Die neuen Werte sind sichtbar, wenn die Aktualisierung über den Cursor durch Angeben der WHERE CURRENT OF-Klausel durchgeführt wird.

  • DYNAMIC
    Definiert einen Cursor, der alle in den Zeilen vorgenommenen Datenänderungen in seinem Resultset widerspiegelt, wenn der Cursorbesitzer im Cursor scrollt. Datenwerte, Reihenfolge und Mitgliedschaft der Zeilen können sich bei jeder Abrufoperation ändern. Die Abrufoptionen FETCH RELATIVE und FETCH ABSOLUTE werden mit dynamischen Cursors nicht unterstützt.

  • FAST_FORWARD
    Gibt einen FORWARD_ONLY-, READ_ONLY-Cursor mit aktivierter Optimierung an. Es kann nur eine der beiden Optionen SCROLL oder FAST_FORWARD angegeben werden.

    HinweisHinweis

    In SQL Server 2000 schließen sich die Cursoroptionen FAST_FORWARD und FORWARD_ONLY gegenseitig aus. Wird eine Option angegeben, kann die andere nicht angegeben werden, und es wird ein Fehler ausgegeben. Beide Schlüsselwörter können in der gleichen DECLARE CURSOR-Anweisung verwendet werden.

  • READ_ONLY
    Verhindert, dass Aktualisierungen über diesen Cursor erfolgen. Auf den Cursor kann nicht in einer WHERE CURRENT OF-Klausel in einer UPDATE- oder DELETE-Anweisung verwiesen werden. Diese Option setzt die Standardeinstellung außer Kraft, nach der ein Cursor aktualisiert werden kann.

  • SCROLL LOCKS
    Gibt an, dass positionierte Aktualisierungen oder Löschvorgänge über den Cursor mit Sicherheit erfolgreich verlaufen. SQL Server sperrt die Zeilen, die in den Cursor gelesen werden, um ihre Verfügbarkeit für spätere Änderungen sicherzustellen. Es kann nur eine der beiden Optionen SCROLL_LOCKS oder FAST_FORWARD angegeben werden.

  • OPTIMISTIC
    Gibt an, dass positionierte Aktualisierungen oder Löschvorgänge über den Cursor nicht erfolgreich verlaufen, wenn die Zeile aktualisiert wurde, nachdem sie in den Cursor gelesen wurde. SQL Server sperrt keine Zeilen, die in den Cursor gelesen 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 erzeugt die versuchte positionierte Aktualisierung oder Löschung einen Fehler. Es kann nur eine der beiden Optionen OPTIMISTIC oder FAST_FORWARD angegeben werden.

  • TYPE_WARNING
    Gibt an, dass dem Client eine Warnmeldung gesendet wird, wenn der Cursor implizit vom angeforderten Typ in einen anderen Typ konvertiert wird.

  • FOR select_statement
    Eine standardmäßige SELECT-Anweisung, die das Resultset des Cursors definiert. Bei der Deklaration eines Cursors sind die Schlüsselwörter COMPUTE, COMPUTE BY, FOR BROWSE und INTO innerhalb von select_statement nicht zulässig.

    Wenn DISTINCT, UNION, GROUP BY oder HAVING verwendet werden oder ein Aggregatausdruck in select_list eingeschlossen ist, wird der Cursor als STATIC erstellt.

    Wenn keine der zugrunde liegenden Tabellen einen eindeutigen Index besitzt und ein SCROLL-Cursor von ISO oder ein KEYSET-Cursor von Transact-SQL angefordert wird, liegt automatisch ein STATIC-Cursor vor.

    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 – falls ein KEYSET-Cursor nicht geöffnet werden kann – in einen STATIC-Cursor konvertiert. Ebenso wird mit einem Cursor verfahren, der mithilfe der ISO-Syntax, jedoch ohne das STATIC-Schlüsselwort, definiert wurde.

  • READ ONLY
    Verhindert, dass Aktualisierungen über diesen Cursor erfolgen. Auf den Cursor kann nicht in einer WHERE CURRENT OF-Klausel in einer UPDATE- oder DELETE-Anweisung verwiesen werden. Diese Option setzt die Standardeinstellung außer Kraft, nach der ein Cursor aktualisiert werden kann. Dieses Schlüsselwort unterscheidet sich vom vorherigen READ_ONLY durch das Leerzeichen zwischen READ und ONLY anstelle eines Unterstrichs.

  • 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 wurde mit der Option READ_ONLY definiert.

Hinweise

Nach dem Deklarieren einer Variablen wird diese auf NULL initialisiert. Verwenden Sie die SET-Anweisung, um einer deklarierten Variablen einen anderen Wert als NULL zuzuweisen. 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.

Variablen können nur in Ausdrücken verwendet werden, nicht anstelle von Objektnamen oder Schlüsselwörtern. Um dynamische Transact-SQL-Anweisungen zu erstellen, verwenden Sie EXECUTE.

Die Syntaxregeln für SET **@**cursor_variable schließen nicht die Schlüsselwörter LOCAL und GLOBAL ein. Wenn die Syntax SET **@**cursor_variable = CURSOR... verwendet wird, wird der Cursor je nach Einstellung der Datenbankoption default to local cursor als GLOBAL oder LOCAL erstellt.

Cursorvariablen sind stets lokal, selbst wenn sie auf einen globalen Cursor verweisen. Wenn eine Cursorvariable auf einen globalen Cursor verweist, verfügt der Cursor über einen globalen und einen lokalen Cursorverweis. Weitere Informationen finden Sie unter Beispiel C.

Weitere Informationen finden Sie unter DECLARE CURSOR (Transact-SQL).

Der Verbundzuweisungsoperator kann stets verwendet werden, wenn auf der rechten Seite des Operators eine Zuweisung mit einem Ausdruck steht, z. B. Variablen, und SET in einer UPDATE-, SELECT- oder RECEIVE-Anweisung vorhanden ist.

Berechtigungen

Erfordert die Mitgliedschaft in der public-Rolle. Alle Benutzer können SET **@**local_variable verwenden.

Beispiele

A. Drucken des Werts einer Variablen, die mit SET initialisiert wurde

Im folgenden Beispiel wird die @myvar-Variable erstellt, der Variablen ein Zeichenfolgenwert zugewiesen 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, der ein Wert mit SET zugewiesen wurde, in einer SELECT-Anweisung

Im folgenden Beispiel wird eine lokale Variable mit dem Namen @state erstellt, die dann in einer SELECT-Anweisung verwendet wird, um die Vor- und Nachnamen aller im US-Bundesstaat Oregon ansässigen Mitarbeiter zu suchen.

USE AdventureWorks;
GO
DECLARE @state char(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;

C. Verwenden einer Verbundzuweisung 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  @NewBalance;

/* Example Two */
DECLARE @NewBalance int = 10;
SET @NewBalance *= 10;
SELECT @NewBalance;

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; 
--There is now only a LOCAL variable reference
--(@my_variable) to the my_cursor cursor.

E. Definieren eines Cursors mit SET

Im folgenden Beispiel wird die SET-Anweisung zum Definieren eines Cursors verwendet.

DECLARE @CursorVar CURSOR;

SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM AdventureWorks.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;

F. Zuweisen eines Werts aus einer Abfrage

Im folgenden Beispiel wird eine Abfrage verwendet, um einer Variablen einen Wert zuzuweisen.

USE AdventureWorks;
GO
DECLARE @rows int;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;

G. Zuweisen eines Werts zu einer Variablen mit einem benutzerdefinierten Typ 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

H. Zuweisen eines Werts zu einer Variablen mit einem benutzerdefinierten Typ 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);

Änderungsverlauf

Aktualisierter Inhalt

Es wurden @SQLCLR_local_variable.mutator_method im Abschnitt zur Syntax und Beschreibungen für die Variablen im Abschnitt zu Argumenten hinzugefügt.

Beispiel I wurde hinzugefügt.