调用存储过程本身sql

时间:2016-11-29 09:40:37

标签: sql stored-procedures recursion

ALTER PROCEDURE dbo.CurePeriod 
@curDate_p1 datetime

-- call
exec CurePeriod @curDateTrick

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

3 个答案:

答案 0 :(得分:1)

在自己调用存储过程时要格外小心,无限次迭代会导致一些重大问题,具体取决于proc中的其他操作。

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

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

答案 1 :(得分:1)

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

如果你创建一个存储过程,在自己内部执行所述过程然后执行它,它将只是无限执行,直到你遇到一个

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

错误消息。

在99%的情况下,会有更好的方法。而是提出一个问题,即你想要实现的目标,并展示你所尝试的内容,并让人们建议更好的方法来获得理想的结果。

答案 2 :(得分:0)

许多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次调用后结束。