Вот способ получить желаемый результат.
declare @T table(id int, name varchar(20))
insert into @T values(321, 'Book')
insert into @T values(654, 'Pen')
select (
select 'id' as '@name',
T.id as '@value'
for xml path('column'), type
),
(
select 'name' as '@name',
T.name as '@value'
for xml path('column'), type
)
from @T as T
for xml path('row'), root('root')
Если вы хотите, чтобы это работало для любой таблицы, использующей select *
, вы можете использовать это вместо этого.
Просто замените @T
именем таблицы. Примечание: это будет работать, только если имена столбцов являются действительными именами элементов XML.
select
(
select T3.N.value('local-name(.)', 'sysname') as '@name',
T3.N.value('.', 'nvarchar(max)') as '@value'
from (
select T1.*
for xml path(''), type
) T2(N)
cross apply T2.N.nodes('*') as T3(N)
for xml path('column'), root('row'), type
)
from @T as T1
for xml path(''), root('root')