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?

War es hilfreich?

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].

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top