Как да използвате общ табличен израз в динамичен 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 е да запази кода на costant извън динамичния 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