我正在使用一个数据透视命令,我已经得到了所需的输出,如下所示:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SELECT Id, IssuedCN, [EmailAddress], [ServerHostName], [ManagerEmail]
FROM (SELECT Id, IssuedCN, StringValue, Name
FROM dbo.certmetadata) AS Source
PIVOT(
MAX(StringValue)
FOR Name IN ([EmailAddress], [ServerHostName], [ManagerEmail])
)
AS PvtTable_1;
但是,旋转的表名将由用户定义。当前的[EmailAddress] [ServerHostName] [ManagerEmail]可能会保留在那里但可以更改甚至不存在。用户定义的名称存储在一个表中,但我似乎无法弄清楚如何可能将它们带入上面的代码中。
我正在使用服务器2012。
如果这没有意义,请告诉我,我可以尝试提供更多细节。
谢谢!
答案 0 :(得分:0)
如果您将拥有未知数量的列,那么您将需要查看使用动态SQL。基本语法与此类似:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
-- get the list of columns
-- apply a filter on the columns here if needed
select @cols = STUFF((SELECT ',' + QUOTENAME(Name)
from dbo.certmetadata
group by name
order by name
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT Id, IssuedCN,' + @cols + '
from
(
SELECT Id, IssuedCN, StringValue, Name
from dbo.certmetadata
) x
pivot
(
min(stringvalue)
for name in (' + @cols + ')
) p '
exec sp_executesql @query;