したがって、いくつかの問題があります... 1つ目は、テーブルと列が事前にわからないため、単純なunpivotを使用できないため、動的SQLが必要になることです。
これは、システムテーブルから列名を取得する必要があることも意味します。
2番目の問題は、すべてのデータ型が不明であるため、すべての列をすべてと任意の長さをサポートできるものにキャストする必要があることです... varchar(max)。
したがって、これら2つの障害を念頭に置いて、ここに解決策があります。
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 */
最後に、(パフォーマンスの観点とインジェクションの可能性の両方の観点から)それに伴う危険性を警告せずに動的SQLを使用するソリューションを良心的に推奨することはできません。このテーマに関する知識を深めたい場合は、この優れた記事をお読みください。
http://www.sommarskog.se/dynamic_sql.html