如何在另一个查询中重用一个查询的输出?

时间:2014-07-07 15:35:34

标签: sql sql-server sql-server-2008

请考虑以下代码段。我使用stuff()生成字段列表。我在以下查询中使用了相同的列表。

select top 1
  stuff((
        select ',' + 'D.[' + ColumnName + ']'
              from #report_fields a
              where a.FieldType like 'X' or a.FieldType like 'Y'
              for XML path('')),1,1,'') as document_fields
  from #report_fields a
;


-- returns a fieldlist: D.[AAA], D.[BBB], D.[CCC], ...

select
    D.[AAA], D.[BBB], D.[CCC], ...
into
    #document_fields
from
    Document D
group by
    D.[AAA], D.[BBB], D.[CCC], ...

我的问题:我需要第二个查询中的字段列表是动态的。我想将stuff()的输出直接注入select...from document查询。这样做最直接的方法是什么?我可以将字段列表放在变量中(以前在SQL中从未这样做过)或者我是否需要动态查询(我试图避免出于多种原因)。

非常感谢您的帮助。

[编辑]

declare @fieldlist nvarchar(max)
select top 1 @fieldlist = 
  stuff((
        select ',' + 'D.[' + ColumnName + ']'
              from #report_fields a
              where a.FieldType like 'Text' or a.FieldType like 'Boolean'
              for XML path('')),1,1,'')
  from #report_fields a

declare @sql nvarchar(max)
select @sql = 'select ' + @fieldlist + ' into #document_fields from Document D     group by ' + @fieldlist
exec sp_execute @sql

1 个答案:

答案 0 :(得分:1)

我相信这必须通过动态sql完成:

DECLARE @Fieldlist NVARCHAR(MAX)

select top 1 @Fieldlist = 
  stuff((
        select ',' + 'D.[' + ColumnName + ']'
              from #report_fields a
              where a.FieldType like 'X' or a.FieldType like 'Y'
              for XML path('')),1,1,'')
  from #report_fields a

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = 'select '
    + @Fieldlist + '
into
    #document_fields
from
    Document D
group by '
   + @Fieldlist

   EXEC sp_executesql @SQL