Blimey. Dies war ein wirklich nützlicher Thread zu entdecken.
Ich fand einige dieser Vorschläge immer noch verwirrend. Wann immer ich value
mit [1]
in der Zeichenfolge verwendet habe, wurde nur der erste Wert abgerufen. Und einige Vorschläge empfahlen, mit cross apply
denen (in meinen Tests) einfach viel zu viele Daten zurückgebracht wurden.
Hier ist mein einfaches Beispiel, wie Sie ein xml
Objekt erstellen und dann seine Werte in eine Tabelle einlesen.
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)
Und hier ist die Ausgabe:
Es ist eine bizarre Syntax, aber mit einem anständigen Beispiel ist es einfach genug, Ihre eigenen SQL Server-Funktionen zu erweitern.
Apropos, hier ist die richtige Antwort auf diese Frage.
Angenommen, Sie haben Ihre XML-Daten in einer @xml
Variablen vom Typ xml
(wie in meinem obigen Beispiel gezeigt), so würden Sie die drei Datenzeilen aus der in der Frage angegebenen XML-Datei zurückgeben:
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)