使用存储过程在插入数据表时如何获取作用域标识列

时间:2018-10-11 09:33:45

标签: c# sql asp.net sql-server

我正在使用存储过程插入数据表,并在之前创建了类型表, 查询是我想找回已在此会话中插入的所有“ 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

1 个答案:

答案 0 :(得分:0)

请勿使用scope_identity(),而应使用output子句。 请注意,SQL Server不支持将表值参数作为out参数,这意味着从存储过程中返回记录集的唯一方法是使用output子句(不进入表)或执行{{1 }}声明。

此外,请勿对存储过程使用select前缀。
Microsoft在系统过程中使用此前缀,因此您可能会遇到名称冲突。

sp

更新

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

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;