返回标识作为输出参数或标量

将记录插入到具有标识列的表中时,可以使用SCOPE_IDENTITY()来获取该值。 在存储过程的上下文中,这将是推荐的返回标识值的方式:

  • 作为输出参数SET @RETURN_VALUE = SCOPE_IDENTITY()
  • 作为标量SELECT SCOPE_IDENTITY()
  • 其他方式?
  • 对每个人有利/弊?


    它的全部取决于你的客户端数据访问层。 许多ORM框架依赖于在插入操作期间显式查询SCOPE_IDENTITY。

    如果您完全控制数据访问层,那么返回SCOPE_IDENTITY()作为输出参数可能会更好。 在结果集中包装返回会增加不必要的元数据开销以描述结果集,并使代码复杂化以处理请求结果。

    如果您更喜欢结果集返回,那么使用OUTPUT子句可能会更好:

    INSERT INTO  MyTable (col1, col2, col3)
    OUTPUT INSERTED.id, col1, col2, col3
    VALUES (@col1, @col2, @col3);
    

    通过这种方式,您可以返回整个插入的行,包括默认和计算列,并且您将得到一个结果集,其中包含插入每行的一行,这可以正确使用面向集合的批插入。

    总的来说,当返回SCOPE_IDENTITY()作为结果集是一个很好的做法时,我看不到一个单一的案例。


    另一种选择是作为存储过程的返回值(我不建议这样做,因为这通常对于错误值来说是最好的)。

    我已经将它包括在当它插入一行时,这两个存储过程被其他SQL过程所占用,而前端无法使用OUTPUT参数(我相信.NET中的IBATIS):

    CREATE PROCEDURE My_Insert
        @col1            VARCHAR(20),
        @new_identity    INT    OUTPUT
    AS
    BEGIN
        SET NOCOUNT ON
    
        INSERT INTO My_Table (col1)
        VALUES (@col1)
    
        SELECT @new_identity = SCOPE_IDENTITY()
    
        SELECT @new_identity AS id
    
        RETURN
    END
    

    当从其他存储过程IMO调用时,输出参数在T-SQL中更容易使用,但某些编程语言对输出参数的支持很差或不支持,并且对结果集更好。


    我更愿意将身份值作为输出参数返回。 SP的结果应表明它是否成功。 值为0表示SP成功完成,非零值表示错误。 此外,如果您需要进行更改并从SP返回附加值,则除了添加其他输出参数外,您无需进行任何更改。

    链接地址: http://www.djcxy.com/p/94517.html

    上一篇: return identity as output parameter or scalar

    下一篇: Return value after INSERT