2012-01-18 106 views
4

SQL Serverを使用しています。 1行のデータを返すクエリがあります。動的SQL Serverピボット(UNPIVOT)の列名と行の値

SELECT * 
FROM DBO.MY_TABLE 
WHERE ID = 5 

それはこのようになります:

ID F_NAME L_NAME NUMBER 
5  JOE  SCHMOE 1234567890 

私はそれらを旋回させるクエリ/手順が必要になります。私はこのように見える結果を必要とする:

ID  5 
F_NAME JOE 
L_NAME SCHMOE 
NUMBER 1234567890 

行の値が第2列の値になりつつ基本的にカラム名が最初の列の値となります。

トリックは、私はいつもそこにいくつの列があるのか​​分からないということです.2つまたは20つの列があるかもしれません。それは変わることがあります。

ただし、1行のデータしか存在しません。

+0

行に列を旋回する(カラムに行を回す)「UNPIVOT」ないピボットであるので、私は質問のタイトルを編集 – RThomas

答えて

1

これはいくつかの問題があります。最初は、テーブルと列が事前にわかっていないため、単純なピボットを使用できないため、動的SQLが必要です。

つまり、システムテーブルから列名を取得する必要があります。

2番目の問題は、すべてのデータ型が不明であるため、すべての列をすべてをサポートできるものにキャストしなければならないことです... varchar(max)。私は良心でから(そのように関与危険の警告なしに動的SQLを使用するソリューションをお勧めすることはできません、最後に

declare @yourTable varchar(50) 
declare @yourKeyField varchar(50) 
declare @yourKey varchar(50) 

set @yourTable = 'MyTable' /** change to tablename or pass as parameter */ 
set @yourKeyField = 'ID' /** change to fieldname or pass as parameter */ 
set @yourKey = '5'   /** change to key value or pass as parameter */ 

declare @query nvarchar(max) 

select @query = COALESCE(@query+' union all ','') + 'select ''' + c.name + ''' as 
[Column], Cast([' + c.name + '] AS VarChar(MAX)) as [Value] from ' + @yourTable + ' 
where ' + @yourKeyField + ' = ''' + @yourKey + '''' from syscolumns c 
    inner join sysobjects o on c.id = o.id and o.xtype = 'u' 
    where o.name = @yourTable order by c.colid 

exec sp_executesql @query /** execute query */ 

:ここに心の中でこれら2つの障害物とそう

は、ソリューションです。パフォーマンスの観点と注入の可能性の両方)。この優秀な記事を読んで、あなたの知識を増やしたい場合

http://www.sommarskog.se/dynamic_sql.html