从表中提取单元格数据以用于存储过程

时间:2014-03-31 14:28:03

标签: sql sql-server-2012 pivot

我正在使用一个数据透视命令,我已经得到了所需的输出,如下所示:

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。

如果这没有意义,请告诉我,我可以尝试提供更多细节。

谢谢!

1 个答案:

答案 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;