2010-10-13 12 views
5

¿Es posible obtener nuevos valores para Id (IDENTIDAD) antes de insertar datos en una tabla?¿Es posible obtener nuevos valores para Id (IDENTIDAD) antes de insertar datos en una tabla?

Es es posible escribir algo así:

INSERT INTO Table1 
SELECT *GET_NEW_IDENTITY*, Field1, Field2 FROM Table2 

necesito los valores de Id porque quiero insertar datos en la Tabla 1 y, justo después, insertar datos de otra tabla que tiene una clave externa vinculado a la Tabla1 (con Id)

Respuesta

6

IDENT_CURRENT. Devuelve el último valor de identidad generado para una tabla o vista especificada. El último valor de identidad generado puede ser para cualquier sesión y cualquier ámbito.

SCOPE_IDENTITY. Devuelve el último valor de identidad insertado en una columna de identidad en el mismo ámbito. Un alcance es un módulo: un procedimiento almacenado, desencadenador, función o lote.

OUTPUT. Devuelve información de, o expresiones basadas en, cada fila afectada por una instrucción INSERT, UPDATE, DELETE o MERGE. [...] La cláusula OUTPUT puede ser útil para recuperar el valor de la identidad o las columnas calculadas después de una operación INSERT o UPDATE.

+2

¡Nunca bajo ninguna circunstancia use ident_current para esto, NO devolverá el resultado correcto si tiene múltiples usuarios! La salida es la mejor opción o scope_identity() si su versión no admite la cláusula de salida. – HLGEM

0

No, porque es el acto de agregar una fila que crea el nuevo valor de identidad.

Para hacer lo que quiera,

SELECT newid = @@identity FROM table 

justo después del INSERT

+0

@@ identidad es muy peligroso use y no devolverá de manera confiable los resultados correctos. No deberías usarlo para este propósito. – HLGEM

0

¿Por qué necesitaría para obtener el valor de identidad antes de hacer la inserción? Simplemente haga la inserción a Table2 devolviendo SCOPE_IDENTITY() y luego use el valor Id resultante para su inserción en Table1.

+0

Porque quiero hacer una inserción por lotes (no insertar fila por fila) para perf –

+1

En ese caso, no, no puede hacerlo. Debes obtener la identidad después de cada inserción de fila, como @smirkingman indicó en su respuesta. –

+0

@AJ: Ok, gracias –

2

también puede tener la instrucción de inserción devolver el valor recién insertado para su uso posterior. por ejemplo

create table demo(Id int identity primary key, data varchar(10)) 
go 
insert into demo(data) output inserted.Id values('something') 
0

Esto es solo una demostración rápida. Puede usar una nueva ID para insertar para actualizar, insertar en otra tabla, consulta, etc. de otra manera. Con la esperanza de que no insertar errores en la escritura durante el formateo, la edición posterior

-- run [1] before this script once to have environment 

--create temporary table once if not dropped after 
-- really only ID field is needed, the others are for illustration 
create table #temp_id (Id int, d1 int, d2 int) 

select * from Table2;-- this is read-only, filled once here source 
select * from Table1;--interesting for following runs 

insert into Table1 
    OUTPUT INSERTED.id 
    -- really only ID is needed, the rest is for illustration 
    , inserted.d1, inserted.d2 INTO #temp_id 
select field1, field2, null-- null to be merged later 
-- or inserted/updated into another table 
    from Table2; 

select * from Table1; 
select * from #temp_id; 


MERGE Table1 AS TARGET 
    USING #temp_id AS SOURCE 
     ON (TARGET.id = SOURCE.id) 
    WHEN MATCHED 
--AND OR are redundant if Table1.ID is PK  
    THEN 
    UPDATE SET TARGET.IDnew = SOURCE.id; 


select * from Table1; 


--drop table #temp_id 
--drop table table1 
--drop table table2 

[1]
La reproducción de las tablas de la pregunta y rellenar con los datos

create table Table1(Id int identity primary key, d1 int, d2 int, IDnew int) 
create table Table2(field1 int, field2 int) 
insert into table2 values(111,222) 
insert into table2 values(333,444) 
Cuestiones relacionadas