【问题标题】:Call stored procedure itself sql调用存储过程本身sql
【发布时间】:2017-04-13 05:51:39
【问题描述】:
ALTER PROCEDURE dbo.CurePeriod 
@curDate_p1 datetime

-- call
exec CurePeriod @curDateTrick

我可以在存储过程中调用自己吗? 这是正确的?非常感谢。

【问题讨论】:

  • 你必须有条件地调用它,否则它会在无限时间内调用他自己
  • 您使用的是哪个数据库?你想达到什么目标?顺便说一句,这是一个有效的调用,但它会进入无限循环。
  • 在 SQL Server 中,您可以编写递归存储过程。请记住,最大嵌套级别仅为 32。请参阅 @@NESTLEVEL
  • 您找到这个问题的答案了吗?如果它们都不相关,请选择最佳答案或回答您自己的问题,而不是无限期地打开它。

标签: sql stored-procedures recursion


【解决方案1】:

许多 DBMS 都支持递归,原则上,它的实现与您编写的非常相似。

在您的示例中,需要 退出条件 以避免无限深度的递归,因此您应该具有以下内容:

CREATE PROCEDURE dbo.CurePeriod (@curDate_p1 datetime , @OtherParam INT)
AS

  BEGIN
      IF @OtherParam < 10 THEN
          exec CurePeriod (@curDateTrick , @OtherParam + 1) ;
      END IF ;
  END ;

以及代码中的其他地方:

:
:
exec CurePeriod (@curDateTrick , 1) ;
:
:

注意事项:

(1) 您的示例似乎适用于 SQL-Server,因此您可能需要对我在此处发布的示例进行一些编辑。

(2) 我强制递归在 10 次调用后结束。

【讨论】:

    【解决方案2】:

    在内部调用存储过程时要格外小心,无限迭代可能会导致一些主要问题,具体取决于过程中正在执行的其他操作。

    如果你在 proc 中使用条件来确保只执行你想要的次数,那么你可以解决这个问题。

    BEGIN
    IF @TEST = 'VALUE'
        EXEC PROCNAME @PROCPARAM
    ELSE
        'SOMETHING ELSE'
    END IF ;
    

    【讨论】:

      【解决方案3】:

      您可以这样做,但您必须以某种方式管理如何摆脱执行(如果可能的话)。

      如果你创建一个存储过程,在自身内部执行该过程,然后执行它,它将无限执行,直到你遇到一个

      Maximum stored procedure, function, trigger, or view nesting level exceeded
      

      错误信息。

      在 99% 的情况下,会有更好的方法。而是发布一个关于您要达到什么目标的问题,并展示您已经尝试过什么,并让人们提出更好的方法来获得预期的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-10
        • 2015-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多