универсальный XML из запроса выбора - PullRequest
1 голос
/ 07 марта 2012

Есть ли способ получить этот XML из запроса "select * from ANY_TABLE"?

<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 ]

2 голосов
/ 07 марта 2012

Попробуйте это:

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 голосов
/ 07 марта 2012

Вот способ получить желаемый результат.

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')
2 голосов
/ 07 марта 2012

Если вам нужно преобразовать то, что вы получаете с FOR XML, вы можете рассмотреть возможность использования XSLT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...