2014-12-22 43 views
2

对于我的应用程序的必要性,我必须将查询的列名作为第一行返回。 现在,我必须将此结果排在前面,以便将它与我的结果集进行联合,但困难的部分是:它必须是动态的,所以如果我向该表中添加新列,SELECT将带来所有名称的旋转。SQL Server动态数据透视列名称

以下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

http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query#10404455您可以用'stuff'部分从这个 – Bharadwaj

+0

预期的结果应该有一个单独的列每个'COLUMN_NAME'的名称。什么是首选的命名方案? –

回答

0
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 
+0

这是什么问题?是否需要downvote? –

+0

母亲的承诺。我没有投下你的答案。 @NoDisplayName –

+0

您可以使用数据库中的任何表格检查我的结果。它会工作。 @NoDisplayName –

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 
+0

我想OP想要一个结果集,其中每个列名都包含在*单独的列*中。 –

+0

@GiorgosBetsos我没有得到你OP想要获得可以在pivot中使用的列列表来动态生成列。在数据库中运行上面的查询并检查 –

+0

好的,我对OP有不同的解释。作为一个方面说明,我没有downvote你的回答。 –