为了我的应用程序的必要性,我必须返回查询的列名作为第一行。 现在我必须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)
如果不对列名进行硬编码,有没有简单的方法呢?
提前谢谢!
答案 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';