【问题标题】:How to use common table expression in a dynamic SQL如何在动态 SQL 中使用公用表表达式
【发布时间】:2015-10-13 22:22:31
【问题描述】:

我必须基于复杂查询编写动态数据透视表,并且我想使用公用表表达式创建数据集,我必须在该数据集上构建数据透视表以将其保留在动态 sql 之外并进行编译

我的问题是我不知道我是否可以在我包装我必须执行的动态 SQL 的 SET 中使用 CTE。

让我们看看代码:

WITH DatiCTE AS
    (
    SELECT ...
    )

    SET @DynamicPivotQuery = 
          N'SELECT IdActivity, ' + @PivotSelectColumnNames + '
    FROM DatiCTE
    PIVOT(SUM(NumOfDays) 
          FOR Area IN (' + @PivotColumnNames + ')) AS PVTTable'
          WHERE 1 = 1

EXEC sp_executesql @DynamicPivotQuery

这样我在SET @DynamicPivotQuery =附近得到一个错误

如果我用 SELECT 替换 SET,则编译存储过程,但如果我运行它,我会得到:

Invalid object name 'DatiCTE'

【问题讨论】:

    标签: sql-server tsql common-table-expression dynamic-sql


    【解决方案1】:

    将 CTE WITH DatiCTE AS 的定义移动到动态 sql 中,如下所示:

    SET @DynamicPivotQuery = 
      N'WITH DatiCTE AS
        (
           SELECT ...
        )
        SELECT IdActivity, ' + @PivotSelectColumnNames + '
        FROM DatiCTE
        PIVOT(SUM(NumOfDays) 
          FOR Area IN (' + @PivotColumnNames + ')) AS PVTTable'
          + 'WHERE 1 = 1';
    
    EXEC sp_executesql @DynamicPivotQuery;
    

    【讨论】:

    • CTE 的范围是将成本代码保持在动态 SQL 之外
    【解决方案2】:

    现在我切换到临时表:

    SELECT ...
    INTO @TempTable
    
    SET @DynamicPivotQuery = 
      N'
        SELECT IdActivity, ' + @PivotSelectColumnNames + '
        FROM @TempTable
        PIVOT(SUM(NumOfDays) 
          FOR Area IN (' + @PivotColumnNames + ')) AS PVTTable'
          + 'WHERE 1 = 1';
    
    EXEC sp_executesql @DynamicPivotQuery;
    

    但我对并发用户有些怀疑。我尝试了表变量,但不能在动态 sql 中使用...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-02
      • 2010-09-26
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多