Erste neue IDs nach Einsatz
-
03-07-2019 - |
Frage
Ich bin ein paar neue Zeilen in eine Tabelle einfügen, die wie folgt definiert ist:
CREATE TABLE [sometable](
[id] [int] IDENTITY(1,1) NOT NULL,
[someval] sometype NOT NULL
)
mit dem folgende einfügen:
insert into sometable select somefield as someval from othertable
, wenn ich fertig bin, würde Ich mag die IDs aller neu eingefügten Zeilen kennen. SCOPE_IDENTITY () nur liefert die ID letzte Zeile eingefügt.
Wie kann ich alle neuen IDs bekommen?
Ein Verfahren, das in dem Sinne wäre die aktuelle größte Identität von sometable zu greifen und die scope_identity () Post-Einsatz, und verwenden Sie diese beiden Werte von sometable auszuwählen. Zum Beispiel:
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()
Gibt es ein besseres Muster?
Lösung
Mit der OUTPUT-Funktionalität all INSERTED- Id zurück in eine Tabelle greifen.
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
Andere Tipps
Und wenn Sie die „Kontrolle“ in ADO.Net wollen und die IDs Childs zugewiesen bekommen und bekommen die IDs zurück, so dass Sie Ihr Modell aktualisieren: http://daniel.wertheim.se/2010/10/ 24 / c-Batch-Identität-Einsätze /
Benutzer diese gespeicherte Procuedure
Dies wird ein dynamischer Primärschlüssel sein ..
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
Für weitere Informationen besuchen folgenden Link http://jalpesh.blogspot.com/search?q=bulk+insert
erstellen eine Tabelle, die alle neuen IDs einzustellen. macht dann eine Schleife für alle Einsatz. machen innerhalb der Schleife des Einsatzes Sie mit SCOPE_IDENTITY möchten (). Nach dem Einsatz der neuen ID bekommen und es in die neue Tabelle einfügen Sie erstellt. am Ende select * from [newtable].