#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 |