2009-09-01 3 views
17

Ich habe einen Primärschlüssel für die automatische Inkrementierung eingerichtet.Wie füge ich in eine Tabelle ein und bekomme den Primärschlüsselwert zurück?

Ich mache mehrere Abfragen, und ich muss diesen Primärschlüsselwert als Fremdschlüssel in einer anderen Tabelle (IsIdentity = TRUE) verwenden abrufen.

Gibt es eine elegante Art und Weise den Primärschlüsselwert zurück zu bekommen, wenn ich eine INSERT-Abfrage zu tun? Gerade jetzt bin ich requerying und bekomme den höchsten Wert in dieser Spalte, die wirklich hacky scheint.

Irgendwelche Vorschläge?

Antwort

25
insert into YourTable values (...) 

die neue PK mit scope_identity erhalten()

select scope_identity() 
+1

+1 yup, scope_identity mit() ist die zuverlässige und effiziente Art und Weise zu gehen! –

+0

NICHT die beste Methode mehr. – HLGEM

+0

@ HLGEM was ist dann? – paz

2

holy crap !!!

rufen Sie einfach SCOPE_IDENTITY() Funktion:

insert into your_talble(col1,col2) values('blah','more blah') 
select scope_identity() 

weil höchsten Wertes der Auswahl wird wieder Fehler, wenn eine andere Anweisung einen Einsatz machen. Die Funktion scope_identity() gibt die Identität zurück, die im aktuellen Kontext (dh durch Ihre Anweisung) erstellt wurde.

4

SCOPE_IDENTITY() ist wahrscheinlich, was Sie wollen. Sie gibt die ID des letzten Datensatzes zurück, der von demselben Codekontext eingefügt wurde, in dem sie ausgeführt wird.

IDENT_CURRENT ('tablename') unterliegt Concurrency Probleme. Das heißt, es gibt keine Garantie, dass zwischen dem INSERT und dem Aufruf von IDENT_CURRENT kein weiterer Datensatz eingefügt wird.

Ich muss gestehen, ich bin mir nicht sicher, aus welcher Quelle des Erstaunens sich der Ausbruch des VillageIdiots bezieht, aber ich selbst bin ziemlich erstaunt, dass diese Frage kein Duplikat zu sein scheint.

+0

froh sein nicht als dup gekennzeichnet, ich es zuerst gefunden !! – htm11h

31

Wenn Sie SQL Server 2005 oder höher verwenden, können Sie die OUTPUT-Klausel verwenden.

create table T(
    pk int identity primary key, 
    dat varchar(20) 
); 
go 

insert into T 
output inserted.pk 
values ('new item'); 
go 

drop table T; 

Die Ausgabe kann sowohl an eine Tabelle als auch an den Client gerichtet werden. Beispiel:

create table T(
    pk int identity primary key, 
    dat varchar(20) 
); 

create table U(
    i int identity(1001,1) primary key, 
    T_pk int not null, 
    d datetime 
); 
go 


insert into T 
output inserted.pk, getdate() 
into U(T_pk,d) 
values ('new item'), ('newer item'); 
go 

select * from T; 
select * from U; 
go 

drop table T, U; 

Ab SQL Server 2008 können Sie "zusammensetzbare DML" für mehr Möglichkeiten verwenden.

+1

+1 erneut ein sehr guter Ansatz, der auch funktioniert, wenn die PK nicht eine Identität - gut calle –

+0

Es ist auch eine einzige Aussage eher als 2, die nützlich sein könnten – gbn

+0

+1: und lernte etwas Neues hier – van

2

Sie sollten scope_identity() verwenden. Und ich empfehle, die Anweisung insert und scope_identity() in die Transaktion einzufügen.

6
INSERT INTO YourTable (1, 2, etc.) 
OUTPUT inserted.yourIDcolumn 
VALUES (value1, value2, value...) 

Hinweis: Dies ist für MS SQL 2005 und höher

Verwandte Themen