sql - obtener - scope_identity()
Obtener nuevos ID después de insertar (4)
Estoy insertando un grupo de filas nuevas en una tabla que se define de la siguiente manera:
CREATE TABLE [sometable](
[id] [int] IDENTITY(1,1) NOT NULL,
[someval] sometype NOT NULL
)
usando la siguiente inserción:
insert into sometable select somefield as someval from othertable
cuando termine, me gustaría saber las identificaciones de todas las filas recién insertadas. SCOPE_IDENTITY () solo devuelve la última fila de identificación insertada.
¿Cómo puedo obtener todas las nuevas identificaciones?
Un método que me viene a la mente sería tomar la identidad más grande actual de alguna tabla y el scope_identity () post-insert, y usar estos dos valores para seleccionar de alguna tabla. Por ejemplo:
declare @currentMaxId int;
select @currentMaxId=MAX(id) from sometable
insert into sometable select somefield as someval from othertable
select * from sometable where id>@currentMaxId and id<=SCOPE_IDENTITY()
¿Hay un mejor patrón?
Use la funcionalidad de SALIDA para tomar todo el ID INSERTADO de nuevo en una tabla.
CREATE TABLE MyTable
(
MyPK INT IDENTITY(1,1) NOT NULL,
MyColumn NVARCHAR(1000)
)
DECLARE @myNewPKTable TABLE (myNewPK INT)
INSERT INTO
MyTable
(
MyColumn
)
OUTPUT INSERTED.MyPK INTO @myNewPKTable
SELECT
sysobjects.name
FROM
sysobjects
SELECT * FROM @myNewPKTable
Usuario este Procuedure almacenado
esta será una clave primaria dinámica ..
CREATE PROCEDURE sp_BulkInsertCountry
(
@FilePath varchar(1000)
)
AS
BEGIN--PROCEDURE
--variable declaration
declare @SQL varchar(500)
declare @id int
declare @CountryName varchar(30) --Create temporary table for Country
CREATE TABLE #tmpCountry
(
CountryName varchar(30),
) ---executing bulk insert on temporary table
SET @SQL=''BULK INSERT #tmpCountry from '''''' + @FilePath + '''''' WITH (FIELDTERMINATOR ='''','''',ROWTERMINATOR=''''/n'''')''
EXEC(@sql) DECLARE cursor_Country CURSOR READ_ONLY FOR
select [CountryName] from #tmpCountry OPEN cursor_Country
FETCH NEXT FROM cursor_Country INTO @CountryName
WHILE @@FETCH_STATUS=0
BEGIN
SELECT @id=isnull(max(Countryid),0) from tblCountryMaster
SET @id=@id+1
INSERT INTO tblCountryMaster values(@Id,@CountryName)
FETCH NEXT FROM cursor_Country INTO @CountryName
END
CLOSE cursor_Country
DEALLOCATE cursor_Country
END--PROCEDURE GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
Para obtener más información, visite el siguiente enlace http://jalpesh.blogspot.com/search?q=bulk+insert
Y si desea el "control" en ADO.Net y obtenga los identificadores asignados a los niños y recupere los identificadores para que pueda actualizar su modelo: http://daniel.wertheim.se/2010/10/24/c-batch-identity-inserts/
crea una tabla para configurar todas las ID nuevas. luego haz un ciclo para todo el inserto. dentro del ciclo haga la inserción que desee con SCOPE_IDENTITY (). después de la inserción, obtenga la nueva ID e insértela en la nueva tabla que creó. al final, seleccione * de [newTable].