2016-11-29 56 views
1
ALTER PROCEDURE dbo.CurePeriod 
@curDate_p1 datetime 

-- call 
exec CurePeriod @curDateTrick 

我可以在存储过程中调用自己吗? 它的权利?多谢。调用存储过程本身sql

+1

你必须有条件地调用它否则它会在无限时间将他称为自我 – Developerzzz

+1

你正在使用哪个数据库?你想实现什么?顺便说一下,这是一个有效的通话,但它会无限循环。 – Ubercool

+0

在SQL Server中,您可以编写递归存储过程。请记住,最大嵌套级别只有32个。请参阅['@@ NESTLEVEL'](https://msdn.microsoft.com/zh-cn/library/ms187371.aspx) –

回答

0

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

在你的榜样,需要退出条件避免递归的无限深度,所以你应该有类似以下内容:

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

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

    BEGIN 
     IF @OtherParam < 10 THEN 
      exec CurePeriod (@curDateTrick , @OtherParam + 1) ; 
     END IF ; 
    END ; 
在你的代码

和其他地方

备注:

(1)您的示例似乎是针对SQL-Server的,因此您可能需要对例如我在这里发布。 (2)我强制递归10次后调用结束。

1

调用存储过程本身时要特别小心,无限迭代可能会导致一些主要问题,这取决于proc中正在做什么。

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

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

你可以做到这一点,但你必须以某种方式管理你将如何摆脱执行(如果可能的话)。

如果您创建一个存储过程,本身内执行所述处理程序,然后执行它,它只是执行与

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

错误信息infinately,直到你得到满足。

在99%的情况下,会有更好的方法。而是发布你想要达到什么样的问题,并展示你所尝试过的东西,并让人们提出获得理想结果的更好方法。