【问题标题】:create cte multiple times and drop cte [closed]多次创建 cte 并删除 cte [关闭]
【发布时间】:2018-06-08 18:18:11
【问题描述】:

我在存储过程中使用 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 在插入语句后自动删除 只有临时表 #PAYOUT_CTE_TMP 导致了问题。

【问题讨论】:

  • 我的理解是,CTE 只是被内联到常规 SQL 代码中,并且它只存在于单个语句中。语句结束后,您可以定义另一个具有相同名称的 CTE。这能回答你的问题吗?

标签: sql tsql sql-server-2008-r2 common-table-expression


【解决方案1】:

我能看到这个工作的唯一方法是将 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 表中的每一行运行。

【讨论】:

  • 很好地使用 UDF 来获得 cte 结果。谢谢。
  • @GLSOFTINDIA 如果这可行,我真的很感激一些赞成或接受的答案。
  • @Radu Gheorghiu 来晚了,但你的回答对我很有帮助,我给了你当之无愧的支持!
  • @DevinVyain 很高兴它在这么多年后仍然有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
相关资源
最近更新 更多