Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL-adatbázis a Microsoft Fabricben
@@IDENTITY egy rendszerfüggvény, amely az utoljára beillesztett identitásértéket adja vissza.
Transact-SQL szintaxis konvenciók
Szemantika
@@IDENTITY
Visszatérési típusok
numeric(38,0)
Megjegyzések
Egy INSERT, SELECT INTOvagy tömeges másolási utasítás befejeződése @@IDENTITY után az utasítás által létrehozott utolsó identitásértéket tartalmazza.
- Ha az utasítás nem érint egyetlen azonosító oszlopos táblát is,
@@IDENTITYakkor -t adnak visszaNULL. - Ha több sort is beillesztünk, és több identitásértéket generálunk,
@@IDENTITYaz utolsó generált identitásérték jelenik meg. - Ha az utasítás egy vagy több triggert indít, amelyek beillesztéseket hajtanak végre, és identitásértékeket generálnak, akkor a kijelentés utáni hívás
@@IDENTITYvisszaadja az utolsó azonosító értéket, amelyet a triggerek generáltak. - Ha egy eseményindító egy identitásoszlopot tartalmazó táblára vonatkozó beszúrási művelet után aktiválódik, és az eseményindító egy olyan táblába szúr be, amely nem rendelkezik identitásoszloppal,
@@IDENTITYaz első beszúrás identitásértékét adja vissza. Az@@IDENTITYérték nem áll vissza egy korábbi beállításra, ha az utasítás vagySELECT INTOaINSERTtömeges másolás meghiúsul, vagy ha a tranzakció visszakerül.
A sikertelen utasítások és tranzakciók megváltoztathatják a tábla aktuális identitását, és réseket hozhatnak létre az identitásoszlop értékeiben. Az identitásérték soha nem kerül vissza, annak ellenére, hogy az értéket a táblába beszúrni próbált tranzakció nem véglegesített. Ha például egy INSERTIGNORE_DUP_KEY utasítás egy szabálysértés miatt meghiúsul, a tábla jelenlegi identitásértéke továbbra is növekszik.
@@IDENTITY, SCOPE_IDENTITY, és IDENT_CURRENT hasonló függvények, mert mindegyikük visszaadja az utolsó értéket, amelyet egy IDENTITY tábla oszlopába helyeztek be.
@@IDENTITYésSCOPE_IDENTITYvisszaadja az aktuális ülés bármely táblájában generált utolsó identitásértéket.SCOPE_IDENTITYAz értéket azonban csak az aktuális hatókörön belül adja vissza;@@IDENTITYnem korlátozódik egy adott hatókörre.IDENT_CURRENThatókör és munkamenet nem korlátozza; egy megadott táblára van korlátozva.IDENT_CURRENTvisszaadja az adott tábla által generált identitásértéket bármely ülésen és bármely hatókörben. További információért lásd IDENT_CURRENT (Transact-SQL).
A függvény hatóköre annak @@IDENTITY a helyi kiszolgálónak az aktuális munkamenete, amelyen fut. Ez a függvény nem alkalmazható távoli vagy csatolt kiszolgálókra. Ha egy identitásértéket egy másik kiszolgálón szeretne beszerezni, hajt végre egy tárolt eljárást a távoli vagy csatolt kiszolgálón, és a tárolt eljárás (amely a távoli vagy a csatolt kiszolgáló környezetében fut) összegyűjti az identitásértéket, és visszaadja azt a helyi kiszolgálón lévő hívó kapcsolatnak.
A replikáció hatással lehet az @@IDENTITY értékre, mert a replikációs eseményindítókban és a tárolt eljárásokban használják.
@@IDENTITY nem megbízható mutatója a legutóbbi felhasználó által létrehozott identitásnak, ha az oszlop egy replikációs cikk része. Használhatod a SCOPE_IDENTITY() függvényszintaxist a @@IDENTITYhelyett. További információ: SCOPE_IDENTITY (Transact-SQL).
Megjegyzés:
A hívó tárolt eljárást vagy Transact-SQL utasítást újra kell írni, hogy használja a SCOPE_IDENTITY() függvényt, amely a felhasználói utasítás hatókörén belül használt legfrissebb identitást adja vissza, nem pedig a replikáció által használt beágyazott trigger hatókörű identitását.
Példák
A. Az utolsó beszúrt identitásérték lekérése
A következő példa egy sort helyez be egy táblázatba egy identitásoszloptal (LocationID), és ezt használja @@IDENTITY az új sorban használt identitásérték megjelenítésére.
USE AdventureWorks2022;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES ('Damaged Goods', 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS 'Identity';
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO
B. Szülő- és gyermeksorok beszúrása @@IDENTITY
Az alábbi példa bemutatja, hogy a @@IDENTITY szülősor identitásértékének rögzítése és használata a kapcsolódó gyermeksorok beszúrásakor történik. Ez a minta gyakori a sorrendbejegyzés és a szülő-gyermek táblatervekben.
-- Create sample tables
CREATE TABLE dbo.Orders (
OrderID int IDENTITY(1, 1) PRIMARY KEY,
CustomerName nvarchar(100) NOT NULL,
OrderDate datetime NOT NULL DEFAULT GETDATE()
);
CREATE TABLE dbo.OrderDetails (
DetailID int IDENTITY(1, 1) PRIMARY KEY,
OrderID int NOT NULL REFERENCES dbo.Orders(OrderID),
ProductName nvarchar(100) NOT NULL,
Quantity int NOT NULL
);
GO
-- Insert a parent row and capture its identity
INSERT INTO dbo.Orders (CustomerName, OrderDate)
VALUES ('Contoso Ltd', GETDATE());
DECLARE @NewOrderID int = @@IDENTITY;
-- Insert child rows using the captured parent identity
INSERT INTO dbo.OrderDetails (OrderID, ProductName, Quantity)
VALUES (@NewOrderID, 'Widget A', 10);
INSERT INTO dbo.OrderDetails (OrderID, ProductName, Quantity)
VALUES (@NewOrderID, 'Widget B', 5);
-- Verify the results
SELECT o.OrderID, o.CustomerName, d.ProductName, d.Quantity
FROM dbo.Orders o
INNER JOIN dbo.OrderDetails d ON o.OrderID = d.OrderID
WHERE o.OrderID = @NewOrderID;
GO
Megjegyzés:
Az éles kódban használja SCOPE_IDENTITY()@@IDENTITY ahelyett, hogy ezt a mintát használjuk. Ha egy eseményindító aktiválja a Orders táblát, és egy identitásoszlopot tartalmazó másik táblába szúr be, @@IDENTITY az identitásérték helyett az eseményindító identitásértékét Orders adja vissza.
SCOPE_IDENTITY() csak az aktuális hatókör identitásértékét adja vissza.
C. A @@IDENTITY és a SCOPE_IDENTITY közötti különbség megismerése
Az alábbi példa bemutatja, hogyan és SCOPE_IDENTITY() hogyan @@IDENTITY adhat vissza különböző értékeket az eseményindítók használatakor.
CREATE TABLE dbo.Products (
ProductID int IDENTITY(1, 1) PRIMARY KEY,
ProductName nvarchar(100) NOT NULL
);
CREATE TABLE dbo.ProductAudit (
AuditID int IDENTITY(1000, 1) PRIMARY KEY,
ProductID int NOT NULL,
AuditAction nvarchar(50) NOT NULL,
AuditDate datetime NOT NULL DEFAULT GETDATE()
);
GO
-- Create a trigger that inserts into ProductAudit
CREATE TRIGGER trg_ProductInsert
ON dbo.Products
AFTER INSERT
AS
BEGIN
INSERT INTO dbo.ProductAudit (ProductID, AuditAction)
SELECT ProductID, 'INSERT'
FROM inserted;
END;
GO
-- Insert a product and compare identity values
INSERT INTO dbo.Products (ProductName) VALUES ('Test Product');
SELECT @@IDENTITY AS [@@IDENTITY],
SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
Ebben a példában a ProductID tábla (aktuális hatókör) értékét Products adja vissza, SCOPE_IDENTITY() míg @@IDENTITY a AuditID táblából (eseményindító hatókör) származó ProductAudit értéket. A legtöbb alkalmazásforgatókönyv esetében biztonságosabb választás, SCOPE_IDENTITY() mert az eseményindító tevékenység nem befolyásolja.