存储过程 - 将标识作为输出参数或标量返回

Nel*_*mel 43 sql-server stored-procedures

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

  1. 作为输出参数 SET @RETURN_VALUE = SCOPE_IDENTITY()
  2. 作为标量 SELECT SCOPE_IDENTITY()
  3. 其他方式?

各有利弊吗?

Tom*_*m H 41

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

我把它包含在插入单行的情况下,其中存储过程被其他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
Run Code Online (Sandbox Code Playgroud)

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


Rem*_*anu 38

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

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

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

INSERT INTO  MyTable (col1, col2, col3)
OUTPUT INSERTED.id, col1, col2, col3
VALUES (@col1, @col2, @col3);
Run Code Online (Sandbox Code Playgroud)

这样,您可以返回整个插入的行,包括默认行和计算列,并且您获得的结果集包含插入的每行的一行,这对于面向集的批量插入正常工作.

总的来说,在返回时我看不到一个案例,SCOPE_IDENTITY()因为结果集是一个好习惯.

  • @ Fernando68:我说你应该把它作为输出参数,而不是结果集 (4认同)