2010-07-06 3 views
0

permet de dire que nous avons une table "noms":XML Neat de T-SQL

ID Name Surname 
1  Matt Smith 
2  John Doe 

Comment pourriez-vous écrire quelques SQLXML pour générer ceci:

<people> 
    <person> 
    <name>Matt</name> 
    <surname>Smith</surname> 
    <person> 
    <person> 
    <name>John</name> 
    <surname>Doe</surname> 
    <person> 
</people> 

Le meilleur que j'ai est ceci:

select r.value('Name[1]', 'nvarchar(10)'), r.value('Surname[1]', 'nvarchar(10)') 
from Names 
for xml path('people') 

ce qui me donne:

<people> 
    <name>Matt</name> 
    <surname>Smith</surname> 
</people> 
<people> 
    <name>John</name> 
    <surname>Doe</surname> 
</people> 

En bref, comment emballer tout le lot?

Répondre

2

Essayez ceci:

SELECT 
    Name, 
    Surname 
FROM 
    dbo.Names 
FOR XML PATH('person'), ROOT('people') 

Le FOR XML PATH définit la balise pour entourer chaque ligne individuelle, tandis que FOR XML ... ROOT définit l'élément racine entourant la collection de lignes.

+0

Solution propre! fait ce long dos! J'ai retrouvé l'idée! THX ! – Baaju

+0

Et si vous voulez des attributs dans les éléments, vous définissez simplement le nom de la colonne comme "@columnname". Notez que dans ce cas, vous devez d'abord définir la colonne d'attribut, ou vous obtenez une erreur. De plus, si vous utilisez des sous-requêtes qui produisent également du XML, vous devez inclure "type" comme ceci: "pour xml path ('elementname'), tapez" (ou tout le XML issu de la sous-requête sera échappé). Dans ce cas, vous pouvez omettre root et utiliser "elementroot" comme un alias, il va prendre en charge ce rôle. – Rob

0

Si vous voulez faire un moyen tout xml,

Vous pouvez avoir une variable,

Declare @XMLOP xml 
SET @XMLOP = '<people></people>' 

set @XMLOP.modify('  
insert (select r.value('Name[1]', 'nvarchar(10)'), r.value('Surname[1]', 'nvarchar(10)') 
     from Names 
     for xml path('Person')) 
after (/people)[1]  
'); 

SELECT @XMLOP;