Ik wil de nieuw aangemaakte ID krijgen als je een nieuw record in de tabel zet.
Ik las dit: http://msdn.microsoft.com/en-us/library/ms177564.aspx maar het moet een tijdelijke tabel maken.
Ik wil de ID teruggeven na het uitvoeren van INSERT statement (ervan uitgaande dat er maar één INSERT wordt uitgevoerd).
Voorbeeld:
1 Joe Joe
2 Michael Mike
3 Zoe Zoe
Bij het uitvoeren van een INSERT statement, wil ik het aangemaakte ID teruggeven, dus 4.
Kunt u mij vertellen hoe ik dat kan doen met behulp van SQL-instructie of is het niet mogelijk?
Als uw SQL Server tabel een kolom heeft van het type INT IDENTITY
(of BIGINT IDENTITY
), dan kunt u de laatst ingevoegde waarde opvragen met:
INSERT INTO dbo.YourTable(columns....)
VALUES(..........)
SELECT SCOPE_IDENTITY()
Dit werkt zolang je geen andere rij hebt ingevoegd - het geeft gewoon de laatste IDENTITY
waarde die in dit bereik hier is uitgedeeld.
Er zijn ten minste twee meer opties - @@IDENTITY
en IDENT_CURRENT
- lees meer over hoe ze werken en op welke manier ze verschillen (en je onverwachte resultaten kunnen geven) in deze uitstekende blog post door Pinal Dave hier.
Uitgaande van een eenvoudige tabel:
CREATE TABLE dbo.foo(ID INT IDENTITY(1,1), name SYSNAME);
We kunnen de IDENTITEIT
waarden vastleggen in een tabel variabele voor verder gebruik.
DECLARE @IDs TABLE(ID INT);
-- minor change to INSERT statement; add an OUTPUT clause:
INSERT dbo.foo(name)
OUTPUT inserted.ID INTO @IDs(ID)
SELECT N'Fred'
UNION ALL
SELECT N'Bob';
SELECT ID FROM @IDs;
Het mooie van deze methode is (a) het verwerkt multi-row inserts (SCOPE_IDENTITY()
retourneert alleen de laatste waarde) en (b) het vermijdt deze parallellisme bug, die kan leiden tot verkeerde resultaten, maar tot nu toe alleen is opgelost in SQL Server 2008 R2 SP1 CU5.
Je kunt gebruiken:
SELECT IDENT_CURRENT(‘tablename’)
om de laatste identiteit voor een bepaalde tabel op te vragen.
B.v. Overweeg volgende code:
INSERT INTO dbo.MyTable(columns....) VALUES(..........)
INSERT INTO dbo.YourTable(columns....) VALUES(..........)
SELECT IDENT_CURRENT(‘MyTable’)
SELECT IDENT_CURRENT(‘YourTable’)
Dit zou de juiste waarde opleveren voor de corresponderende tabellen.
Het geeft de laatste IDENTITY
waarde terug die in een tabel is geproduceerd, ongeacht de verbinding die de waarde heeft gecreëerd, en ongeacht het bereik van het statement dat de waarde heeft geproduceerd.
IDENT_CURRENT
is niet beperkt door scope en sessie; het is beperkt tot een gespecificeerde tabel. IDENT_CURRENT
geeft de identiteitswaarde terug die is gegenereerd voor een specifieke tabel in elke sessie en elk bereik.