2016-11-29 52 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%的情況下,會有更好的方法。而是發佈你想要達到什麼樣的問題,並展示你所嘗試過的東西,並讓人們提出獲得理想結果的更好方法。