将记录插入带有标识列的表时,可以使用SCOPE_IDENTITY()来获取该值。在存储过程的上下文中,这将是返回标识值的推荐方法:
SET @RETURN_VALUE = SCOPE_IDENTITY()
SELECT SCOPE_IDENTITY()
每个人的利弊是什么?
答案 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;