Es gribu iegūt jauno izveidoto ID, kad ievietojat jaunu ierakstu tabulā.
Es izlasīju šo: http://msdn.microsoft.com/en-us/library/ms177564.aspx, bet tam ir jāizveido pagaidu tabula.
Es gribu atgriezt ID pēc INSERT paziņojuma izpildes (pieņemot, ka izpildīts tikai viens INSERT).
Piemērs:
1 Joe Joe
2 Michael Mike
3 Zoe Zoe
Izpildot INSERT izteikumu, es gribu atgriezt izveidoto ID, tas ir, 4.
Vai varat man pateikt, kā to izdarīt, izmantojot SQL izteikumu, vai tas nav iespējams?
Ja SQL Server tabulā ir INT IDENTITY
(vai BIGINT IDENTITY
) tipa sleja, tad jaunāko ievietoto vērtību var iegūt, izmantojot:
INSERT INTO dbo.YourTable(columns....)
VALUES(..........)
SELECT SCOPE_IDENTITY()
Tas darbojas, ja vien neesat iestarpinājis citu rindu - tas tikai atgriež pēdējo IDENTITY
vērtību, kas šeit ir nodota šajā jomā.
Ir vēl vismaz divas iespējas - @@IDENTITY
un IDENT_CURRENT
- vairāk par to, kā tās darbojas un ar ko tās atšķiras (un var dot negaidītus rezultātus), lasiet šajā lieliskā Pinal Dave bloga ierakstā šeit.
Pieņemot, ka ir vienkārša tabula:
CREATE TABLE dbo.foo(ID INT IDENTITY(1,1), name SYSNAME);
Mēs varam ierakstīt IDENTITĀTES
vērtības tabulas mainīgajā turpmākai lietošanai.
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;
Šīs metodes labā īpašība ir tā, ka (a) tā apstrādā vairāku rindu ievietošanu (SCOPE_IDENTITY()
atgriež tikai pēdējo vērtību) un (b) tā ļauj izvairīties no šīs paralēlisma kļūdas, kas var novest pie nepareiziem rezultātiem, bet pagaidām ir labota tikai SQL Server 2008 R2 SP1 CU5.
Varat izmantot:
SELECT IDENT_CURRENT(‘tablename’)
lai piekļūtu jaunākajai konkrētas tabulas identitātei.
Piemēram, ņemot vērā šādu kodu:
INSERT INTO dbo.MyTable(columns....) VALUES(..........)
INSERT INTO dbo.YourTable(columns....) VALUES(..........)
SELECT IDENT_CURRENT(‘MyTable’)
SELECT IDENT_CURRENT(‘YourTable’)
Tas dotu pareizo vērtību attiecīgajām tabulām.
Tas atdod pēdējo IDENTITY
vērtību, kas radīta tabulā, neatkarīgi no savienojuma, kas radījis vērtību, un neatkarīgi no tā, kādā darbības jomā ir izteikums, kas radījis vērtību.
IDENT_CURRENT
neierobežo darbības joma un sesija; tas attiecas tikai uz norādīto tabulu. IDENT_CURRENT
atgriež identitātes vērtību, kas radīta konkrētai tabulai jebkurā sesijā un jebkurā darbības jomā.