有没有办法从“select * from ANY_TABLE”查询中获取此XML?
<root>
<row>
<column name="id" value="321">
<column name="name" value="Book">
</row>
<row>
<column name="id" value="654">
<column name="name" value="Pen">
</row>
</root>
答案 0 :(得分:2)
如果您需要转换FOR XML所获得的内容,您可以考虑使用XSLT。
答案 1 :(得分:2)
试试这个:
Declare @Temp Table(Id Int, Name VarChar(20))
Insert Into @Temp Values(321, 'Book')
Insert Into @Temp Values(654, 'Pen')
Select (
Select 'id' as '@name',
id as '@value'
From @Temp As B
Where A.Id = B.Id
FOR XML Path('column'), Type
),
(
Select 'name' as '@name',
Name as '@value'
From @Temp As B
Where A.Id = B.Id
FOR XML Path('column'), Type
)
From @Temp As A
FOR XML path('row'), Root('root')
请注意,此代码使用临时表变量,因此我可以伪造一些数据。修改它以使用您的实际表格应该相对容易。
答案 2 :(得分:2)
这是获得所需结果的方法。
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')