Con solo mirar mi campo XML, mis filas se ven así:
<person><firstName>Jon</firstName><lastName>Johnson</lastName></person>
<person><firstName>Kathy</firstName><lastName>Carter</lastName></person>
<person><firstName>Bob</firstName><lastName>Burns</lastName></person>
Tenga en cuenta que estas son tres filas en mi tabla.
Me gustaría devolver un resultado de SQL como una tabla como en
Jon | Johnson
Kathy| Carter
Bob | Burns
¿Qué consulta logrará esto?
sql-server
xml
xpath
Larsenal
fuente
fuente
Respuestas:
Dado que el campo XML se llama 'xmlField' ...
fuente
The XQuery syntax '/function()' is not supported.
:; Por otro lado @Remus Rusanu parece hacerlo :)<BAM><Type>Electrical</Type><BaIds><a:int>7330</a:int></BaIds></BAM>
, mi selección esselect e.MessageData.value('(/BAM/Type)[1]', 'varchar(100)')
. También he tratado de seleccióne.MessageData.value('(/BAM/Type/node())[1]', 'varchar(100)')
, y'(//Type/node())[1]'
,'(./Type)[1]'
y cualquier otra combinación que se me ocurre. Todo lo que obtengo esNULL
.Teniendo en cuenta que los datos XML provienen de una tabla 'tabla' y se almacenan en una columna 'campo': use los métodos XML , extraiga valores con
xml.value()
, proyecte nodos conxml.nodes()
, useCROSS APPLY
para unir:Puede deshacerse de
nodes()
ycross apply
si cada campo contiene exactamente un elemento 'persona'. Si el XML es una variable que seleccionaFROM @variable.nodes(...)
y no necesita elcross apply
.fuente
Esta publicación fue útil para resolver mi problema que tiene un formato XML un poco diferente ... mi XML contiene una lista de claves como el siguiente ejemplo y almaceno el XML en la columna SourceKeys en una tabla llamada DeleteBatch:
Cree la tabla y rellénela con algunos datos:
Aquí está mi SQL para seleccionar las claves del XML:
Aquí están los resultados de la consulta ...
fuente
Esto puede responder a su pregunta:
fuente
Caray. Este fue un hilo realmente útil para descubrir.
Todavía encuentro algunas de estas sugerencias confusas. Siempre que usaba
value
con[1]
en la cadena, solo recuperaba el primer valor. Y algunas sugerencias recomendaron usar elcross apply
cual (en mis pruebas) simplemente trajo demasiados datos.Entonces, aquí está mi ejemplo simple de cómo crearía un
xml
objeto y luego leería sus valores en una tabla.Y aquí está la salida:
Es una sintaxis extraña, pero con un ejemplo decente, es bastante fácil de agregar a sus propias funciones de SQL Server.
Hablando de eso, aquí está la respuesta correcta a esta pregunta.
Suponiendo que tiene sus datos xml en una
@xml
variable de tipoxml
(como se demostró en mi ejemplo anterior), así es como devolvería las tres filas de datos del xml citado en la pregunta:fuente
[1]
el ordinal de índice para obligarlo a devolver 1 fila, o debe aplicar la columna de forma cruzada connodes()
para obtener un estructura que puede hacer que xpath se ejecute en su contra. Su código no se traduce en ese escenario sin muchas modificaciones. Estás usando una variable, no una columna de tabla. También está abusando de laquery()
función que devuelve xml. por ejemplo, podría haberlo hechox.Rec.value('(./firstName)[1]', 'nvarchar(2000)') AS FirstName
Si puede envolver su XML en un elemento raíz, digamos que la siguiente es su solución:
fuente
MSSQL usa reglas XPath regulares de la siguiente manera:
W3Schools
fuente
fuente
/ * Este ejemplo usa una variable XML con un esquema * /
fuente