Получение новых идентификаторов после вставки
Я вставляю кучу новых строк в таблицу, которая определяется следующим образом:
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()
Есть ли лучший шаблон?
Ответы
Ответ 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].