Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric Preview
Hiermee stelt u de opgegeven lokale variabele, die eerder is gemaakt met behulp van de DECLARE @local_variable
instructie, in op de opgegeven waarde.
Transact-SQL syntaxis-conventies
Syntax
Syntaxis voor SQL Server, Azure SQL Database en 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 ] ] } ]
}
}
}
Syntaxis voor Azure Synapse Analytics en Parallel Data Warehouse en Microsoft Fabric:
SET @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression
Arguments
@local_variable
De naam van een variabele van elk type, behalve cursor, tekst, ntext, afbeelding of tabel. Namen van variabelen moeten beginnen met een bijteken (@
). Namen van variabelen moeten de regels voor id's volgen.
property_name
Een eigenschap van een door de gebruiker gedefinieerd type.
field_name
Een openbaar veld van een door de gebruiker gedefinieerd type.
udt_name
De naam van een door de gebruiker gedefinieerd type common language runtime (CLR).
{ . | :: }
Hiermee geeft u een methode van een CLR-type gebruiker definiëren. Gebruik een punt (.
) voor een instantiemethode (niet-statisch). Gebruik voor een statische methode twee dubbele punten (::
). Als u een methode, eigenschap of veld van een door de gebruiker gedefinieerd CLR-type wilt aanroepen, moet u de machtiging EXECUTE hebben voor het type.
method_name ( argument [ ,... n ] )
Een methode van een door de gebruiker gedefinieerd type dat een of meer argumenten nodig heeft om de status van een exemplaar van een type te wijzigen. Statische methoden moeten openbaar zijn.
@SQLCLR_local_variable
Een variabele waarvan het type zich in een assembly bevindt. Zie Common Language Runtime (CLR)-integratieconcepten voor meer informatie.
mutator_method
Een methode in de assembly die de status van het object kan wijzigen. SQLMethodAttribute.IsMutator wordt toegepast op deze methode.
{ += | -= | *= | /= | %= | &= | ^= | |= }
Operator voor samengestelde toewijzing:
-
+=
- Toevoegen en toewijzen -
-=
- Aftrekken en toewijzen -
*=
- Vermenigvuldigen en toewijzen -
/=
- Delen en toewijzen -
%=
- Modulo en toewijzen -
&=
- BitwiseAND
en toewijzen -
^=
- BitwiseXOR
en toewijzen -
|=
- BitwiseOR
en toewijzen
expression
Elke geldige expressie.
cursor_variable
De naam van een cursorvariabele. Als de doelcursorvariabele eerder naar een andere cursor verwijst, wordt die vorige verwijzing verwijderd.
cursor_name
De naam van een cursor die is gedeclareerd met behulp van de DECLARE CURSOR
instructie.
CURSOR
Hiermee geeft u op dat de SET
instructie een declaratie van een cursor bevat.
SCROLL
Hiermee geeft u op dat de cursor alle ophaalopties ondersteunt: , , , , en ABSOLUTE
RELATIVE
. PRIOR
NEXT
LAST
FIRST
U kunt niet opgeven wanneer u ook opgeeft SCROLL
FAST_FORWARD
.
FORWARD_ONLY
Hiermee geeft u op dat de cursor alleen de FETCH NEXT
optie ondersteunt. De cursor wordt slechts in één richting opgehaald, van de eerste naar de laatste rij. Wanneer u opgeeft FORWARD_ONLY
zonder de STATIC
, KEYSET
of DYNAMIC
trefwoorden, wordt de cursor geïmplementeerd als DYNAMIC
. Als u niet opgeeft of SCROLL
als FORWARD_ONLY
de standaardinstelling is, tenzij u de trefwoorden STATIC
opgeeftFORWARD_ONLY
, KEYSET
of DYNAMIC
. Voor STATIC
, KEYSET
en DYNAMIC
cursors is SCROLL
de standaardwaarde.
STATIC
Hiermee definieert u een cursor waarmee een tijdelijke kopie van de gegevens wordt gebruikt door de cursor. Alle aanvragen voor de cursor worden beantwoord vanuit deze tijdelijke tabel in tempdb
. Als gevolg hiervan worden wijzigingen die zijn aangebracht in de basistabellen nadat de cursor is geopend, niet doorgevoerd in de gegevens die worden geretourneerd door opgehaalde gegevens naar de cursor. En deze cursor biedt geen ondersteuning voor wijzigingen.
KEYSET
Hiermee geeft u op dat het lidmaatschap en de volgorde van rijen in de cursor worden hersteld wanneer de cursor wordt geopend. De set sleutels waarmee de rijen uniek worden geïdentificeerd, is ingebouwd in de sleutelsettable in tempdb
. Wijzigingen in niet-sleutelwaarden in de basistabellen, gemaakt door de eigenaar van de cursor of doorgevoerd door andere gebruikers, zijn zichtbaar wanneer de cursoreigenaar rond de cursor schuift. Invoegen die door andere gebruikers zijn gemaakt, zijn niet zichtbaar en invoegingen kunnen niet worden aangebracht via een Transact-SQL servercursor.
Als een rij wordt verwijderd, retourneert een poging om de rij op te halen een @@FETCH_STATUS
van -2
. Updates van sleutelwaarden van buiten de cursor zijn vergelijkbaar met het verwijderen van de oude rij, gevolgd door een invoeging van de nieuwe rij. De rij met de nieuwe waarden is niet zichtbaar en probeert de rij op te halen met de oude waarden als resultaat.@@FETCH_STATUS
-2
De nieuwe waarden zijn zichtbaar als de update via de cursor plaatsvindt door de WHERE CURRENT OF
component op te geven.
DYNAMIC
Hiermee definieert u een cursor die alle wijzigingen in de gegevens in de rijen in de resultatenset weergeeft wanneer de eigenaar van de cursor rond de cursor schuift. De gegevenswaarden, volgorde en lidmaatschap van de rijen kunnen worden gewijzigd bij elke ophaalopdracht. De absolute en relatieve ophaalopties worden niet ondersteund met dynamische cursors.
FAST_FORWARD
Hiermee geeft u een FORWARD_ONLY
, READ_ONLY
cursor met optimalisaties ingeschakeld.
FAST_FORWARD
kan niet worden opgegeven wanneer SCROLL
ook wordt opgegeven.
READ_ONLY
Hiermee voorkomt u dat updates via deze cursor worden uitgevoerd. Er kan niet naar de cursor worden verwezen in een WHERE CURRENT OF
component in een UPDATE
of DELETE
instructie. Met deze optie wordt de standaardmogelijkheid van een cursor overschreven die moet worden bijgewerkt.
SCROLL LOCKS
Hiermee geeft u op dat geplaatste updates of verwijderingen die via de cursor zijn aangebracht, gegarandeerd slagen. SQL Server vergrendelt de rijen terwijl ze worden gelezen in de cursor om de beschikbaarheid te garanderen voor latere wijzigingen. U kunt niet opgeven SCROLL_LOCKS
wanneer FAST_FORWARD
ook wordt opgegeven.
OPTIMISTIC
Hiermee geeft u op dat geplaatste updates of verwijderingen die via de cursor zijn aangebracht, niet slagen als de rij is bijgewerkt sinds ze in de cursor worden gelezen. SQL Server vergrendelt geen rijen terwijl ze in de cursor worden gelezen. In plaats daarvan worden vergelijkingen gebruikt van tijdstempelkolomwaarden of een controlesomwaarde, als de tabel geen tijdstempelkolom heeft, om te bepalen of de rij is gewijzigd nadat deze in de cursor is gelezen. Als de rij is gewijzigd, mislukt de geprobeerde update of verwijdering. U kunt niet opgeven OPTIMISTIC
wanneer FAST_FORWARD
ook wordt opgegeven.
TYPE_WARNING
Hiermee geeft u op dat een waarschuwingsbericht naar de client wordt verzonden wanneer de cursor impliciet wordt geconverteerd van het aangevraagde type naar een ander type.
FOR select_statement
Een standaardinstructie SELECT
waarmee de resultatenset van de cursor wordt gedefinieerd. De trefwoorden FOR BROWSE
en INTO
zijn niet toegestaan binnen de select_statement van een cursordeclaratie.
Als u DISTINCT
een statistische expressie in de select_list gebruikt, UNION
GROUP BY
of HAVING
als u een samenvoegingsexpressie opneemt, wordt de cursor gemaakt als STATIC
.
Als elke onderliggende tabel geen unieke index en een ISO-cursor SCROLL
heeft of als er een Transact-SQL KEYSET
cursor wordt aangevraagd, is de cursor automatisch een STATIC
cursor.
Als select_statement een ORDER BY
component bevat waarin de kolommen geen unieke rij-id's zijn, wordt een DYNAMIC
cursor geconverteerd naar een KEYSET
cursor of naar een STATIC
cursor als een KEYSET
cursor niet kan worden geopend. Dit proces vindt ook plaats voor een cursor die is gedefinieerd met behulp van ISO-syntaxis, maar zonder het STATIC
trefwoord.
READ ONLY
Hiermee voorkomt u dat updates via deze cursor worden uitgevoerd. Er kan niet naar de cursor worden verwezen in een WHERE CURRENT OF
component in een UPDATE
of DELETE
instructie. Met deze optie wordt de standaardmogelijkheid van een cursor overschreven die moet worden bijgewerkt. Dit trefwoord verschilt van het vorige READ_ONLY
door een spatie te hebben in plaats van een onderstrepingsteken tussen READ
en ONLY
.
UPDATE [ VAN column_name [ ,... n ] ]
Hiermee definieert u de kolommen die kunnen worden bijgewerkt binnen de cursor. Als OF <column_name> [ , ...n ]
deze optie is opgegeven, staan alleen de vermelde kolommen wijzigingen toe. Wanneer er geen lijst wordt opgegeven, kunnen alle kolommen worden bijgewerkt, tenzij de cursor is gedefinieerd als READ_ONLY
.
Remarks
Nadat een variabele is gedeclareerd, wordt deze geïnitialiseerd naar NULL
. Gebruik de SET
instructie om een waarde toe te wijzen die niet NULL
aan een gedeclareerde variabele is. De SET
instructie waarmee een waarde aan de variabele wordt toegewezen, retourneert één waarde. Wanneer u meerdere variabelen initialiseert, gebruikt u een afzonderlijke SET
instructie voor elke lokale variabele.
U kunt variabelen alleen gebruiken in expressies, niet in plaats van objectnamen of trefwoorden. Als u dynamische Transact-SQL-instructies wilt maken, gebruikt u EXECUTE
.
Hoewel syntaxisregels voor SET @cursor_variable
het opnemen van de LOCAL
en GLOBAL
trefwoorden, wanneer u de SET @cursor_variable = CURSOR...
syntaxis gebruikt, de cursor wordt gemaakt als GLOBAL
of LOCAL
, afhankelijk van de instelling van de standaardinstelling voor de lokale cursordatabaseoptie.
Cursorvariabelen zijn altijd lokaal, zelfs als ze verwijzen naar een globale cursor. Wanneer een cursorvariabele verwijst naar een globale cursor, heeft de cursor zowel een globale als een lokale cursorverwijzing. Zie Voorbeeld D, SET gebruiken met een globale cursor voor meer informatie.
Zie DECLARE CURSOR (Transact-SQL)voor meer informatie.
U kunt de operator voor samengestelde toewijzing overal gebruiken waar u een toewijzing hebt met een expressie aan de rechterkant van de operator, inclusief variabelen, en een SET
in een UPDATE
, SELECT
en RECEIVE
instructie.
Gebruik geen variabele in een SELECT
instructie om waarden samen te voegen (dat wil zeggen om geaggregeerde waarden te berekenen). Onverwachte queryresultaten kunnen optreden omdat alle expressies in de SELECT
lijst (inclusief toewijzingen) niet per se één keer worden uitgevoerd voor elke uitvoerrij. Zie KB-287515 voor meer informatie.
Permissions
Vereist lidmaatschap van de openbare rol. Alle gebruikers kunnen gebruiken SET @local_variable
.
Examples
De codevoorbeelden in dit artikel gebruiken de AdventureWorks2022
of AdventureWorksDW2022
voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .
A. De waarde van een variabele afdrukken die is geïnitialiseerd met behulp van SET
In het volgende voorbeeld wordt de @myVar
variabele gemaakt, wordt een tekenreekswaarde in de variabele opgenomen en wordt de waarde van de @myVar
variabele afgedrukt.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT @myVar;
GO
B. Een lokale variabele gebruiken waaraan een waarde is toegewezen met BEHULP van SET in een SELECT-instructie
In het volgende voorbeeld wordt een lokale variabele gemaakt met de naam @state
en wordt de lokale variabele in een SELECT
instructie gebruikt om de voornaam (FirstName
) en de familienaam (LastName
) te vinden van alle werknemers die in de staat van 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. Een samengestelde toewijzing gebruiken voor een lokale variabele
De volgende twee voorbeelden produceren hetzelfde resultaat. Elk voorbeeld maakt een lokale variabele met de naam @NewBalance
, vermenigvuldigt deze met 10
en geeft vervolgens de nieuwe waarde van de lokale variabele in een SELECT
instructie weer. In het tweede voorbeeld wordt een samengestelde toewijzingsoperator gebruikt.
/* 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. SET gebruiken met een globale cursor
In het volgende voorbeeld wordt een lokale variabele gemaakt en wordt de cursorvariabele vervolgens ingesteld op de naam van de globale cursor.
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. Een cursor definiëren met BEHULP van SET
In het volgende voorbeeld wordt de SET
instructie gebruikt om een cursor te definiëren.
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. Een waarde uit een query toewijzen
In het volgende voorbeeld wordt een query gebruikt om een waarde toe te wijzen aan een variabele.
USE AdventureWorks2022;
GO
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;
GO
G. Een waarde toewijzen aan een door de gebruiker gedefinieerde typevariabele door een eigenschap van het type te wijzigen
In het volgende voorbeeld wordt een waarde ingesteld voor door de gebruiker gedefinieerd type (UDT) Point
door de waarde van de eigenschap X
van het type te wijzigen.
DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO
Meer informatie over het maken van de Point
UDT waarnaar in dit voorbeeld wordt verwezen en de volgende voorbeelden in het artikel Creating User-Defined Types.
H. Een waarde toewijzen aan een door de gebruiker gedefinieerde typevariabele door een methode van het type aan te roepen
In het volgende voorbeeld wordt een waarde ingesteld voor door de gebruiker gedefinieerd typepunt door de methode SetXY
van het type aan te roepen.
DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);
I. Een variabele maken voor een CLR-type en het aanroepen van een mutatormethode
In het volgende voorbeeld wordt een variabele voor het type Point
gemaakt en wordt vervolgens een mutatormethode uitgevoerd in 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);
Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)
De codevoorbeelden in dit artikel gebruiken de AdventureWorks2022
of AdventureWorksDW2022
voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .
J. De waarde van een variabele afdrukken die is geïnitialiseerd met behulp van SET
In het volgende voorbeeld wordt de @myVar
variabele gemaakt, wordt een tekenreekswaarde in de variabele opgenomen en wordt de waarde van de @myVar
variabele afgedrukt.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT TOP 1 @myVar FROM sys.databases;
K. Een lokale variabele gebruiken waaraan een waarde is toegewezen met BEHULP van SET in een SELECT-instructie
In het volgende voorbeeld wordt een lokale variabele gemaakt met de naam @dept
en wordt deze lokale variabele gebruikt in een SELECT
instructie om de voornaam (FirstName
) en de familienaam (LastName
) te vinden van alle werknemers die op de Marketing
afdeling werken.
DECLARE @dept CHAR(25);
SET @dept = N'Marketing';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name
FROM DimEmployee
WHERE DepartmentName = @dept;
L. Een samengestelde toewijzing gebruiken voor een lokale variabele
De volgende twee voorbeelden produceren hetzelfde resultaat. Ze maken een lokale variabele met de naam @NewBalance
, vermenigvuldigt deze met 10
en geeft de nieuwe waarde van de lokale variabele weer in een SELECT
instructie. In het tweede voorbeeld wordt een samengestelde toewijzingsoperator gebruikt.
/* 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. Een waarde uit een query toewijzen
In het volgende voorbeeld wordt een query gebruikt om een waarde toe te wijzen aan een variabele.
-- Uses AdventureWorks
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM dbo.DimCustomer);
SELECT TOP 1 @rows FROM sys.tables;