Megosztás a következőn keresztül:


SETT @local_variable (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

Beállítja a megadott helyi változót, amelyet korábban az DECLARE @local_variable utasítással hoztak létre, a megadott értékre.

Transact-SQL szintaxis konvenciók

Syntax

Szintaxis az SQL Serverhez, az Azure SQL Database-hez és a felügyelt Azure SQL-példányhoz:

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 ] ] } ]
      }
    }
}

Az Azure Synapse Analytics és a párhuzamos adattárház és a Microsoft Fabric szintaxisa:

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

Arguments

@local_variable

Tetszőleges típusú változó neve, kivéve a kurzort, a szöveget, az ntextet, a képet vagy a táblázatot. A változóneveknek egy előjellel (@) kell kezdődniük. A változóneveknek az azonosítókra vonatkozó szabályokat kell követnie.

property_name

Felhasználó által definiált típusú tulajdonság.

field_name

Felhasználó által definiált típusú nyilvános mező.

udt_name

A felhasználó által definiált általános nyelvi futtatókörnyezet (CLR) neve.

{ . | :: }

A CLR felhasználó által definiált típusának metódusát adja meg. Egy példány (nem statikus) metódus esetén használjon pont (.) elemet. Statikus módszer esetén használjon két kettőspontot (::). A felhasználó által definiált CLR-típus metódusának, tulajdonságának vagy mezőjének meghívásához végrehajtási engedéllyel kell rendelkeznie a típushoz.

method_name ( argumentum [ ,... n ] )

Felhasználó által definiált típusú metódus, amely egy vagy több argumentumot vesz igénybe egy adott típusú példány állapotának módosításához. A statikus módszereknek nyilvánosnak kell lenniük.

@SQLCLR_local_variable

Olyan változó, amelynek típusa egy szerelvényben található. További információkért lásd a common language runtime (CLR) integrációs programozási fogalmakat.

mutator_method

Egy metódus a szerelvényben, amely megváltoztathatja az objektum állapotát. Erre a metódusra az SQLMethodAttribute.IsMutator van alkalmazva.

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

Összetett hozzárendelés operátora:

  • += – Hozzáadás és hozzárendelés
  • -= - Kivonás és hozzárendelés
  • *= - Szorzás és hozzárendelés
  • /= – Osztás és hozzárendelés
  • %= - Modulo és hozzárendelés
  • &= - Bitenkénti AND és hozzárendelés
  • ^= - Bitenkénti XOR és hozzárendelés
  • |= - Bitenkénti OR és hozzárendelés

expression

Bármilyen érvényes kifejezés.

cursor_variable

A kurzorváltozó neve. Ha a célkurzor változó korábban egy másik kurzorra hivatkozott, az előző hivatkozás el lesz távolítva.

cursor_name

Az utasítással DECLARE CURSOR deklarált kurzor neve.

KURZOR

Azt adja meg, hogy az SET utasítás egy kurzor deklarációját tartalmazza.

KÉZIRATTEKERCS

Megadja, hogy a kurzor támogatja-e az összes beolvasási beállítást: FIRST, LAST, NEXT, PRIOR, RELATIVEés ABSOLUTE. Nem adhatja meg SCROLL , hogy mikor is adja meg a elemet FAST_FORWARD.

FORWARD_ONLY

Azt adja meg, hogy a kurzor csak a FETCH NEXT beállítást támogatja. A kurzor csak egy irányba lesz lekérve, az elsőtől az utolsóig. Ha a kurzort a , FORWARD_ONLYvagy STATIC kulcsszavak nélkül adja megKEYSET, a kurzor a következőképpen lesz implementálvaDYNAMICDYNAMIC. Ha nem adja meg az FORWARD_ONLYSCROLLFORWARD_ONLY alapértelmezett értéket, vagy ha nem adja meg a kulcsszavakat STATIC, KEYSETvagy .DYNAMIC A STATIC( és KEYSETDYNAMIC a kurzor ) SCROLL az alapértelmezett érték.

STATIC

Definiál egy kurzort, amely ideiglenes másolatot készít a kurzor által használandó adatokról. A kurzorhoz érkező összes kérésre a rendszer a következő ideiglenes táblázatból tempdbválaszol: . Ennek eredményeképpen a kurzor megnyitása után az alaptáblák módosításai nem jelennek meg a kurzorhoz beolvasott beolvasások által visszaadott adatokban. És ez a kurzor nem támogatja a módosításokat.

KEYSET

Megadja, hogy a kurzorban lévő sorok tagsága és sorrendje rögzített legyen a kurzor megnyitásakor. A sorokat egyedileg azonosító kulcsok készlete a következő kulcskészletbe tempdbvan beépítve: . Az alaptáblák nem kulcsértékeinek módosítása a kurzor tulajdonosa által vagy más felhasználók által véglegesített módon, a kurzor tulajdonosa görgetve látható a kurzor körül. A más felhasználók által készített beszúrások nem láthatók, és a beszúrások nem hozhatók létre Transact-SQL kiszolgálói kurzoron keresztül.

Ha töröl egy sort, a sor beolvasására tett kísérlet a következőt @@FETCH_STATUSadja vissza-2: A kurzoron kívüli kulcsértékek frissítése hasonló a régi sor törléséhez, amelyet az új sor beszúrása követ. Az új értékeket tartalmazó sor nem látható, és megpróbálja beolvasni a sort a régi értékekkel @@FETCH_STATUS-2. Az új értékek akkor jelennek meg, ha a frissítés a kurzoron keresztül történik a WHERE CURRENT OF záradék megadásával.

DYNAMIC

Olyan kurzort definiál, amely az eredményhalmaz soraiban végrehajtott összes adatmódosítást tükrözi, miközben a kurzor tulajdonosa görget a kurzor körül. A sorok adatértékei, sorrendje és tagsága minden beolvasáskor változhat. A dinamikus kurzorok nem támogatják az abszolút és relatív beolvasási beállításokat.

FAST_FORWARD

Egy , kurzort ad FORWARD_ONLYmeg, READ_ONLY amelyen engedélyezve van az optimalizálás. FAST_FORWARD nem adható meg, ha SCROLL szintén meg van adva.

READ_ONLY

Megakadályozza, hogy a frissítések ezen a kurzoron keresztül legyenek készítve. A kurzorra nem lehet hivatkozni egy WHERE CURRENT OF záradékban vagy UPDATE utasításbanDELETE. Ez a beállítás felülírja a frissíteni kívánt kurzor alapértelmezett képességét.

GÖRCSZÁRAK

Megadja, hogy a kurzoron keresztül végrehajtott helyhez kötött frissítések vagy törlések garantáltan sikeresek legyenek. Az SQL Server zárolja a sorokat, miközben beolvassa őket a kurzorba, így biztosítva azok későbbi módosításokhoz való rendelkezésre állását. Azt sem adhatja meg SCROLL_LOCKS , hogy mikor FAST_FORWARD van megadva.

OPTIMISTA

Azt adja meg, hogy a kurzoron keresztül elhelyezett frissítések vagy törlések nem lesznek sikeresek, ha a sor frissült a kurzorba való beolvasás óta. Az SQL Server nem zárolja a sorokat, mivel beolvassa őket a kurzorba. Ehelyett az időbélyeg oszlopértékeinek összehasonlítását vagy ellenőrzőösszeg-értéket használ, ha a táblázat nem tartalmaz időbélyegoszlopot, annak megállapítására, hogy a sor módosult-e a kurzorba való beolvasás után. Ha a sor módosult, a megkísérelt frissítés vagy törlés meghiúsul. Azt sem adhatja meg OPTIMISTIC , hogy mikor FAST_FORWARD van megadva.

TYPE_WARNING

Azt adja meg, hogy a rendszer figyelmeztető üzenetet küld az ügyfélnek, amikor a kurzor implicit módon konvertálódik a kért típusról egy másikra.

EZÉRT select_statement

A kurzor eredményhalmazát meghatározó standard SELECT utasítás. A kulcsszavak FOR BROWSE, és INTO nem engedélyezettek a kurzordeklaráció select_statement .

DISTINCTHa a select_list UNIONGROUP BYaggregátumkifejezést használHAVING, akkor a kurzor a következőképpen jön létre.STATIC

Ha az egyes mögöttes táblák nem rendelkeznek egyedi indexszel és ISO-kurzorlal SCROLL , vagy ha Transact-SQL KEYSET kurzort kérnek, a kurzor automatikusan kurzor lesz STATIC .

Ha select_statement tartalmaz egy ORDER BY záradékot, amelyben az oszlopok nem egyedi sorazonosítók, DYNAMIC a kurzor kurzorrá vagy kurzorrá alakul KEYSET , STATIC ha KEYSET a kurzor nem nyitható meg. Ez a folyamat az ISO-szintaxissal definiált, de a STATIC kulcsszó nélküli kurzor esetében is megtörténik.

CSAK OLVASHATÓ

Megakadályozza, hogy a frissítések ezen a kurzoron keresztül legyenek készítve. A kurzorra nem lehet hivatkozni egy WHERE CURRENT OF záradékban vagy UPDATE utasításbanDELETE. Ez a beállítás felülírja a frissíteni kívánt kurzor alapértelmezett képességét. Ez a kulcsszó a korábbiaktól READ_ONLY eltérő, mivel a kettő között READONLYaláhúzásjel helyett szóköz van.

FRISSÍTÉS [ A column_name [ ,... n ] ] ]

A kurzoron belüli frissíthető oszlopokat definiálja. Ha OF <column_name> [ , ...n ] meg van adva, csak a felsorolt oszlopok engedélyezik a módosításokat. Ha nincs megadva lista, az összes oszlop frissíthető, kivéve, ha a kurzor a következőképpen van definiálva READ_ONLY.

Remarks

A változó deklarálása után a változó inicializálva lesz.NULL SET Az utasítással olyan értéket rendelhet hozzá, amely nem NULL deklarált változóhoz van rendelve. Az SET az utasítás, amely egy értéket rendel a változóhoz, egyetlen értéket ad vissza. Ha több változót inicializál, minden helyi változóhoz használjon külön SET utasítást.

A változókat csak kifejezésekben használhatja, objektumnevek vagy kulcsszavak helyett nem. Dinamikus Transact-SQL utasítások létrehozásához használja a következőt EXECUTE: .

Bár a szintaxis szabályai SET @cursor_variable tartalmazzák a kulcsszavakat és LOCAL a GLOBAL szintaxist, a SET @cursor_variable = CURSOR... kurzor az alapértelmezett beállítástól függően a helyi kurzoradatbázis beállításától függően jön létre GLOBALLOCAL.

A kurzorváltozók mindig helyiek, még akkor is, ha globális kurzorra hivatkoznak. Ha egy kurzorváltozó globális kurzorra hivatkozik, a kurzor globális és helyi kurzorhivatkozással is rendelkezik. További információ: D példa: SET használata globális kurzorral.

További információ: DEKLARÁLT KURZOR (Transact-SQL).

Az összetett hozzárendelés operátort bárhol használhatja, ahol van egy hozzárendelés az operátor jobb oldalán található kifejezéssel, beleértve a változókat, valamint egy SET , UPDATEés SELECT egy utasítástRECEIVE.

Ne használjon változót egy SELECT utasításban az értékek összefűzésére (vagyis az összesített értékek kiszámítására). Váratlan lekérdezési eredmények fordulhatnak elő, mert a listában szereplő összes kifejezés (beleértve a SELECT hozzárendeléseket is) nem feltétlenül fut minden kimeneti sor esetében pontosan egyszer. További információ: KB 287515.

Permissions

A nyilvános szerepkörhöz tagságra van szükség. Minden felhasználó használhatja SET @local_variable.

Examples

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

A. A SET használatával inicializált változó értékének nyomtatása

Az alábbi példa létrehozza a változót @myVar , sztringértéket helyez a változóba, és kinyomtatja a @myVar változó értékét.

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

B. Értékhez hozzárendelt helyi változó használata a SET függvény használatával SELECT utasításban

Az alábbi példában létrehozunk egy helyi változót, @state amely egy utasításban SELECT a helyi változót használja, hogy megkeresse az összes alkalmazott utónevét (FirstName) és családnevét LastName(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. Összetett hozzárendelés használata helyi változóhoz

Az alábbi két példa ugyanazt az eredményt adja. Minden példa létrehoz egy helyi változót, amelyet megszoroz@NewBalance10, majd egy utasításban SELECT megjeleníti a helyi változó új értékét. A második példa egy összetett hozzárendelési operátort használ.

/* 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. A SET használata globális kurzorral

Az alábbi példa létrehoz egy helyi változót, majd beállítja a kurzor változót a globális kurzornévre.

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. Kurzor definiálása a SET használatával

Az alábbi példa a kurzor definiálásához használja az SET utasítást.

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. Érték hozzárendelése lekérdezésből

Az alábbi példa egy lekérdezéssel rendel egy értéket egy változóhoz.

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

G. Érték hozzárendelése felhasználó által definiált típusváltozóhoz a típus tulajdonságának módosításával

Az alábbi példa a felhasználó által definiált típus (UDT) Point értékét állítja be a típus tulajdonságának X módosításával.

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

További információ az ebben a Point példában hivatkozott UDT létrehozásáról, valamint az alábbi példákról a User-Defined-típusok létrehozása című cikkben.

H. Érték hozzárendelése felhasználó által definiált típusváltozóhoz a típus metódusának meghívásával

Az alábbi példa a felhasználó által definiált típuspont értékét állítja be a típus metódusának SetXY meghívásával.

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

I. Változó létrehozása CLR-típushoz és mutációs metódus meghívása

Az alábbi példa létrehoz egy változót a típushoz Point, majd végrehajt egy mutációs metódust a következőben 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);

Példák: Azure Synapse Analytics and Analytics Platform System (PDW)

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

J. A SET használatával inicializált változó értékének nyomtatása

Az alábbi példa létrehozza a változót @myVar , sztringértéket helyez a változóba, és kinyomtatja a @myVar változó értékét.

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

K. Értékhez hozzárendelt helyi változó használata a SET függvény használatával SELECT utasításban

Az alábbi példában létrehozunk egy helyi változót, amely egy @dept utasításban ezt a helyi változót SELECT használja a részlegen FirstName dolgozó összes alkalmazott utónevének (LastName) és családnevének (Marketing) megkereséséhez.

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

L. Összetett hozzárendelés használata helyi változóhoz

Az alábbi két példa ugyanazt az eredményt adja. Létrehoznak egy helyi változót, @NewBalanceamelyet megszoroznak 10 , és egy SELECT utasításban megjelenítik a helyi változó új értékét. A második példa egy összetett hozzárendelési operátort használ.

/* 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. Érték hozzárendelése lekérdezésből

Az alábbi példa egy lekérdezéssel rendel egy értéket egy változóhoz.

-- Uses AdventureWorks

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