2015-10-13 59 views
0

我必须根据复杂查询编写动态数据透视表,并且我想使用公用表表达式创建数据集,在该数据集上我必须构建数据透视表,动态SQL和它编译如何在动态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 =

一个错误。如果我更换一组选定存储过程进行编译,但如果我运行它,我得到:

Invalid object name 'DatiCTE' 

回答

0

现在我切换到临时表:

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; 

但我对并发用户soume疑问。我尝试表变量,但不能用于动态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; 
+0

CTE的范围是保持动态SQL以外的代码 –

相关问题