Udostępnij za pośrednictwem


SET @local_variable (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricMagazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric (wersja zapoznawcza)

Ustawia określoną zmienną lokalną, wcześniej utworzoną przy użyciu instrukcji DECLARE @local_variable , na określoną wartość.

Transact-SQL konwencje składni

Syntax

Składnia dla programu SQL Server, usługi Azure SQL Database i usługi 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 ] ] } ]
      }
    }
}

Składnia dla usług Azure Synapse Analytics i Parallel Data Warehouse i Microsoft Fabric:

SET @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression

Arguments

@local_variable

Nazwa zmiennej dowolnego typu z wyjątkiem kursora, tekstu, ntekstu, obrazu lub tabeli. Nazwy zmiennych muszą zaczynać się od jednej pod znakiem (@). Nazwy zmiennych muszą być zgodne z regułami dotyczącymi identyfikatorów.

property_name

Właściwość typu zdefiniowanego przez użytkownika.

field_name

Pole publiczne typu zdefiniowanego przez użytkownika.

udt_name

Nazwa typu środowiska uruchomieniowego języka wspólnego (CLR) zdefiniowanego przez użytkownika.

{ . | :: }

Określa metodę typu definiowanego przez użytkownika środowiska CLR. W przypadku metody wystąpienia (niestatyczne) użyj kropki (.). W przypadku metody statycznej użyj dwóch dwukropków (::). Aby wywołać metodę, właściwość lub pole typu zdefiniowanego przez użytkownika CLR, musisz mieć uprawnienie EXECUTE dla typu .

method_name ( argument [ ,... n ] )

Metoda typu zdefiniowanego przez użytkownika, która przyjmuje jeden lub więcej argumentów w celu zmodyfikowania stanu wystąpienia typu. Metody statyczne muszą być publiczne.

@SQLCLR_local_variable

Zmienna, której typ znajduje się w zestawie. Aby uzyskać więcej informacji, zobacz Pojęcia dotyczące programowania integracji środowiska uruchomieniowego języka wspólnego (CLR).

mutator_method

Metoda w zestawie, która może zmienić stan obiektu. Metoda SQLMethodAttribute.IsMutator jest stosowana do tej metody.

{ += | -= | *= | /= | %= | &= | ^= | |= }

Operator przypisania złożonego:

  • += - Dodawanie i przypisywanie
  • -= - Odejmij i przypisz
  • *= - Mnożenie i przypisywanie
  • /= - Dzielenie i przypisywanie
  • %= - Modulo i przypisz
  • &= - Bitowe AND i przypisywane
  • ^= - Bitowe XOR i przypisywane
  • |= - Bitowe OR i przypisywane

expression

Dowolne prawidłowe wyrażenie.

cursor_variable

Nazwa zmiennej kursora. Jeśli docelowa zmienna kursora wcześniej odwołuje się do innego kursora, to poprzednie odwołanie zostanie usunięte.

cursor_name

Nazwa kursora zadeklarowanego przy użyciu instrukcji DECLARE CURSOR .

CURSOR

Określa, że SET instrukcja zawiera deklarację kursora.

SCROLL

Określa, że kursor obsługuje wszystkie opcje pobierania: FIRST, , LAST, NEXTPRIOR, , RELATIVEi ABSOLUTE. Nie można określić SCROLL , kiedy określisz również wartość FAST_FORWARD.

FORWARD_ONLY

Określa, że kursor obsługuje tylko FETCH NEXT opcję. Kursor jest pobierany tylko w jednym kierunku od pierwszego do ostatniego wiersza. Po określeniu FORWARD_ONLYSTATICbez słów kluczowych , KEYSETlub DYNAMIC kursor jest implementowany jako DYNAMIC. Jeśli nie określisz wartości FORWARD_ONLY lub SCROLL, FORWARD_ONLY jest wartością domyślną, chyba że określisz słowa kluczowe STATIC, KEYSETlub DYNAMIC. KEYSETW przypadku STATIC, i DYNAMIC kursorów SCROLL jest wartością domyślną.

STATIC

Definiuje kursor, który tworzy tymczasową kopię danych, która ma być używana przez kursor. Wszystkie żądania do kursora są odbierane z tej tabeli tymczasowej w pliku tempdb. W związku z tym modyfikacje wprowadzone w tabelach podstawowych po otwarciu kursora nie są odzwierciedlane w danych zwracanych przez pobieranie do kursora. I ten kursor nie obsługuje modyfikacji.

KEYSET

Określa, że członkostwo i kolejność wierszy w kursorze są stałe po otwarciu kursora. Zestaw kluczy, które jednoznacznie identyfikują wiersze, jest wbudowany w element keysettable w pliku tempdb. Zmiany wartości innych niżkey w tabelach podstawowych wprowadzone przez właściciela kursora lub zatwierdzone przez innych użytkowników są widoczne, gdy właściciel kursora przewija kursor. Wstawki dokonane przez innych użytkowników nie są widoczne, a wstawki nie mogą być wykonywane za pomocą kursora serwera Transact-SQL.

Jeśli wiersz zostanie usunięty, próba pobrania wiersza zwróci wartość typu @@FETCH_STATUS-2. Aktualizacje wartości kluczy spoza kursora są podobne do usunięcia starego wiersza, po którym następuje wstawianie nowego wiersza. Wiersz z nowymi wartościami nie jest widoczny i próbuje pobrać wiersz ze starymi wartościami zwraca wartość @@FETCH_STATUS-2. Nowe wartości są widoczne, jeśli aktualizacja odbywa się za pośrednictwem kursora, określając klauzulę WHERE CURRENT OF .

DYNAMIC

Definiuje kursor, który odzwierciedla wszystkie zmiany danych wprowadzone w wierszach w zestawie wyników, gdy właściciel kursora przewija kursor. Wartości danych, kolejność i członkostwo wierszy mogą ulec zmianie w każdym pobraniu. Opcje pobierania bezwzględnego i względnego nie są obsługiwane w przypadku kursorów dynamicznych.

FAST_FORWARD

Określa FORWARD_ONLYREAD_ONLY kursor z włączonymi optymalizacjami. FAST_FORWARD Nie można określić, kiedy SCROLL jest również określony.

READ_ONLY

Uniemożliwia tworzenie aktualizacji za pośrednictwem tego kursora. Nie można odwołać się do kursora w klauzuli WHERE CURRENT OF w instrukcji UPDATE or DELETE . Ta opcja zastępuje domyślną możliwość aktualizowania kursora.

SCROLL LOCKS

Określa, że aktualizacje lub usunięcia umieszczone za pośrednictwem kursora mają gwarancję powodzenia. Program SQL Server blokuje wiersze podczas odczytywania kursora w celu zagwarantowania dostępności późniejszych modyfikacji. Nie można określić SCROLL_LOCKS , kiedy FAST_FORWARD jest również określony.

OPTIMISTIC

Określa, że umieszczone aktualizacje lub usunięcia wykonane za pośrednictwem kursora nie powiedzie się, jeśli wiersz został zaktualizowany od czasu odczytu do kursora. Program SQL Server nie blokuje wierszy, ponieważ są one odczytywane do kursora. Zamiast tego używa porównań wartości kolumn sygnatury czasowej lub wartości sumy kontrolnej, jeśli tabela nie ma kolumny znacznika czasu, aby określić, czy wiersz został zmodyfikowany po odczytaniu kursora. Jeśli wiersz został zmodyfikowany, próba aktualizacji lub usunięcia nie powiedzie się. Nie można określić OPTIMISTIC , kiedy FAST_FORWARD jest również określony.

TYPE_WARNING

Określa, że komunikat ostrzegawczy jest wysyłany do klienta, gdy kursor jest niejawnie konwertowany z żądanego typu na inny.

FOR select_statement

Standardowa SELECT instrukcja, która definiuje zestaw wyników kursora. Słowa kluczowe FOR BROWSEi INTO nie są dozwolone w select_statement deklaracji kursora.

Jeśli używasz DISTINCTwyrażenia agregacji , , UNIONGROUP BYlub HAVING, lub dołączysz wyrażenie agregacji w select_list, kursor zostanie utworzony jako STATIC.

Jeśli każda tabela bazowa nie ma unikatowego indeksu i kursora ISO SCROLL lub jeśli zażądano Transact-SQL KEYSET kursora, kursor jest automatycznie kursorem STATIC .

Jeśli select_statement zawiera klauzulę ORDER BY , w której kolumny nie są unikatowymi identyfikatorami wierszy, DYNAMIC kursor jest konwertowany na KEYSET kursor lub kursor STATIC , jeśli KEYSET nie można otworzyć kursora. Ten proces występuje również dla kursora zdefiniowanego przy użyciu składni ISO, ale bez słowa kluczowego STATIC .

READ ONLY

Uniemożliwia tworzenie aktualizacji za pośrednictwem tego kursora. Nie można odwołać się do kursora w klauzuli WHERE CURRENT OF w instrukcji UPDATE or DELETE . Ta opcja zastępuje domyślną możliwość aktualizowania kursora. To słowo kluczowe różni się od wcześniejszego READ_ONLY , mając spację zamiast podkreślenia między READ i ONLY.

UPDATE [ OF column_name [ ,... n ] ]

Definiuje kolumny z możliwością aktualizowania w obrębie kursora. Jeśli OF <column_name> [ , ...n ] zostanie podany, tylko kolumny wymienione zezwalają na modyfikacje. Jeśli lista nie zostanie podana, wszystkie kolumny można zaktualizować, chyba że kursor jest zdefiniowany jako READ_ONLY.

Remarks

Po zadeklarowaniu zmiennej jest inicjowana na NULL. Użyj instrukcji , SET aby przypisać wartość, która nie NULL jest zadeklarowaną zmienną. Instrukcja SET , która przypisuje wartość do zmiennej, zwraca pojedynczą wartość. Podczas inicjowania wielu zmiennych należy użyć oddzielnej SET instrukcji dla każdej zmiennej lokalnej.

Zmienne można używać tylko w wyrażeniach, a nie zamiast nazw obiektów ani słów kluczowych. Aby utworzyć instrukcje dynamiczne Transact-SQL, użyj polecenia EXECUTE.

Mimo że reguły składni dla SET @cursor_variable słów kluczowych i GLOBAL są używaneLOCAL, gdy używasz SET @cursor_variable = CURSOR... składni, kursor jest tworzony jako GLOBAL lub LOCAL, w zależności od ustawienia domyślnej opcji lokalnej bazy danych kursora.

Zmienne kursora są zawsze lokalne, nawet jeśli odwołują się do kursora globalnego. Gdy zmienna kursora odwołuje się do kursora globalnego, kursor ma zarówno globalne, jak i lokalne odwołanie kursora. Aby uzyskać więcej informacji , zobacz Przykład D, Używanie zestawu z kursorem globalnym.

Aby uzyskać więcej informacji, zobacz DEKLAROWANIE KURSORa (Transact-SQL).

Możesz użyć operatora przypisania złożonego w dowolnym miejscu, w którym masz przypisanie z wyrażeniem po prawej stronie operatora, w tym zmiennych i SET w instrukcji UPDATE, SELECTi RECEIVE .

Nie używaj zmiennej w SELECT instrukcji do łączenia wartości (czyli do obliczania wartości zagregowanych). Mogą wystąpić nieoczekiwane wyniki zapytania, ponieważ wszystkie wyrażenia na SELECT liście (w tym przypisania) nie muszą być uruchamiane dokładnie raz dla każdego wiersza wyjściowego. Aby uzyskać więcej informacji, zobacz kb 287515.

Permissions

Wymaga członkostwa w roli publicznej. Wszyscy użytkownicy mogą używać polecenia SET @local_variable.

Examples

Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2022 lub AdventureWorksDW2022, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.

A. Drukowanie wartości zmiennej zainicjowanej przy użyciu zestawu

Poniższy przykład tworzy zmienną @myVar , umieszcza wartość ciągu w zmiennej i drukuje wartość zmiennej @myVar .

DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT @myVar;
GO

B. Używanie zmiennej lokalnej przypisanej wartości przy użyciu instrukcji SET w instrukcji SELECT

Poniższy przykład tworzy zmienną lokalną o nazwie @state i używa zmiennej lokalnej w instrukcji , SELECT aby znaleźć imię (FirstName) i nazwę rodziny (LastName) wszystkich pracowników, którzy mieszkają w stanie 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. Używanie przypisania złożonego dla zmiennej lokalnej

W poniższych dwóch przykładach przedstawiono ten sam wynik. Każdy przykład tworzy zmienną lokalną o nazwie @NewBalance, mnoży ją przez 10, a następnie wyświetla nową wartość zmiennej lokalnej w instrukcji SELECT . W drugim przykładzie użyto operatora przypisania złożonego.

/* 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. Używanie funkcji SET z kursorem globalnym

Poniższy przykład tworzy zmienną lokalną, a następnie ustawia zmienną kursora na nazwę kursora globalnego.

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. Definiowanie kursora przy użyciu zestawu

W poniższym przykładzie użyto instrukcji SET w celu zdefiniowania kursora.

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. Przypisywanie wartości z zapytania

W poniższym przykładzie użyto zapytania w celu przypisania wartości do zmiennej.

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

G. Przypisywanie wartości do zmiennej typu zdefiniowanej przez użytkownika przez zmodyfikowanie właściwości typu

W poniższym przykładzie ustawiono wartość typu zdefiniowanego przez użytkownika (UDT), Point modyfikując wartość właściwości X typu.

DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO

Dowiedz się więcej na temat tworzenia Point funkcji UDT, do których odwołuje się ten przykład, i poniższych przykładów w artykule Creating User-Defined Types (Tworzenie typów User-Defined).

H. Przypisywanie wartości do zmiennej typu zdefiniowanej przez użytkownika przez wywołanie metody typu

W poniższym przykładzie ustawiono wartość punktu typu zdefiniowanego przez użytkownika przez wywołanie metody SetXY typu.

DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);

I. Tworzenie zmiennej dla typu CLR i wywoływanie metody mutatora

Poniższy przykład tworzy zmienną dla typu Point, a następnie wykonuje metodę mutatora w pliku Point.

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);

Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)

Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2022 lub AdventureWorksDW2022, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.

J. Drukowanie wartości zmiennej zainicjowanej przy użyciu zestawu

Poniższy przykład tworzy zmienną @myVar , umieszcza wartość ciągu w zmiennej i drukuje wartość zmiennej @myVar .

DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT TOP 1 @myVar FROM sys.databases;

K. Używanie zmiennej lokalnej przypisanej wartości przy użyciu instrukcji SET w instrukcji SELECT

Poniższy przykład tworzy zmienną lokalną o nazwie @dept i używa tej zmiennej lokalnej w instrukcji , SELECT aby znaleźć imię () i nazwisko (LastNameFirstName) wszystkich pracowników pracujących w Marketing dziale.

DECLARE @dept CHAR(25);
SET @dept = N'Marketing';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name
FROM DimEmployee
WHERE DepartmentName = @dept;

L. Używanie przypisania złożonego dla zmiennej lokalnej

W poniższych dwóch przykładach przedstawiono ten sam wynik. Tworzą zmienną lokalną o nazwie @NewBalance, mnożą ją 10 i wyświetlają nową wartość zmiennej lokalnej w instrukcji SELECT . W drugim przykładzie użyto operatora przypisania złożonego.

/* 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. Przypisywanie wartości z zapytania

W poniższym przykładzie użyto zapytania w celu przypisania wartości do zmiennej.

-- Uses AdventureWorks

DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM dbo.DimCustomer);
SELECT TOP 1 @rows FROM sys.tables;