我正在将一堆新行插入到表中,该表定义如下:
CREATE TABLE [sometable](
[id] [int] IDENTITY(1,1) NOT NULL,
[someval] sometype NOT NULL
)
使用以下插入内容:
insert into sometable select somefield as someval from othertable
当我完成后,我想知道所有新插入的行的ID。 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()
有更好的模式吗?
答案 0 :(得分:86)
使用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 :(得分:1)
如果您想在ADO.Net中使用“控件”并将ID分配给子项并获取ID,以便您可以更新模型: http://daniel.wertheim.se/2010/10/24/c-batch-identity-inserts/
答案 2 :(得分:0)
使用此存储的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 @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
有关详细信息,请访问以下链接 http://jalpesh.blogspot.com/search?q=bulk+insert
答案 3 :(得分:0)
创建一个表来设置所有新ID。 然后为所有插入创建一个循环。 在循环内部使用SCOPE_IDENTITY()创建所需的插入。 插入后获取新ID并将其插入到您为其创建的新表中。 最后从[newTable]中选择*。
答案 4 :(得分:0)
扩展@Robin Day 的回答——您可以使用 MERGE
技巧将临时 ID 映射到新 ID。
DECLARE @Keys TABLE (TempId INT, RealId INT)
MERGE MyTable
USING @NewStuff t
ON 1 = 0
WHEN NOT MATCHED THEN
INSERT (col1, col2, col3)
VALUES (t.col1, t.col2, t.col3)
OUTPUT t.TempId, Inserted.RealId INTO @Keys
来自@Ivan Starostin 的巧妙回答: List of inserted ID in SQL Server