Dela via


SET @local_variable (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Anger den angivna lokala variabeln, som tidigare skapades med hjälp av -instruktionen DECLARE @local_variable , till det angivna värdet.

Transact-SQL syntaxkonventioner

Syntax

Syntax för SQL Server, Azure SQL Database och 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 ] ] } ]
      }
    }
}

Syntax för Azure Synapse Analytics och Parallel Data Warehouse och Microsoft Fabric:

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

Arguments

@local_variable

Namnet på en variabel av alla typer utom markör, text, ntext, bild eller tabell. Variabelnamn måste börja med ett vid tecknet (@). Variabelnamn måste följa reglerna för identifierare.

property_name

En egenskap av en användardefinierad typ.

field_name

Ett offentligt fält av en användardefinierad typ.

udt_name

Namnet på en clr-användardefinierad typ (Common Language Runtime).

{ . | :: }

Anger en metod av en CLR-användardefinierad typ. För en instansmetod (icke-statisk) använder du en punkt (.). För en statisk metod använder du två kolon (::). Om du vill anropa en metod, egenskap eller ett fält av en användardefinierad CLR-typ måste du ha behörigheten EXECUTE för typen.

method_name ( argument [ ,... n ] )

En metod av en användardefinierad typ som tar ett eller flera argument för att ändra tillståndet för en instans av en typ. Statiska metoder måste vara offentliga.

@SQLCLR_local_variable

En variabel vars typ finns i en sammansättning. Mer information finns i Common language runtime (CLR) integration programming concepts (Common language runtime) integration programming concepts (Common language runtime, CLR).

mutator_method

En metod i sammansättningen som kan ändra objektets tillstånd. SQLMethodAttribute.IsMutator tillämpas på den här metoden.

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

Sammansatt tilldelningsoperator:

  • += – Lägg till och tilldela
  • -= – Subtrahera och tilldela
  • *= – Multiplicera och tilldela
  • /= – Dela upp och tilldela
  • %= – Modulo och tilldela
  • &= – Bitvis AND och tilldela
  • ^= – Bitvis XOR och tilldela
  • |= – Bitvis OR och tilldela

expression

Valfritt giltigt uttryck.

cursor_variable

Namnet på en markörvariabel. Om målmarkörvariabeln tidigare refererade till en annan markör tas den föregående referensen bort.

cursor_name

Namnet på en markör som deklareras med hjälp av -instruktionen DECLARE CURSOR .

CURSOR

Anger att -instruktionen SET innehåller en deklaration av en markör.

SCROLL

Anger att markören stöder alla hämtningsalternativ: FIRST, LAST, NEXT, PRIOR, RELATIVEoch ABSOLUTE. Du kan inte ange SCROLL när du också anger FAST_FORWARD.

FORWARD_ONLY

Anger att markören endast FETCH NEXT stöder alternativet. Markören hämtas bara i en riktning, från den första till den sista raden. När du anger FORWARD_ONLY utan nyckelorden STATIC, KEYSET, eller DYNAMIC implementeras markören som DYNAMIC. Om du inte anger antingen FORWARD_ONLY eller SCROLL, FORWARD_ONLY är standardvärdet, såvida du inte anger nyckelorden STATIC, KEYSETeller DYNAMIC. För STATIC, KEYSEToch DYNAMIC markörer SCROLL är standardvärdet.

STATIC

Definierar en markör som gör en tillfällig kopia av data som ska användas av markören. Alla begäranden till markören besvaras från den här temporära tabellen i tempdb. Det innebär att ändringar som gjorts i bastabellerna när markören har öppnats inte återspeglas i de data som returneras av hämtningar som gjorts till markören. Och den här markören stöder inte ändringar.

KEYSET

Anger att medlemskapet och ordningen på raderna i markören korrigeras när markören öppnas. Den uppsättning nycklar som unikt identifierar raderna är inbyggd i nyckeluppsättningstabellen i tempdb. Ändringar av icke-nyckelvärden i bastabellerna, antingen gjorda av markörens ägare eller utförda av andra användare, visas när markörens ägare rullar runt markören. Infogningar som gjorts av andra användare visas inte och infogningar kan inte göras via en Transact-SQL servermarkör.

Om en rad tas bort returnerar ett försök att hämta raden en @@FETCH_STATUS av -2. Uppdateringar av nyckelvärden utanför markören liknar en borttagning av den gamla raden följt av en infogning av den nya raden. Raden med de nya värdena visas inte och försöker hämta raden med de gamla värdena som returnerar en @@FETCH_STATUS av -2. De nya värdena visas om uppdateringen sker via markören genom att WHERE CURRENT OF ange -satsen.

DYNAMIC

Definierar en markör som återspeglar alla dataändringar som gjorts i raderna i resultatuppsättningen när markörens ägare rullar runt markören. Datavärdena, ordningen och medlemskapet för raderna kan ändras vid varje hämtning. Alternativen för absolut och relativ hämtning stöds inte med dynamiska markörer.

FAST_FORWARD

Anger en FORWARD_ONLY, READ_ONLY -markör med optimeringar aktiverade. FAST_FORWARD kan inte anges när SCROLL anges.

READ_ONLY

Förhindrar att uppdateringar görs via den här markören. Det går inte att referera till markören i en WHERE CURRENT OF sats i en UPDATE -instruktion DELETE . Det här alternativet åsidosätter standardfunktionen för en markör som ska uppdateras.

SCROLL LOCKS

Anger att positionerade uppdateringar eller borttagningar som görs via markören garanterat kommer att lyckas. SQL Server låser raderna när de läse in i markören för att garantera deras tillgänglighet för senare ändringar. Du kan inte ange SCROLL_LOCKS när FAST_FORWARD har angetts.

OPTIMISTIC

Anger att placerade uppdateringar eller borttagningar som görs via markören inte lyckas om raden har uppdaterats sedan den lästes in i markören. SQL Server låser inte rader när de läses in i markören. I stället används jämförelser av tidsstämpelkolumnvärden, eller ett kontrollsummavärde, om tabellen inte har någon tidsstämpelkolumn, för att avgöra om raden ändrades efter att ha lästs in i markören. Om raden har ändrats misslyckas den positionerade uppdateringen eller borttagningen. Du kan inte ange OPTIMISTIC när FAST_FORWARD har angetts.

TYPE_WARNING

Anger att ett varningsmeddelande skickas till klienten när markören implicit konverteras från den begärda typen till en annan.

FOR select_statement

En standardsats SELECT som definierar markörens resultatuppsättning. Nyckelorden och INTO tillåts FOR BROWSEinte i select_statement i en markördeklaration.

Om du använder DISTINCT, UNION, GROUP BYeller HAVING, eller om du inkluderar ett aggregeringsuttryck i select_list skapas markören som STATIC.

Om varje underliggande tabell inte har något unikt index och en ISO-markör SCROLL eller om en Transact-SQL KEYSET markören begärs, blir markören automatiskt en STATIC markör.

Om select_statement innehåller en ORDER BY sats där kolumnerna inte är unika radidentifierare konverteras en DYNAMIC markör till en KEYSET markör eller till en STATIC markör om en KEYSET markör inte kan öppnas. Den här processen sker också för en markör som definieras med hjälp av ISO-syntax men utan nyckelordet STATIC .

READ ONLY

Förhindrar att uppdateringar görs via den här markören. Det går inte att referera till markören i en WHERE CURRENT OF sats i en UPDATE -instruktion DELETE . Det här alternativet åsidosätter standardfunktionen för en markör som ska uppdateras. Det här nyckelordet varierar från tidigare READ_ONLY genom att ha ett blanksteg i stället för ett understreck mellan READ och ONLY.

UPPDATERA [ AV column_name [ ,... n ] ]

Definierar uppdateringsbara kolumner i markören. Om OF <column_name> [ , ...n ] anges tillåter endast kolumnerna i listan ändringar. När ingen lista har angetts kan alla kolumner uppdateras, såvida inte markören definieras som READ_ONLY.

Remarks

När en variabel har deklarerats initieras den till NULL. Använd -instruktionen SET för att tilldela ett värde som inte NULL är till en deklarerad variabel. Instruktionen SET som tilldelar ett värde till variabeln returnerar ett enda värde. När du initierar flera variabler använder du en separat SET instruktion för varje lokal variabel.

Du kan bara använda variabler i uttryck, inte i stället för objektnamn eller nyckelord. Om du vill skapa dynamiska Transact-SQL-instruktioner använder du EXECUTE.

Även om syntaxregler för SET @cursor_variable inkluderar nyckelorden LOCAL och GLOBAL skapas markören som GLOBAL eller LOCAL, beroende på inställningen för alternativet för lokal markördatabas när du använder SET @cursor_variable = CURSOR... syntaxen.

Markörvariabler är alltid lokala, även om de refererar till en global markör. När en markörvariabel refererar till en global markör har markören både en global och en lokal markörreferens. Mer information finns i Exempel D, Använd SET med en global markör.

Mer information finns i DEKLARERA MARKÖREN (Transact-SQL).

Du kan använda den sammansatta tilldelningsoperatorn var som helst där du har en tilldelning med ett uttryck till höger om operatorn, inklusive variabler, och en SET i en UPDATE, SELECToch RECEIVE -instruktion.

Använd inte en variabel i en SELECT -instruktion för att sammanfoga värden (d.s. för att beräkna aggregeringsvärden). Oväntade frågeresultat kan inträffa eftersom alla uttryck i SELECT listan (inklusive tilldelningar) inte nödvändigtvis körs exakt en gång för varje utdatarad. Mer information finns i KB-287515.

Permissions

Kräver medlemskap i den offentliga rollen. Alla användare kan använda SET @local_variable.

Examples

Kodexemplen i den här artikeln använder AdventureWorks2022- eller AdventureWorksDW2022-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.

A. Skriv ut värdet för en variabel som initierats med hjälp av SET

I följande exempel skapas variabeln @myVar , ett strängvärde placeras i variabeln och värdet för variabeln @myVar skrivs ut.

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

B. Använda en lokal variabel som tilldelats ett värde med hjälp av SET i en SELECT-instruktion

I följande exempel skapas en lokal variabel med namnet @state och den lokala variabeln används i en SELECT -instruktion för att hitta förnamnet (FirstName) och familjenamnet (LastName) för alla anställda som bor i tillståndet 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. Använda en sammansatt tilldelning för en lokal variabel

Följande två exempel ger samma resultat. Varje exempel skapar en lokal variabel med namnet @NewBalance, multiplicerar den med och visar sedan det 10nya värdet för den lokala variabeln i en SELECT -instruktion. I det andra exemplet används en sammansatt tilldelningsoperator.

/* 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. Använda SET med en global markör

I följande exempel skapas en lokal variabel och markörens variabel anges sedan till det globala markörens namn.

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. Definiera en markör med SET

I följande exempel används -instruktionen SET för att definiera en markör.

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. Tilldela ett värde från en fråga

I följande exempel används en fråga för att tilldela ett värde till en variabel.

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

G. Tilldela ett värde till en användardefinierad typvariabel genom att ändra en egenskap av typen

I följande exempel anges ett värde för användardefinierad typ (UDT) Point genom att ändra värdet för egenskapen X för typen.

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

Läs mer om att skapa UDT Point som refereras i det här exemplet och följande exempel i artikeln Skapa User-Defined typer.

H. Tilldela ett värde till en användardefinierad typvariabel genom att anropa en metod av typen

I följande exempel anges ett värde för användardefinierad typpunkt genom att anropa metoden SetXY av typen .

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

I. Skapa en variabel för en CLR-typ och anropa en mutatormetod

I följande exempel skapas en variabel för typen Pointoch kör sedan en mutatormetod i 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);

Exempel: Azure Synapse Analytics and Analytics Platform System (PDW)

Kodexemplen i den här artikeln använder AdventureWorks2022- eller AdventureWorksDW2022-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.

J. Skriv ut värdet för en variabel som initierats med hjälp av SET

I följande exempel skapas variabeln @myVar , ett strängvärde placeras i variabeln och värdet för variabeln @myVar skrivs ut.

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

K. Använda en lokal variabel som tilldelats ett värde med hjälp av SET i en SELECT-instruktion

I följande exempel skapas en lokal variabel med namnet @dept och den här lokala variabeln används i en SELECT -instruktion för att hitta förnamnet (FirstName) och familjenamnet (LastName) för alla anställda som arbetar på Marketing avdelningen.

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

L. Använda en sammansatt tilldelning för en lokal variabel

Följande två exempel ger samma resultat. De skapar en lokal variabel med namnet @NewBalance, multiplicerar den med och visar det 10 nya värdet för den lokala variabeln i en SELECT -instruktion. I det andra exemplet används en sammansatt tilldelningsoperator.

/* 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. Tilldela ett värde från en fråga

I följande exempel används en fråga för att tilldela ett värde till en variabel.

-- Uses AdventureWorks

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