来自select查询的通用XML

时间:2012-03-07 16:48:37

标签: sql-server tsql

有没有办法从“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>

3 个答案:

答案 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')