Динамическое SQL и общее табличное выражение WITH в подзапросе - PullRequest
0 голосов
/ 16 октября 2018

Я застрял, пытаясь построить динамический запрос SQL, как показано ниже:

'USE [SampleDatabase]
 DECLARE @COLUMNS NVARCHAR(MAX) = '[CELL], [OFFICE]';
 WITH table_CTE (Name, DayOfBirth, Phone) AS
     (
      SELECT pp.FirstName AS Name 
            ,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) = 06
     )
 SELECT Name, DayOfBirth, Phone, +@COLUMNS
 FROM ((SELECT Name, DayOfBirth, Phone FROM table_CTE) x
       PIVOT(
             MAX(Name)
             FOR Phone IN (@COLUMNS)
       ))p '

Это то, что мне нужно:

1 Ответ

0 голосов
/ 17 октября 2018

попробуйте это ..

Отредактировано для создания вложенной динамической функции, поскольку я не включал @COLUMNS в динамический SQL раньше.

Обратите внимание, как переменная @COLUMNS объединяется с SQL.

Я изменил запрос, выбрав *, но вы можете добавить переменную @COLUMNS таким же образом, если необходимо

Также в вашем примере у вас есть CTE с именем table_CTE и затем как tableCTE без подчеркивания.

 DECLARE @query nvarchar(4000)
 SET @query =
   'DECLARE @COLUMNS NVARCHAR(MAX) = ''[CELL], [OFFICE]'';
    DECLARE @query2 NVARCHAR(4000) = ''
    WITH table_CTE ([Name], DayOfBirth, Phone) AS
    (
      SELECT pp.FirstName AS Name 
            ,CONVERT(NVARCHAR(5), pp.Birthday, 103) AS Birthday            
            ,ph.Number
      FROM People pp, Phones ph
          ,PhoneNumberTypes pht 
      WHERE pp.PersonId = ph.PersonId AND ph.PhoneTypeId = pht.PhoneTypeId 
            AND MONTH(pp.Birthday) = 06
     )
     SELECT *
     FROM (SELECT [Name], DayOfBirth,Phone FROM table_CTE) x
       PIVOT(
             MAX(Name)
             FOR Phone IN ('' + @COLUMNS + '')
        )p''

     EXEC(@query2)'
    EXEC(@query)
...