ダイナミクスが含まれていないバージョン。 XML で要素名として使用するのに無効な列名がある場合、これは失敗します。
select T2.N.value('local-name(.)', 'nvarchar(128)') as [Key], T2.N.value('text()[1]', 'nvarchar(max)') as Value from (select * from TableA for xml path(''), type) as T1(X) cross apply T1.X.nodes('/*') as T2(N)
プレ>作業サンプル:
declare @T table ( Column1 varchar(10), Column2 varchar(10), Column3 varchar(10) ) insert into @T values('V1','V2','V3') select T2.N.value('local-name(.)', 'nvarchar(128)') as [Key], T2.N.value('text()[1]', 'nvarchar(max)') as Value from (select * from @T for xml path(''), type) as T1(X) cross apply T1.X.nodes('/*') as T2(N)
プレ>結果:
Key Value -------------------- ----- Column1 V1 Column2 V2 Column3 V3
プレ>更新
複数のテーブルを含むクエリの場合、
for xml auto
を使用できます XML でテーブル名を取得します。クエリでテーブル名にエイリアスを使用すると、代わりにエイリアスが取得されることに注意してください。select X2.N.value('local-name(..)', 'nvarchar(128)') as TableName, X2.N.value('local-name(.)', 'nvarchar(128)') as [Key], X2.N.value('text()[1]', 'nvarchar(max)') as Value from ( -- Your query starts here select T1.T1ID, T1.T1Col, T2.T2ID, T2.T2Col from T1 inner join T2 on T1.T1ID = T2.T1ID -- Your query ends here for xml auto, elements, type ) as X1(X) cross apply X1.X.nodes('//*[text()]') as X2(N)
プレ>