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 APPLYpara unir:Puede deshacerse de
nodes()ycross applysi 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
valuecon[1]en la cadena, solo recuperaba el primer valor. Y algunas sugerencias recomendaron usar elcross applycual (en mis pruebas) simplemente trajo demasiados datos.Entonces, aquí está mi ejemplo simple de cómo crearía un
xmlobjeto 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
@xmlvariable 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 FirstNameSi 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