如何在动态 SQL 中使用常见的 table 表达式

How to use common table expression in a dynamic SQL

我必须编写一个基于复杂查询的动态数据透视表,我想使用一个通用的 table 表达式来创建数据集,我必须在该数据集上构建数据透视表以将其保持在动态 sql 并编译

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

让我们看看代码:

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'

将 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;

现在我切换到临时 table:

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;

但我对并发用户有一些疑问。我尝试 table 变量但不能用于动态 sql...