Sql server 如何在动态SQL中使用公共表表达式
我必须基于一个复杂的查询编写一个动态透视,并且我想使用一个公共表表达式来创建数据集,我必须在该数据集上构建透视,以将其保持在动态sql之外,并对其进行编译 我的问题是,我不知道是否可以在一个集合中使用CTE,在这个集合中,我包装了必须执行的动态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
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之外