web-dev-qa-db-fra.com

Obtenir de nouveaux identifiants après insertion

J'insère une série de nouvelles lignes dans un tableau défini comme suit:

CREATE TABLE [sometable](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [someval] sometype NOT NULL
)

en utilisant l'insertion suivante:

insert into sometable select somefield as someval from othertable

lorsque j'aurai terminé, j'aimerais connaître les identifiants de toutes les nouvelles lignes insérées. SCOPE_IDENTITY () ne renvoie que l'ID de la dernière ligne insérée.

Comment puis-je obtenir tous les nouveaux identifiants?

Une méthode qui me vient à l’esprit serait de récupérer l’identité la plus grande actuelle de sometable et la post-insertion de scope_identity (), et d’utiliser ces deux valeurs pour effectuer une sélection à partir de sometable. Par exemple:

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()

Y a-t-il un meilleur modèle?

36
spender

Utilisez la fonctionnalité OUTPUT pour récupérer tous les identifiants INSERTED dans une table.

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
84
Robin Day

Et si vous voulez le "contrôle" dans ADO.Net et obtenir les identifiants attribués aux enfants et les récupérer afin que vous puissiez mettre à jour votre modèle: http://daniel.wertheim.se/2010/10/24/inserts d'identité de lot/ /

1
Daniel

Utilisateur cette Procuedure stockée

ce sera une clé primaire dynamique.


SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

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

Pour plus de détails, visitez le lien suivant http://jalpesh.blogspot.com/search?q=bulk+insert

0
Jalpesh Vadgama

créez une table pour définir tous les nouveaux ID. puis créez une boucle pour tous les insertions. à l'intérieur de la boucle réalisez l'insertion souhaitée avec SCOPE_IDENTITY (). après l'insertion récupérez le nouvel ID et insérez-le dans la nouvelle table pour laquelle vous avez créé. Pour finir, sélectionnez * à partir de [newTable].

0
SQLMaster