Возвращает имена полей как часть запроса SQL

#sql-server #tsql

#sql-сервер #tsql

Вопрос:

Мне нужно написать Sql Satement, которому передается любой допустимый подзапрос 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
  

Комментарии:

1. Можете ли вы опубликовать пример того, как вы хотите, чтобы выходные данные выглядели?

2. Какую версию SQL Server вы используете?

3. SQL 2012 / 2014

4. Я никогда не видел индекс [0] в инструкции select. Вы получаете сообщение об ошибке при выполнении приведенного выше запроса? Я бы подумал, что это выдаст синтаксическую ошибку.

5. По опыту я знаю, что то, что вы предлагаете, — это не тот путь, которым следует идти. Результаты вашего запроса имеют определенные типы (например, INT, DATETIME, NVARCHAR(16), FLOAT, DECIMAL …). Если бы вы сделали запрос, чтобы добавить имена столбцов к результатам, вам пришлось бы ПРЕОБРАЗОВАТЬ каждый столбец исходного запроса в какой-то (N) VARCHAR(XXX). Кроме того, каждая среда, о которой я знаю (например, C #), позволяет очень легко проверять результирующий набор, чтобы получить имена столбцов, связанные с каждым результирующим столбцом. Вам будет легче последовать моему совету, чем создать запрос, который добавляет имена столбцов в качестве первой строки.

Ответ №1:

Если у вас есть статическое количество столбцов, вы можете поместить свои данные во временную таблицу, а затем запросить, 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       |