2017-09-18 2 views
3

Avec le code XML suivant:XML TSQL - Filtre nœuds LIKE 'x' Cross Appliquer

<Path> 
    <To> 
     <Value> 
      <Array> 
       <NumberDecimal>10.0</NumberDecimal> 
       <TextEnglish>Ten</TextEnglish> 
       <NumberRomanNumeral>X</NumberRomanNumeral> 
      </Array> 
     </Value> 
    </To> 
</Path> 

Comment pourrais-je filtrer la croix s'appliquent à tous/seulement Number*** noeuds xml?

SELECT child.value('concat(local-name(.),": ",.)', 'varchar(max)') AS [value] 
FROM imports i 
CROSS APPLY i.import_data.nodes('/Path/To/Value/Array/*[local-name(.) = ''NumberDecimal'']') AS nodes(child) 

retours:

NumberDecimal: 10

a besoin d'être ceci:

SELECT child.value('concat(local-name(.),": ",.)', 'varchar(max)') AS [value] 
FROM imports i 
CROSS APPLY i.import_data.nodes('/Path/To/Value/Array/*[local-name(.) = ''Number/*'']') AS nodes(child) 

besoin de retourner:

NumberDecimal: 10

NumberRomanNumeral: X

Mais il ne retourne rien ....

Répondre

5

Vous pouvez utiliser [contains(local-name(.),'Number')]'demo pour trouver des éléments dont le nom contient la chaîne Number

ou [substring(local-name(.),1,6) eq "Number"] pour trouver des éléments où le chaîne est dans un certain endroit (dans ce cas, le début)

Pour quelque chose de plus exotique, vous êtes probablement mieux loti le faire dans TSQL

WHERE child.value('local-name(.)', 'sysname') LIKE '[SomeExpression]' 
+0

'Votre XML dans la question n'est pas valable que les balises de fermeture don ne correspondent pas à ceux d'ouverture. »- Correction. Désolé pour l'exemple mal écrit. – TaterJuice

+0

+1 pour 'contains' mais je veux contrôler où sont les jokers ('%' dans TSQL), j'ai trouvé un article qui dit que je peux utiliser une fonction appelée 'matches' mais ça n'existe pas pour moi. – TaterJuice

+3

@TaterJuice - yep SQL Server implémente seulement quelques fonctions XQuery https://docs.microsoft.com/en-us/sql/xquery/xquery-functions-against-the-xml-data-type –