Cel mai bun mod de a obține identitatea introdus rând?

Ceea ce este cel mai bun mod de a obține "IDENTITATE" a introdus rând?

Știu despre @@IDENTITY " și "IDENT_CURRENT" și " SCOPE_IDENTITY dar nu't înțelegeți argumentele pro și contra atașat la fiecare.

Poate cineva să explice diferențele și când ar trebui să folosesc fiecare?

Comentarii la întrebare (4)
Soluția
  • @@IDENTITY a se întoarce la ultimul identitatea valoarea generată pentru orice masă în sesiunea curentă, în toate domeniile. Aveți nevoie pentru a fi atent aici, deoarece's pe domenii. Ai putea lua o valoare dintr-o declanșa, în loc de curent declarație.

  • SCOPE_IDENTITY() a se întoarce la ultimul identitatea valoarea generată pentru orice masă în sesiunea curentă și domeniul de aplicare actual. În general, ceea ce doriți să utilizați.

  • IDENT_CURRENT('tableName') returnează ultima identitatea valoarea generată pentru un anumit tabel, în orice sesiune și orice aplicare. Acest lucru vă permite să specificați ce masa vrei valorii de, în cazul în care cele două de mai sus sunt't destul de ceea ce ai nevoie (foarte rar). De asemenea, ca @Tip Starbuck menționat, "Ai putea folosi această opțiune dacă doriți pentru a obține curent de IDENTITATE valoare pentru un tabel care nu ați introdus un disc în."

  • A "de IEȘIRE" clauză a INSERT declarație va permite accesul la fiecare rând care a fost introdus prin această declarație. Deoarece's referă la situația specifică, l's mai simplă decât alte funcții de mai sus. Cu toate acestea,'s un pic mai verbose (te'll nevoie pentru a introduce într-o masă variabilă/temp masă și apoi interogare care) și dă rezultate chiar și într-o eroare de scenariu în cazul în care declarația este derulată înapoi. Asta a spus, dacă interogare utilizează un plan de executie paralele, acest lucru este singura metodă garantată pentru obtinerea de identitate (scurt de oprirea paralelism). Cu toate acestea, este executat înainte declanșează și nu poate fi folosit pentru a reveni declanșa generat de valori.

Comentarii (14)

Cred că cea mai sigură și cea mai precisă metodă de recuperare a introdus id-ul ar fi utilizarea de ieșire clauză.

de exemplu (luat de la următoarele MSDN articol)

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table( NewScrapReasonID smallint,
                           Name varchar(50),
                           ModifiedDate datetime);
INSERT Production.ScrapReason
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
        INTO @MyTableVar
VALUES (N'Operator error', GETDATE());

--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate 
FROM Production.ScrapReason;
GO
Comentarii (7)

Am'm a spune același lucru ca și ceilalți, astfel încât toată lumea's corecte, am'm doar încercarea de a face mai clar.

@@IDENTITY returnează id-ul de ultimul lucru care a fost introdus de către client's de conectare la baza de date. De cele mai multe ori funcționează bine, dar, uneori, un declanșator va merge și de a introduce un rând nou, care nu't știu despre, și te'll a obține ID-ul de la acest nou rând, în loc de cea pe care o vrei

SCOPE_IDENTITY() rezolvă această problemă. Returnează id-ul de ultimul lucru pe care - ai introdus în cod SQL - ai trimis la baza de date. Dacă declanșează du-te și de a crea rânduri suplimentare, au câștigat't că valoarea sa a revenit. Ura

IDENT_CURRENT returnează ultimul ID-ul care a fost introdus de către oricine. Dacă o altă aplicație se întâmplă pentru a introduce un alt rând de la un nenoroc timp,'ll a obține ID-ul de pe rândul respectiv, în loc de unul.

Dacă doriți să-l joace în condiții de siguranță, folosiți întotdeauna SCOPE_IDENTITY(). Dacă rămânem cu `@@de IDENTITATE și cineva decide să adăugați un declanșa mai târziu, tot codul dvs. va rupe.

Comentarii (0)

Cele mai bune (a se citi: cel mai sigur) mod de a obține identitatea nou-introdus rând este de a folosi "de ieșire" clauza:

create table TableWithIdentity
           ( IdentityColumnName int identity(1, 1) not null primary key,
             ... )

-- type of this table's column must match the type of the
-- identity column of the table you'll be inserting into
declare @IdentityOutput table ( ID int )

insert TableWithIdentity
     ( ... )
output inserted.IdentityColumnName into @IdentityOutput
values
     ( ... )

select @IdentityValue = (select ID from @IdentityOutput)
Comentarii (4)

Adauga

SELECT CAST(scope_identity() AS int);

la sfârșitul introduce declarație sql, apoi

NewId = command.ExecuteScalar()

va recupera.

Comentarii (0)

Atunci când utilizați Entity Framework, se foloseste intern "de IEȘIRE" tehnica pentru a reveni din nou-introdus ID-ul valoare

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO TurboEncabulators(StatorSlots)
OUTPUT inserted.TurboEncabulatorID INTO @generated_keys
VALUES('Malleable logarithmic casing');

SELECT t.[TurboEncabulatorID ]
FROM @generated_keys AS g 
   JOIN dbo.TurboEncabulators AS t 
   ON g.Id = t.TurboEncabulatorID 
WHERE @@ROWCOUNT > 0

Rezultatele de ieșire sunt stocate într-un tabel temporar variabilă, s-au alăturat înapoi la masă, și a reveni la rând valoarea din tabel.

Notă: nu am idee de ce EF-ar inner join efemer masă a întors la masă (în ce circumstanțe ar cele două nu se potrivesc).

Dar asta's ce EF nu.

Această tehnică ("de IEȘIRE") este disponibil doar pe SQL Server 2008 sau mai nou.

Comentarii (1)

MSDN

@@de IDENTITATE, SCOPE_IDENTITY, și IDENT_CURRENT sunt funcții similare în care returneaza ultima valoare introdusă în coloană de IDENTITATE a unui tabel.

@@de IDENTITATE și SCOPE_IDENTITY va reveni la ultima identitatea valoarea generată în orice masă în sesiunea curentă. Cu toate acestea, SCOPE_IDENTITY întoarce valoarea numai în domeniul de aplicare actual; @@de IDENTITATE nu este limitat la un anumit domeniu de aplicare.

IDENT_CURRENT nu este limitată de aplicare și sesiune; este limitată la o anumită masă. IDENT_CURRENT se întoarce la identitatea valoarea generată pentru un anumit tabel, în orice sesiune și orice aplicare. Pentru mai multe informații, a se vedea IDENT_CURRENT.

Comentarii (0)

@@IDENTITY este ultimul identitate introdus folosind curent de Conexiune SQL. Aceasta este o valoare buna pentru a reveni la o introduce proceduri stocate, în cazul în care ai nevoie doar de identitatea introdus pentru nou record, și don't pasă dacă mai multe rânduri au fost adăugate ulterior.

SCOPE_IDENTITY este ultimul identitate introdus folosind curent de Conexiune SQL, și în domeniul de aplicare actual-care este, dacă a existat o a doua IDENTITATE introdus bazat pe un declanșator după inserare, ea nu s-ar fi reflectat în SCOPE_IDENTITY, doar introduceți-ați efectuat. Sincer, nu am avut niciodată un motiv pentru a utiliza aceasta.

IDENT_CURRENT(nume tabelă) este ultimul identitate introdus indiferent de conexiune sau de aplicare. Ai putea folosi această opțiune dacă doriți pentru a obține curent de IDENTITATE valoare pentru un tabel care nu ați introdus un disc în.

Comentarii (2)

Pot't vorbesc cu alte versiuni de SQL Server, dar în 2012, scoate direct functioneaza foarte bine. Nu't nevoie să deranjez cu un tabel temporar.

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES (...)

Apropo, aceasta tehnica, de asemenea, funcționează atunci când introduceți mai multe rânduri.

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES
    (...),
    (...),
    (...)

Ieșire

ID
2
3
4
Comentarii (2)

ÎNTOTDEAUNA utilizarea scope_identity(), nu's N-o mai am nevoie de nimic.

Comentarii (6)

Creați un uuid și introduce, de asemenea, pentru o coloană. Apoi, puteți identifica cu ușurință rând cu uuid. Asta e singura 100% soluție de lucru puteți pune în aplicare. Toate celelalte soluții sunt prea complicate sau nu sunt de lucru în același cazuri de margine.

Comentarii (0)

După Declarația Insert aveți nevoie pentru a adăuga acest lucru. Și Asigurați-vă că despre nume de tabel în cazul în care datele este introducerea.Veți obține curent rând nu în cazul în care rând afectate acum de a introduce declarație.

IDENT_CURRENT('tableName')
Comentarii (3)

Dacă sunteți în căutarea pentru ultimul ID adaugat/actualizat, acest lucru poate fi un pic mai old-school, dar există o mulțime de persoane care folosesc mai vechi PHP, Pre 5.5 pentru a fi mai precis. Mai multe detalii pot fi găsite la http://php.net/manual/en/function.mysql-insert-id.php

$last = mysql_insert_id();
Comentarii (1)