【问题标题】:What should an INSERT stored procedure do with the Identity value?INSERT 存储过程应该如何处理 Identity 值?
【发布时间】:2011-01-05 21:03:17
【问题描述】:

我需要编写一个存储过程来向表中插入一行。该表有一个名为 ID 的标识列。我的问题是我应该返回值吗?如果是,如何返回?

据我所知,

  • 我可以将它作为返回值返回,
  • 我可以将它作为输出参数返回,或者
  • 我对此无能为力。

默认情况下,数据库程序员会做什么?

【问题讨论】:

    标签: sql-server stored-procedures return-value identity


    【解决方案1】:

    “这取决于。”

    大多数时候,我会忽略它。大多数呼叫者不需要它。如果您不了解您的消费者,那么我可能会将其作为结果集返回(因此您不会将附加参数强加给不需要它的人。)

    【讨论】:

    • 我同意这一点。问题是,有一天您可能会发现自己需要插入两到三行来为请求提供服务,这时您将不得不对返回 ID 的方式进行重大更改。
    【解决方案2】:

    如果它应该在某天使用,我更喜欢作为返回值返回。

    如果它没用,那么我不会在这里增加额外的复杂性。

    【讨论】:

      【解决方案3】:

      我同意乔的观点——这取决于。返回它的一个好处是您的调用应用程序可以使用 ID 的存在作为成功的指示。

      【讨论】:

        【解决方案4】:

        通常我会返回整个新行,其中当然包括 indentity 列的值。我返回整个新行的原因是因为很可能其他列通过触发器或其他进程添加到该行,调用应用程序或进程会发现拥有新行很有用。

        【讨论】:

          【解决方案5】:

          我通常将其添加为 out 参数,并将返回值为 0 表示成功或非 0 表示失败。

          【讨论】:

            【解决方案6】:

            如果您正在寻找一种编写所有插入过程的真正方法,那么您就是在浪费时间。在您的数据库中总会有一个表要求您以某种方式违反自己的约定。您可以期望的最好结果是一套通用的一致性指南(而不是规则)。

            对于一般一致性指南,我建议如下:

            • 返回值始终为int,不能更改。因此,最好保留返回零表示成功或返回@@error 表示失败。
            • 如果您有一小部分标量值要发回,则输出参数比默认结果集更有效。因此,您可以通过这种方式返回 @@identity 值和任何其他自动生成的值(例如 GUID、时间戳)。

            【讨论】:

            • 感谢您的回复。我从其他地方的经验中知道,总是要做出妥协,所以我在寻找一个默认的立场,而不是一个伟大的事实。尽管其他帖子与您的观点一致,但我接受了它,因为它很清楚并提供了额外的信息。
            猜你喜欢
            • 1970-01-01
            • 2013-01-05
            • 1970-01-01
            • 2015-09-11
            • 2019-08-31
            • 2019-09-25
            • 1970-01-01
            • 2010-09-22
            • 2011-03-29
            相关资源
            最近更新 更多