Динамический SQL для получения сводной таблицы - PullRequest
0 голосов
/ 16 октября 2018

У меня проблемы с динамическим построением сводной таблицы.При построении строки запроса для выполнения я получаю эту ошибку: Общее табличное выражение определено, но не используется.Вот мой фрагмент кода:

`USE [DatabaseAccessLayer.PhoneBookContext]

 DECLARE @COLUMNS AS NVARCHAR(MAX), @QRY_ NVARCHAR(500);
 DECLARE @TABLE_ NVARCHAR(10) = 'tempTable'
 DECLARE @Month INT = '06'; 

 WITH ColumnNames AS (
    SELECT DISTINCT pht.Name AS 'PhoneType'
    FROM Records.People pp, Records.PhoneNumberTypes pht, Records.Phones ph
    WHERE pp.PersonId = ph.PersonId AND ph.PhoneTypeId = pht.PhoneTypeId AND 
          MONTH(pp.Birthday) = @MONTH
    )-- SELECT * FROM ColumnNames
    ,ColumnMap AS (
    SELECT C.PhoneType
    FROM ColumnNames C  LEFT JOIN ColNames CN 
    ON REPLACE(C.PhoneType, C.PhoneType, C.PhoneType + ' Phone') = 
       CN.ColumnId)--SELECT * FROM ColumnMap

 SELECT @COLUMNS = ( SELECT  QUOTENAME(PhoneType)+','
                        FROM ColumnNames AS ColumnName  
                        FOR XML PATH('')
                   )       
 SELECT @COLUMNS = SUBSTRING(@COLUMNS, 1, LEN(@COLUMNS)-1);
 PRINT @COLUMNS;--testing purpose

 WITH tempTable AS(
        SELECT TOP (100)pp.FirstName AS Name ---See how to remove top clause --when using ORDER BY???
                       ,CONVERT(NVARCHAR(5), pp.Birthday, 103) AS Birthday             
                       ,ph.Number
       FROM Records.People pp, Records.Phones ph, Records.PhoneNumberTypes pht 
       WHERE pp.PersonId = ph.PersonId AND ph.PhoneTypeId = pht.PhoneTypeId 
             AND MONTH(pp.Birthday) = @Month
       ORDER BY 'Birthday', Name
      )SELECT @QRY_ = 'SELECT FirstName, Birthday,' + @COLUMNS+'    
                        FROM(SELECT FirstName, Birthday
                              ,Number
                              FROM' +@TABLE_ +') x
                       PIVOT
                       (
                        MAX(Number)
                        FOR Name IN ('+@COLUMNS+')
                       )p'

  `PRINT @QRY_
   EXECUTE sp_executesql @QRY_;`

[введите описание изображения здесь] [2]

Изображение (по ссылке: введите описание изображения здесь) показывает, что я пытаюсь выполнить.

заранее спасибо T.

введите описание изображения здесь

...