SQL Server 动态透视列名称

use*_*897 7 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 
Run Code Online (Sandbox Code Playgroud)

我的结果集是:

COLUMN_NAME
Id
CodeName
Country
StartDate
EndDate 
Run Code Online (Sandbox Code Playgroud)

我期望的是:

Id    CodeName    Country    StartDate    EndDate (... whatever other columns I might have)
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法可以做到这一点,而无需对列名称进行硬编码?

先感谢您!

Sar*_*avu 7

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
Run Code Online (Sandbox Code Playgroud)