多次创建cte并删除cte [关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多次创建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在insert语句后自动删除,只有临时表#PAYOUT_CTE_TMP导致了问题。

答案

我能看到这个工作的唯一方法是将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"表中的值,我可以使用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表中为每一行运行。

以上是关于多次创建cte并删除cte [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

防止递归 CTE 多次访问节点

从CTE删除时出错

SQL Server临时表表标量和CTE

T-SQL 之 公用表表达式(CTE)

SQL 公用表表达式(CTE)

用于动态查找表、DB2 或 SQL Server 的紧凑 CTE 语法