Получение новых идентификаторов после вставки - PullRequest
36 голосов
/ 01 мая 2009

Я вставляю кучу новых строк в таблицу, которая определяется следующим образом:

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

используя следующую вставку:

insert into sometable select somefield as someval from othertable

когда я закончу, я хотел бы знать идентификаторы всех вновь вставленных строк. SCOPE_IDENTITY () возвращает идентификатор только последней вставленной строки.

Как я могу получить все новые идентификаторы?

Один метод, который приходит на ум, состоит в том, чтобы получить текущую наибольшую идентичность из sometable и scope_identity () post-insert и использовать эти два значения для выбора из sometable. Например:

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

Есть ли лучший шаблон?

Ответы [ 4 ]

86 голосов
/ 01 мая 2009

Используйте функцию OUTPUT, чтобы собрать все INSERTED Id обратно в таблицу.

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
1 голос
/ 24 октября 2010

И если вам нужен «контроль» в ADO.Net и получить идентификаторы, назначенные для childs и вернуть идентификаторы, чтобы вы могли обновить свою модель: http://daniel.wertheim.se/2010/10/24/c-batch-identity-inserts/

0 голосов
/ 01 мая 2009

создать таблицу для установки всех новых идентификаторов. затем сделайте петлю для всех вставок. внутри цикла сделайте нужную вставку с помощью SCOPE_IDENTITY (). после вставки получите новый идентификатор и вставьте его в новую таблицу, для которой вы создали. в конце выберите * из [newTable].

0 голосов
/ 01 мая 2009

Пользователь хранится в Procuedure

это будет динамический первичный ключ ..

<code>
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO</p>

<p>CREATE PROCEDURE sp_BulkInsertCountry
(
@FilePath varchar(1000)
)
AS
BEGIN--PROCEDURE
--variable declaration
declare @SQL varchar(500)
declare @id int
declare @CountryName varchar(30)</p>

<p>--Create temporary table for Country
CREATE TABLE #tmpCountry
(
CountryName varchar(30),
)</p>

<p>---executing bulk insert on temporary table
SET @SQL='BULK INSERT #tmpCountry from ''' + @FilePath + ''' WITH (FIELDTERMINATOR ='','',ROWTERMINATOR=''\n'')'
EXEC(@sql)</p>

<p>DECLARE cursor_Country CURSOR READ_ONLY FOR
select [CountryName] from #tmpCountry</p>

<p>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</p>

<p>GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

для более подробной информации перейдите по следующей ссылке http://jalpesh.blogspot.com/search?q=bulk+insert

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...