43

我将一堆新行插入到定义如下的表中:

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

有更好的模式吗?

4

5 回答 5

106

使用 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
于 2009-05-01T10:55:26.637 回答
1

如果您想要 ADO.Net 中的“控制”并获取分配给孩子的 id 并取回 id 以便您可以更新您的模型: http ://daniel.wertheim.se/2010/10/24/c-批量身份插入/

于 2010-10-24T18:16:21.270 回答
0

使用此存储的程序

这将是一个动态主键..


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

于 2009-05-01T11:19:43.020 回答
0

创建一个表来设置所有新的 ID。然后为所有插入创建一个循环。在循环内使用 SCOPE_IDENTITY() 进行插入。插入后获取新 ID 并将其插入到您为其创建的新表中。最后从 [newTable] 中选择 *。

于 2009-05-01T17:03:11.480 回答
0

MERGE扩展@Robin Day 的答案——您可以使用技巧将您的临时 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 的巧妙回答: SQL Server 中插入的 ID 列表

于 2021-05-13T17:16:22.220 回答