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

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

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

任何优点/缺点每个?

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

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

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

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

这样你就可以得到整个插入的行,包括默认的和计算的列,并且你得到一个结果集,每行插入一行,这对于面向集合的批量插入是正确的。

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

另一个select将作为存储过程的返回值(我不build议这样做,因为这通常是最好的错误值)。

我已经把它包括在它插入一行时,其他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返回附加值,则不需要进行任何更改,只需添加一个额外的输出参数即可。

作为logging集或输出参数。 后者有更less的开销,我倾向于使用,而不是单列/行logging集。

如果我期望> 1行,我会使用OUTPUT子句和logging集

返回值通常用于error handling。

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