Blimey. C'était un fil vraiment utile à découvrir.
J'ai toujours trouvé certaines de ces suggestions confuses. Chaque fois que j'utilisais value
avec [1]
dans la chaîne, il ne récupérait que la première valeur. Et certaines suggestions recommandées en utilisant cross apply
qui (dans mes tests) vient de ramener beaucoup trop de données. Donc, voici mon exemple simple de la façon dont vous créez un objet xml
, puis lisez ses valeurs dans une table.
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 la sortie:
Il est la syntaxe bizarre, mais avec un exemple décent, il est assez facile d'ajouter à vos propres fonctions SQL Server.
En parlant de cela, voici la correcte répondre à cette question.
En supposant que votre vos données XML dans une variable @xml
de type xml
(comme l'a démontré dans mon exemple ci-dessus), voici comment vous reviendriez les trois lignes de données à partir du 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)
Vous devez utiliser .nodes() et croix applicable si XMLField contient plus d'un éléments. –
SQL Server 2008 R2 Express, m'a renvoyé cette erreur avec votre solution: 'La syntaxe XQuery '/ function()' n'est pas supportée. D'autre part @Remus Rusanu semble le faire :) – RMiranda
@RemusRusanu c'était la clé pour moi !!! Merci! – andrew