SQL Server-存储过程-返回标识作为输出参数或s

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

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

每个都有利弊吗?

Nelson Rothermel asked 2020-08-01T15:58:18Z
5个解决方案
41 votes

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

我已将其包括在内,当存储过程被其他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中更容易使用输出参数,但是某些编程语言对输出参数的支持不佳或根本不支持,并且对结果集的使用更好。

Tom H answered 2020-08-01T15:59:20Z
38 votes

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

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

如果您希望返回结果集,那么再次争论使用OUTPUT子句会更好:

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

这样,您可以获取整个插入的行,包括默认列和计算列,并获得一个包含每一行插入一行的结果集,该结果集可以正确地用于面向集合的批处理插入。

总的来说,返回SCOPE_IDENTITY()作为结果集是一个很好的习惯,我看不到任何情况。

Remus Rusanu answered 2020-08-01T15:58:51Z
3 votes

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

TLiebe answered 2020-08-01T15:59:41Z
2 votes

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

如果我希望行数大于1,则可以使用OUTPUT子句和一个记录集

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

gbn answered 2020-08-01T16:00:10Z
1 votes
SELECT IDENT_CURRENT('databasename.dbo.tablename') AS your identity column;
billah77 answered 2020-08-01T16:00:26Z
translate from https://stackoverflow.com:/questions/3142444/stored-procedure-return-identity-as-output-parameter-or-scalar