Delen via


SET @local_variable (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-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
  • &= - Bitwise AND en toewijzen
  • ^= - Bitwise XOR en toewijzen
  • |= - Bitwise OR 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 ABSOLUTERELATIVE. PRIORNEXTLASTFIRST U kunt niet opgeven wanneer u ook opgeeft SCROLLFAST_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, KEYSETof DYNAMIC trefwoorden, wordt de cursor geïmplementeerd als DYNAMIC. Als u niet opgeeft of SCROLLals FORWARD_ONLY de standaardinstelling is, tenzij u de trefwoorden STATICopgeeftFORWARD_ONLY, KEYSETof DYNAMIC. Voor STATIC, KEYSETen 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 BROWSEen INTO zijn niet toegestaan binnen de select_statement van een cursordeclaratie.

Als u DISTINCTeen statistische expressie in de select_list gebruikt, UNIONGROUP BYof HAVINGals 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, SELECTen 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 10en 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 Pointgemaakt 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;