En regardant simplement mon champ XML, mes lignes ressemblent à ceci:
<person><firstName>Jon</firstName><lastName>Johnson</lastName></person>
<person><firstName>Kathy</firstName><lastName>Carter</lastName></person>
<person><firstName>Bob</firstName><lastName>Burns</lastName></person>
Notez que ce sont trois lignes dans mon tableau.
Je voudrais renvoyer un résultat SQL sous forme de table comme dans
Jon | Johnson
Kathy| Carter
Bob | Burns
Quelle requête accomplira cela?
sql-server
xml
xpath
Larsenal
la source
la source
Réponses:
Étant donné que le champ XML est nommé 'xmlField' ...
la source
The XQuery syntax '/function()' is not supported.
:; D'autre part @Remus Rusanu semble le faire :)<BAM><Type>Electrical</Type><BaIds><a:int>7330</a:int></BaIds></BAM>
, mon choix estselect e.MessageData.value('(/BAM/Type)[1]', 'varchar(100)')
. J'ai aussi essayé de sélectione.MessageData.value('(/BAM/Type/node())[1]', 'varchar(100)')
, et'(//Type/node())[1]'
,'(./Type)[1]'
et toute autre combinaison que je peux penser. Tout ce que je reçois, c'estNULL
.Considérant que les données XML proviennent d'une table 'table' et sont stockées dans une colonne 'field': utilisez les méthodes XML , extrayez les valeurs avec
xml.value()
, les nœuds de projet avecxml.nodes()
, utilisezCROSS APPLY
pour joindre:Vous pouvez abandonner le
nodes()
etcross apply
si chaque champ contient exactement un élément «personne». Si le XML est une variable que vous sélectionnezFROM @variable.nodes(...)
et que vous n'avez pas besoin du fichiercross apply
.la source
Cet article a été utile pour résoudre mon problème qui a un format XML légèrement différent ... mon XML contient une liste de clés comme l'exemple suivant et je stocke le XML dans la colonne SourceKeys dans une table nommée DeleteBatch:
Créez le tableau et remplissez-le avec des données:
Voici mon SQL pour sélectionner les clés du XML:
Voici les résultats de la requête ...
la source
Cela peut répondre à votre question:
la source
Blimey. C'était un fil vraiment utile à découvrir.
J'ai toujours trouvé certaines de ces suggestions déroutantes. Chaque fois que j'utilisais
value
avec[1]
dans la chaîne, il ne récupérait que la première valeur. Et quelques suggestions recommandées d'utilisercross apply
ce qui (dans mes tests) a juste rapporté beaucoup trop de données.Alors, voici mon exemple simple de la façon dont vous créez un
xml
objet, puis lisez ses valeurs dans une table.Et voici la sortie:
C'est une syntaxe bizarre, mais avec un exemple décent, il est assez facile d'ajouter à vos propres fonctions SQL Server.
En parlant de cela, voici la bonne réponse à cette question.
En supposant que vous ayez vos données xml dans une
@xml
variable de typexml
(comme illustré dans mon exemple ci-dessus), voici comment vous renverriez les trois lignes de données du xml cité dans la question:la source
[1]
, l'ordinal d'index pour le forcer à renvoyer 1 ligne, soit vous devez appliquer la colonne avecnodes()
pour obtenir un structure sur laquelle xpath peut être exécuté. Votre code ne se traduit pas dans ce scénario sans beaucoup de modifications. Vous utilisez une variable, pas une colonne de table. Vous abusez également de laquery()
fonction qui renvoie xml. par exemple, vous pourriez avoir justex.Rec.value('(./firstName)[1]', 'nvarchar(2000)') AS FirstName
Si vous êtes capable d'encapsuler votre XML dans un élément racine - disons alors la solution suivante est:
la source
MSSQL utilise les règles XPath régulières comme suit:
W3Schools
la source
la source
/ * Cet exemple utilise une variable XML avec un schéma * /
la source