2017-12-28 23 views
0

私はストアドプロシージャでcteを使用しています。cteを複数回作成して削除する

CTEが自動的に削除されるように私は、それを解決し、私はすなわち、異なるIDのCTEを移入

どのように私は

おかげ

;WITH PAYOUT_CTE(REGNKEY, REGNTPE) AS (
    SELECT REG_KEY, 'Parent' 
    FROM ML_MSTR_REGN A (NOLOCK) 
    WHERE A.COMP_NO = @COMP_NO 
     AND  A.REG_KEY = @CUR_KEY 

    UNION ALL 

    SELECT B.REG_KEY, 'Child0' 
    FROM PAYOUT_CTE 
    INNER JOIN ML_MSTR_REGN B 
     ON B.COMP_NO = @COMP_NO 
      AND B.ORG_KEY = PAYOUT_CTE.REGNKEY 
      ) 
SELECT * INTO #PAYOUT_CTE_TMP FROM PAYOUT_CTE 

を落としたり、現在のCTEを削除することができ、それを複数回使用する必要が

insert文の後に テンポラリテーブル#PAYOUT_CTE_TMPだけが問題を引き起こしていました。

+2

私の理解では、CTEは通常のSQLコードにインライン化され、1つのステートメントに対してのみ存在します。ステートメントが終了したら、同じ名前の別のCTEを定義することができます。これはあなたの質問に答えますか? –

答えて

0

CTEコードをインラインテーブル評価関数に入れて呼び出す方法がわかります。

あなたのコードは次のようになります。その後、私はちょうど適用したり、外の入力値に基づいてデータを生成するには、このテーブル値関数には適用され越えることができ

CREATE FUNCTION TVFN_PAYOUT_CTE (@COMP_NO INT, @CUR_KEY INT) 
RETURNS TABLE 
AS 
RETURN (

WITH PAYOUT_CTE(REGNKEY, REGNTPE) AS (
    SELECT REG_KEY, 'Parent' 
    FROM ML_MSTR_REGN A (NOLOCK) 
    WHERE A.COMP_NO = @COMP_NO 
     AND  A.REG_KEY = @CUR_KEY 

    UNION ALL 

    SELECT B.REG_KEY, 'Child0' 
    FROM PAYOUT_CTE 
    INNER JOIN ML_MSTR_REGN B 
     ON B.COMP_NO = @COMP_NO 
      AND B.ORG_KEY = PAYOUT_CTE.REGNKEY 
      ) 
SELECT * 
FROM PAYOUT_CTE 
) 

COMP_NOCUR_KEY"TEST"テーブル内の値であれば、私は以下のように、これらの値とCTEを実行し、それらを保存するためにCOMP_NOCUR_KEYと行のそれぞれを使用することができます:

SELECT PC.* 
    INTO #PAYOUT_CTE_TMP 
FROM TEST T 
    CROSS APPLY TVFN_PAYOUT_CTE (T.COMP_NO, T.CUR_KEY) PC 

これを行うことによりCTEが再構築され、TESTテーブルから各行に対して実行されます。

+0

cteの結果を得るためにUDFを使います。タク –

+0

@ GLSOFTINDIAこれがうまくいけば、私はいくつかのアップフォースまたは受け入れられた答えに本当に感謝しています。 –

関連する問題