Подтвердить что ты не робот

Получение новых идентификаторов после вставки

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

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() возвращает только последнюю введенную строку ID.

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

Один из способов, который приходит на ум, состоит в том, чтобы захватить текущую самую большую идентификацию из sometable и вставки_страницы scope_identity(), и использовать эти два значения для выбора из 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()

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

4b9b3361

Ответ 1

Используйте функцию 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

Ответ 2

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

Ответ 3

Пользователь этой сохраненной Procuedure

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


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 @[email protected]+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

Подробнее см. следующую ссылку http://jalpesh.blogspot.com/search?q=bulk+insert

Ответ 4

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