Mince alors. C'était un fil de discussion très utile à découvrir.
J'ai quand même trouvé certaines de ces suggestions déroutantes. Chaque fois que j'ai utilisé value
con [1]
dans la chaîne, il ne récupère que la première valeur. Et certaines suggestions recommandaient d'utiliser cross apply
qui (dans mes tests) a ramené beaucoup trop de données.
Voici donc mon exemple simple de la façon dont vous créez une xml
puis lire ses valeurs dans un tableau.
DECLARE @str nvarchar(2000)
SET @str = ''
SET @str = @str + '<users>'
SET @str = @str + ' <user>'
SET @str = @str + ' <firstName>Mike</firstName>'
SET @str = @str + ' <lastName>Gledhill</lastName>'
SET @str = @str + ' <age>31</age>'
SET @str = @str + ' </user>'
SET @str = @str + ' <user>'
SET @str = @str + ' <firstName>Mark</firstName>'
SET @str = @str + ' <lastName>Stevens</lastName>'
SET @str = @str + ' <age>42</age>'
SET @str = @str + ' </user>'
SET @str = @str + ' <user>'
SET @str = @str + ' <firstName>Sarah</firstName>'
SET @str = @str + ' <lastName>Brown</lastName>'
SET @str = @str + ' <age>23</age>'
SET @str = @str + ' </user>'
SET @str = @str + '</users>'
DECLARE @xml xml
SELECT @xml = CAST(CAST(@str AS VARBINARY(MAX)) AS XML)
-- Iterate through each of the "users\user" records in our XML
SELECT
x.Rec.query('./firstName').value('.', 'nvarchar(2000)') AS 'FirstName',
x.Rec.query('./lastName').value('.', 'nvarchar(2000)') AS 'LastName',
x.Rec.query('./age').value('.', 'int') AS 'Age'
FROM @xml.nodes('/users/user') as x(Rec)
Et voici le résultat :
C'est une syntaxe bizarre, mais avec un exemple décent, il est assez facile de l'ajouter à vos propres fonctions SQL Server.
En parlant de ça, voici le correct réponse à cette question.
En supposant que vous avez vos données xml dans un fichier @xml
variable de type xml
(comme le montre mon exemple ci-dessus), voici comment renvoyer les trois lignes de données du fichier xml cité dans la question :
SELECT
x.Rec.query('./firstName').value('.', 'nvarchar(2000)') AS 'FirstName',
x.Rec.query('./lastName').value('.', 'nvarchar(2000)') AS 'LastName'
FROM @xml.nodes('/person') as x(Rec)
0 votes
N'y a-t-il aucun moyen de récupérer TOUS les éléments du fichier xml ? Vous devez les spécifier un par un ? Cela devient vite fastidieux. Vous pouvez faire "select * from table", il semble que vous devriez être capable de faire "select xml.* from xml" sans avoir à spécifier chaque élément que vous voulez.