Blimey. Este fue un hilo muy útil para descubrir.
Aún encuentro algunas de estas sugerencias confusas. Cada vez que usé value
con [1]
en la cadena, solo recuperaría el primer valor. Y algunas sugerencias recomiendan usar cross apply
que (en mis pruebas) acaba de traer demasiados datos.
Así que, aquí está mi ejemplo simple de cómo crearías un objeto xml
, luego leíste sus valores en una tabla.
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)
Y aquí está la salida:
Es extraña sintaxis, pero con un ejemplo decente, es bastante fácil de añadir a sus propias funciones de SQL Server.
Hablando de eso, aquí está el correcto respuesta a esta pregunta.
Asumiendo que su tener sus datos XML en una variable @xml
de tipo xml
(como se demuestra en el ejemplo anterior), aquí es cómo se conducen los tres filas de datos del xml citado en la pregunta:
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)
Debe utilizar .nodes() y la cruz se aplica si xmlField contiene más de un elementos. –
SQL Server 2008 R2 Express, me devolvió este error con su solución: 'La sintaxis de XQuery '/ función()' no es compatible. Por otro lado @Remus Rusanu parece hacerlo :) – RMiranda
@RemusRusanu esta fue la clave para mí !!! ¡Gracias! – andrew