Blimey. Dies war ein wirklich nützlicher Thread zu entdecken.
Ich fand einige dieser Vorschläge immer noch verwirrend. Wann immer ich valuemit [1]in der Zeichenfolge verwendet habe, wurde nur der erste Wert abgerufen. Und einige Vorschläge empfahlen, mit cross applydenen (in meinen Tests) einfach viel zu viele Daten zurückgebracht wurden.
Hier ist mein einfaches Beispiel, wie Sie ein xmlObjekt 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 @xmlVariablen 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)
