Sql server 如何在动态SQL中使用公共表表达式

Sql server 如何在动态SQL中使用公共表表达式,sql-server,tsql,common-table-expression,dynamic-sql,Sql Server,Tsql,Common Table Expression,Dynamic Sql,我必须基于一个复杂的查询编写一个动态透视,并且我想使用一个公共表表达式来创建数据集,我必须在该数据集上构建透视,以将其保持在动态sql之外,并对其进行编译 我的问题是,我不知道是否可以在一个集合中使用CTE,在这个集合中,我包装了必须执行的动态SQL 让我们看看代码: WITH DatiCTE AS ( SELECT ... ) SET @DynamicPivotQuery = N'SELECT IdActivity, ' + @Pivot

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

我的问题是,我不知道是否可以在一个集合中使用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替换集合,则会编译存储过程,但如果运行该存储过程,则会得到:

Invalid object name 'DatiCTE'

将带有DatiCTE AS的CTE
的定义移动到动态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;

现在我切换到临时表:

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中使用…

CTE的范围是将costant代码保留在动态sql之外