SQL Server动态数据透视表列名称

时间:2014-12-22 12:26:55

标签: sql-server pivot-table

为了我的应用程序的必要性,我必须返回查询的列名作为第一行。 现在我必须PIVOT这个结果才能使用我的结果集来UNION它,但困难的部分是:它必须是动态的,所以如果我在这个表中添加新列,SELECT将带来所有名称的旋转。

以下SELECT为我带来了列名:

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Codes'
ORDER BY INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION 

我的结果集是:

COLUMN_NAME
Id
CodeName
Country
StartDate
EndDate 

我的期望是:

Id    CodeName    Country    StartDate    EndDate (... whatever other columns I might have)

如果不对列名进行硬编码,有没有简单的方法呢?

提前谢谢!

3 个答案:

答案 0 :(得分:1)

DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + COLUMN_NAME + ']', 
               '[' + COLUMN_NAME + ']')
               FROM    (SELECT DISTINCT COLUMN_NAME,INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION O 
               FROM INFORMATION_SCHEMA.COLUMNS
               WHERE TABLE_NAME = 'CODES') PV  
               ORDER BY O


DECLARE @query NVARCHAR(MAX)
SET @query = '           
              SELECT TOP 0 * FROM 
             (
                 SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
                 WHERE TABLE_NAME = ''CODES''
             ) x
             PIVOT 
             (
                 MIN(COLUMN_NAME)
                 FOR [COLUMN_NAME] IN (' + @cols + ')
            ) p    

            '     
EXEC SP_EXECUTESQL @query

答案 1 :(得分:0)

简单方法是declaring a variable并使用comma separted分配列。试试这个。

DECLARE @col_list VARCHAR(max)=''

SELECT @col_list += '['+ COLUMN_NAME + '],'
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_NAME = 'Codes'
ORDER  BY INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION

SELECT @col_list = LEFT(@col_list, Len(@col_list) - 1)

SELECT @col_list 

答案 2 :(得分:0)

从SQL Server 2017开始,有一个功能:STRING_AGG。 我在这里也使用了QUOTENAME函数,使添加[]方括号更加容易。

DECLARE @ColumnNames NVARCHAR(MAX);
SELECT @ColumnNames = STRING_AGG(QUOTENAME(COLUMN_NAME), ',')
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME='Codes';