我正在将一堆新行插入到表中,该表定义如下:

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

有更好的模式吗?

有帮助吗?

解决方案

使用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

其他提示

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

使用此存储的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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top