Sql server 作为SQL查询的一部分返回字段名

Sql server 作为SQL查询的一部分返回字段名,sql-server,tsql,Sql Server,Tsql,我需要编写一个Sql语句来传递任何有效的Sql子查询,并返回带有标题的结果集 不知何故,我需要查询结果集,获取字段名并将其作为原始区域数据“联合”的一部分返回,然后将结果传递给导出 下面是我的尝试:我有一个名为“a”的子查询,它返回一个数据集,我需要查询它的字段名?通常可能 select A.fields[0].name, A.fields[1].name, A.fields[2].name from ( Select 'xxx1' as [Complaint Mechanism] ,

我需要编写一个Sql语句来传递任何有效的Sql子查询,并返回带有标题的结果集

不知何故,我需要查询结果集,获取字段名并将其作为原始区域数据“联合”的一部分返回,然后将结果传递给导出

下面是我的尝试:我有一个名为“a”的子查询,它返回一个数据集,我需要查询它的字段名?通常可能

select A.fields[0].name, A.fields[1].name, A.fields[2].name  from 
(

Select 'xxx1' as [Complaint Mechanism]  , 'xxx2' as [Actual Achievements]
union ALL 
Select 'xxx3' as [Complaint Mechanism]  , 'xxx4' as [Actual Achievements]
union ALL 
Select 'xxx5' as [Complaint Mechanism]  , 'xxx6' as [Actual Achievements]   ) as A
任何指点都将不胜感激(也许我只是错过了明显的…)

结果集应如下表所示:

F1                      F2
---------------------   ---------------------
[Complaint Mechanism]   [Actual Achievements]
xxx1                    xxx2
xxx3                    xxx4
xxx5                    xxx6

如果列数是静态的,则可以将数据放入临时表中,然后查询
tempdb.sys.columns
以获取列名,然后可以在数据顶部使用
union
。如果列的数量是动态的,则需要使用动态SQL来构建
pivot
语句,但这将由您自己决定

这里需要注意的一点是,列名下的所有数据都需要转换为字符串:

select 1 a, 2 b
into #a;

select [1] as FirstColumn
        ,[2] as SecondColumn
from (
    select column_id
            ,name
    from tempdb.sys.columns
    where object_id = object_id('tempdb..#a')
    ) d
pivot (max(name)
        for column_id in([1],[2])
        ) pvt

union all

select cast(a as nvarchar(100))
    ,cast(b as nvarchar(100))
from #a;
查询结果:

| FirstColumn | SecondColumn |
|-------------|--------------|
|      a      |      b       |
|      1      |      2       |

您能否发布一个示例,说明您希望输出的外观?您正在运行哪个版本的SQL Server?SQL 2012/2014我从未在select语句中看到索引[0]。运行上述查询时是否出现错误?我认为这会导致语法错误。根据经验,我知道你的建议不可取。查询结果具有特定类型(例如,INT、DATETIME、NVARCHAR(16)、FLOAT、DECIMAL…)。如果要进行查询以将列名添加到结果中,则必须将原始查询的每一列强制转换为某种(N)VARCHAR(XXX)。此外,我知道的每个环境(如C#)都允许非常轻松地检查结果集,以获得与每个结果列关联的列名。您将更容易接受我的建议,然后创建一个将列名添加为第一行的查询。