返回标识作为输出参数或标量
将记录插入到具有标识列的表中时,可以使用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