2009-09-01 20 views
17

Tengo una clave principal configurada para incrementar automáticamente.¿Cómo puedo insertar en una tabla y recuperar el valor de la clave principal?

Estoy haciendo varias consultas y necesito recuperar ese valor de clave primaria para usar como una clave externa en otra tabla (IsIdentity = TRUE).

¿Hay alguna forma elegante de recuperar el valor de la clave primaria cuando realizo una consulta de inserción? Ahora estoy requiriendo y obteniendo el mayor valor en esa columna que parece realmente hacky.

¿Alguna sugerencia?

Respuesta

25
insert into YourTable values (...) 

obtener el nuevo PK con SCOPE_IDENTITY()

select scope_identity() 
+1

1 Sí, utilizando SCOPE_IDENTITY() es la forma más confiable y eficiente para ir! –

+0

NO es el mejor método. – HLGEM

+0

@HLGEM ¿entonces qué es? – paz

2

Santa mierda !!!

sólo llamar SCOPE_IDENTITY() función:

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

debido a la selección de alto valor volverá error si cualquier otra declaración crea un inserto. la función scope_identity() devuelve la identidad creada en el contexto actual (es decir, por su instrucción)

4

SCOPE_IDENTITY() es probablemente lo que desea. Devuelve el ID del último registro insertado por el mismo contexto de código en el que se ejecuta.

IDENT_CURRENT ('tablename') está sujeto a problemas de concurrencia. Es decir, no hay garantía de que no se insertará otro registro entre INSERT y la llamada a IDENT_CURRENT.

Debo confesar que no estoy seguro de a qué fuente de asombro se refiere el arrebato de VillageIdiot, pero yo mismo estoy bastante sorprendido de que esta pregunta no parezca ser un duplicado en absoluto.

+0

contenta de que no esté marcada como un dup, ¡la encontré primero! – htm11h

31

Si está utilizando SQL Server 2005 o posterior, puede usar la cláusula OUTPUT.

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; 

La salida se puede dirigir a una mesa así como al cliente. Por ejemplo:

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; 

A partir de SQL Server 2008, puede usar "DML compilable" para obtener más posibilidades.

+1

+1 otro muy buen enfoque, que también funciona si el PK no es una identidad - buena callè –

+0

También es una única declaración en lugar de 2 que podría ser útil – gbn

+0

+1: y aprendí algo nuevo aquí – van

2

Debe usar scope_identity(). Y recomiendo envolver insertar instrucción y scope_identity() en la transacción.

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

Nota: Esto es para MS SQL 2005 y mayor

Cuestiones relacionadas