Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Magazyn w usłudze Microsoft Fabric
Baza 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 -
&=
- BitoweAND
i przypisywane -
^=
- BitoweXOR
i przypisywane -
|=
- BitoweOR
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
, NEXT
PRIOR
, , RELATIVE
i 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_ONLY
STATIC
bez słów kluczowych , KEYSET
lub 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
, KEYSET
lub DYNAMIC
.
KEYSET
W 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_ONLY
READ_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 BROWSE
i INTO
nie są dozwolone w select_statement deklaracji kursora.
Jeśli używasz DISTINCT
wyrażenia agregacji , , UNION
GROUP BY
lub 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
, SELECT
i 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 (LastName
FirstName
) 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;