多次创建CTE并删除CTE



我在存储过程中使用CTE。

我必须多次使用它,即用于不同ID的填充CTE

如何删除或删除电流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只有temp表#payout_cte_tmp引起了问题。

我能看到此工作的唯一方法是,如果您将CTE代码放在inline表中有价值的函数并调用。

您的代码看起来像:

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"表中的值,我可以使用COMP_NOCUR_KEY的每个行将CTE运行使用这些值并保存它们,如下面:

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

这样做,重建CTE并从TEST表为每行跑步。

最新更新