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

时间:2010-06-29 15:57:35

标签: sql-server stored-procedures

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

  1. 作为输出参数SET @RETURN_VALUE = SCOPE_IDENTITY()
  2. 作为标量SELECT SCOPE_IDENTITY()
  3. 另一种方式?
  4. 每个人的利弊是什么?

5 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:37)

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

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

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

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

通过这种方式,您可以返回整个插入的行,包括默认列和计算列,并且每个插入的行都会得到一个包含一行的结果集,这对于面向集合的批量插入正常工作。

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

作为记录集或输出参数。后者的开销较小,我倾向于使用它而不是单个列/行记录集。

如果我希望> 1行,我会使用OUTPUT子句和记录集

返回值通常用于错误处理。

答案 4 :(得分:1)

SELECT IDENT_CURRENT('databasename.dbo.tablename') AS your identity column;