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

-- call 
exec CurePeriod @curDateTrick 

ストアドプロシージャで自分自身を呼び出すことはできますか? その権利はありますか?多くのありがとう。ストアドプロシージャ自体を呼び出す

+1

あなたはそれを条件付きで呼び出す必要があります。それ以外の場合は無限大の時間に自分自身を呼び出します – Developerzzz

+1

どのDBを使用していますか?あなたは何を達成したいですか?これは有効な呼び出しですが、無限ループに入ります。 – Ubercool

+0

SQL Serverでは、再帰ストアドプロシージャを記述できます。最大ネストレベルは32です。['@@ NESTLEVEL'](https://msdn.microsoft.com/en-us/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 ; 

と:あなたは、次のようなものを持っている必要がありますので、あなたの例では

は、 終了条件は、再帰の無限の深さを避けるために必要です

注:あなたの例は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%のケースでは、より良い方法があります。むしろあなたが達成しようとしていることの質問を投稿し、あなたが試したことを示して、人々に望ましい結果を得るためのより良い方法を提案させてください。

関連する問題