【问题标题】:How to get Scope Identity Column while inserting datatable using stored procedure如何在使用存储过程插入数据表时获取范围标识列
【发布时间】:2019-03-19 12:22:11
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    不要使用scope_identity() - 请改用output 子句。 请注意,SQL Server 不支持将表值参数作为输出参数,这意味着从存储过程返回记录集的唯一方法是使用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;
    

    【讨论】:

    • 仍然一无所获,实际上我正在插入一个表 3 记录,我想获取已插入此存储过程会话的那 3 条记录的 ID。示例 ProdID 名称 批次数量 ExpDate 2 ABC S4 3 2018-6-31 3 DEF D3 5 2018-6-31 4 GHI U15 7 2018-6-31
    • 我用示例脚本编辑了我的答案。请检查。
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    相关资源
    最近更新 更多