XML générique à partir de la requête select

Existe-t-il un moyen d'get ce code XML à partir de la requête "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> 

Voici un moyen d'get le résultat que vous voulez.

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

Si vous voulez que cela fonctionne pour n'importe quelle table en utilisant select * vous pouvez l'utiliser à la place. Remplacez simplement @T par le nom de votre table. Note: ceci ne fonctionnera que si les noms de colonnes sont des noms d'éléments XML valides.

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

Si vous avez besoin de transformer ce que vous obtenez avec FOR XML, vous pouvez utiliser XSLT.

Essaye ça:

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

Notez que ce code utilise une variable de table temporaire afin que je puisse définir certaines données. Il devrait être relativement facile de modifier cela pour utiliser votre table actuelle.