子查询中的动态SQL和WITH公共表表达式

时间:2018-10-16 19:41:51

标签: sql-server tsql common-table-expression dynamic-sql

我在尝试构建动态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 :(得分:0)

尝试一下。

经过编辑以创建嵌套动态,因为之前在动态SQL中未包含@COLUMNS。

注意@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)
相关问题