Как использовать общее табличное выражение в динамическом SQL

Мне нужно написать динамическую сводную таблицу на основе сложного запроса, и я хочу использовать общее табличное выражение для создания набора данных, на котором я должен построить сводную информацию, чтобы он оставался вне динамического sql и скомпилировал его.

Моя проблема в том, что я не знаю, могу ли я использовать CTE в SET, где я оборачиваю динамический 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 =

Если я заменю SET на SELECT, хранимая процедура скомпилируется, но если я ее запущу, я получу:

Invalid object name 'DatiCTE'

person gt.guybrush    schedule 13.10.2015    source источник


Ответы (2)


Переместите определение 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;
person Mahmoud Gamal    schedule 13.10.2015
comment
область CTE состоит в том, чтобы сохранить постоянный код вне динамического SQL - person gt.guybrush; 13.10.2015

пока я переключаюсь на временную таблицу:

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...

person gt.guybrush    schedule 13.10.2015