如何使用存储过程插入数据表时获取范围标识列

我正在使用存储过程插入datatable并在之前创建了一个类型表,查询是我想要取回已在此会话中插入的所有’ProdID’。 对于单个插入,我可以获得范围标识,但我想获得最近插入的所有内容。

提前致谢。

[dbo].[sp_Isert] (@dt_Product Product_Table READONLY, @ProdID int out) AS INSERT into tblProduct (Name,Batch,Qty,ExpDate) SELECT Name, Batch, Qty, ExpDate FROM @dt_Product; set @ProdID = Scope_Identity( ) select Scope_Identity( ) ProdID 

不要使用scope_identity() – 而是使用output子句。 请注意,SQL Server不支持将表值参数作为out参数,这意味着从存储过程返回记录集的唯一方法是使用output子句(不是表)或执行select语句。

另外,不要将sp前缀用于存储过程。
Microsoft正在将此前缀用于系统过程,因此您可能会发生名称冲突。

 ALTER PROCEDURE [dbo].[stp_Isert] (@dt_Product Product_Table READONLY) AS INSERT into tblProduct (Name,Batch,Qty,ExpDate) OUTPUT Inserted.Id -- This will return a recordset with the inserted ids to the calling application. SELECT Name, Batch, Qty, ExpDate FROM @dt_Product; 

更新

我已经制作了一个示例脚本供您检查。 当我在我的SQL Server实例上运行它时,我得到了预期的结果:

 CREATE TABLE tbl_TestOutputClause (Id int identity(1,1), Col int ); GO CREATE TYPE udt_TestOutputClauseIntegers AS TABLE (Value int); GO CREATE PROCEDURE stp_TestOutputClauseInsert (@Values dbo.udt_TestOutputClauseIntegers READONLY) AS INSERT INTO tbl_TestOutputClause(Col) OUTPUT INSERTED.Id SELECT Value FROM @Values; GO CREATE PROCEDURE stp_TestOutputClauseGetInsertedValues AS DECLARE @Ids AS TABLE (Id int); DECLARE @Vals dbo.udt_TestOutputClauseIntegers; INSERT INTO @Vals (Value) VALUES (1), (2), (3); INSERT INTO @Ids EXEC stp_TestOutputClauseInsert @Vals; -- should return three rows with the values 1, 2 and 3. SELECT * FROM @Ids; GO EXEC stp_TestOutputClauseGetInsertedValues; -- clean up DROP TABLE tbl_TestOutputClause; DROP PROCEDURE stp_TestOutputClauseInsert; DROP PROCEDURE stp_TestOutputClauseGetInsertedValues DROP TYPE udt_TestOutputClauseIntegers;