【问题标题】:Return identity of last inserted row from stored procedure从存储过程返回最后插入行的标识
【发布时间】:2010-11-30 15:51:36
【问题描述】:

我正在尝试从存储过程返回最后插入行的标识。

我的代码的简化版本如下所示:

CREATE PROCEDURE [sp_name]
    @AuthorisationCode uniqueidentifier
AS
    INSERT INTO [tablename]
           ([AuthorisationCode]
           )
     VALUES
           (@AuthorisationCode
           )

 RETURN @@IDENTITY

GO

我通过 Enterprise library 4.1 中的 Execute Scalar 调用这个存储过程。

它返回空值。任何人都知道我做错了什么。

【问题讨论】:

  • 顺便说一句,最好不要用 sp_ 前缀命名 procs。但也许那是伪代码。
  • @Mark,谢谢你的好消息,但这只是伪代码:)
  • RETURNING 值通常保留用于错误处理(例如,0 以外的任何值表示存在错误)。
  • @brad 公平地说,它可以意味着任何东西
  • @Mark,是的,它可以表示你想要的任何东西;这就是为什么我说它“通常是保留的”。

标签: c# sql sql-server-2008 enterprise-library enterprise-library-4.1


【解决方案1】:

我想说你应该使用SCOPE_IDENTITY(),因为@@identity 将返回最后插入的东西的标识(如果同时运行多个查询,这可能不是你的存储过程)。

您还需要选择它,而不是返回它。

ExecuteScalar 将返回结果集第一行的第一列值。

所以...

SELECT SCOPE_IDENTITY();

可能是你想要的更多。

【讨论】:

    【解决方案2】:

    您应该使用 select 而不是 return,但您还应该使用 SCOPE_IDENTITY 来防止返回错误身份的问题,@@IDENTITY 不限于特定范围。

    SELECT SCOPE_IDENTITY()
    

    更多信息可以在这里找到:

    http://msdn.microsoft.com/en-us/library/ms190315.aspx

    【讨论】:

    • +1 希望我能投票不止一次;这是一个未被充分利用的关键字
    【解决方案3】:

    你应该使用select @@identity

    【讨论】:

    • 我不想对你投反对票,但你真的应该使用SCOPE_IDENTITY 而不是@@identity(见 MrEyes 回答)
    • @@identity 在这种情况下可能没问题。了解当前身份、范围身份和@@identity 之间的区别很重要,但@@identity 并不总是错误的。如果有一个触发器由于某种不虔诚的原因在插入时更改身份并且您想知道最后插入的身份怎么办?然后你需要@@identity 并且 scope_identity 不起作用。
    • 是的,布拉德,没错,在这里使用 scope_identity 是更好的选择。 (好吧,不是更好的选择,但是,我猜这取决于您的需要)。尽管如此,在我的回答中,我指的是“return”的用法。在这里投反对票是正确的选择,这是两者之间的重要区别。
    • @Patrick 是对的:@@identity 并不总是错的。 @futile,当您清楚地了解什么可以解决 OP 的直接问题时,我认为投票不是正确的选择:SELECTING 使用 ExecuteScalar 时的结果@
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多