我有一个显示数据的表dbo.EX_DD12
,但表列的代码已分配(DD12001, DD12002, DD12003....DD12055
)。
此查询:
SELECT * FROM [dbo.EX_DD12]
返回如下结果:
Id | DD12001 | DD12002 | DD12003
---+------------+------------+--------
1 | 12/12/2005 | 10:00 a.m. | x
2 | 13/12/2005 | 10:00 a.m. | y
3 | 14/12/2005 | 09:00 a.m. | x
使用此查询我可以获得描述:
SELECT
T0.name, T1.Description
INTO
#TABLE00
FROM
sys.columns T0
INNER JOIN
dbo.EXDT T1 ON T0.name = Code
WHERE
object_id = OBJECT_ID('dbo.EX_DD12')
AND T0.name LIKE 'DD12%'
结果看起来像这样:
Code | Description
--------+-------------
DD12001 | Date
DD12002 | Time
DD12003 | Priority
我可以做什么,以便在查询中结果如下所示?
Id | Date | Time | Priority
---+------------+------------+---------
1 | 12/12/2005 | 10:00 a.m. | x
2 | 13/12/2005 | 10:00 a.m. | y
3 | 14/12/2005 | 09:00 a.m. | x
答案 0 :(得分:2)
在SQL Server中:
动态构建查询并使用sp_executesql
执行:
declare @sql nvarchar(max);
declare @tbl sysname = 'dbo.EX_DD12'
select @sql = 'select' + char(10)
+ stuff((
select char(10)+' , '+quotename(c.name) + case
when c.name != d.description
then ' as ' +quotename(coalesce(d.[Description],c.name))
else ''
end
from sys.columns c
left join dbo.EXDT d
on c.name = d.[Code]
where c.object_id = object_id(@tbl)
order by c.column_id
for xml path (''), type).value('.','nvarchar(max)')
,1,5,' ')+ char(10)
+'from '+quotename(schema_name(t.schema_id))+'.'+quotename(object_name(object_id(@tbl)))
from sys.tables t where t.object_id = object_id(@tbl)
select @sql as CodeGenerated;
--exec sp_executesql @sql;
rextester演示:http://rextester.com/GGEL20070
返回:
+-----------------------------+
| CodeGenerated |
+-----------------------------+
| select |
| [id] |
| , [DD12001] as [Date] |
| , [DD12002] as [Time] |
| , [DD12003] as [Priority] |
| from [dbo].[EX_DD12] |
+-----------------------------+
动态sql参考: