> Tech > Passer des requêtes XQuery dans SQL Server (2)

Passer des requêtes XQuery dans SQL Server (2)

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

Pour indiquer le singleton de votre chemin, utilisez cette syntaxe : (chemin)[n° de position] (ce qu'on appelle un prédicat de position). Exemple sur un attribut, avec recherche dans le chemin :

SELECT echiquier.value('(/echiquier/blancs/pieces/pion[@numero = "3"]/@position)[ 1]', 'char(2)')
FROM #partie


Pour

Passer des requêtes XQuery dans SQL Server (2)

un élément :

SELECT echiquier.value(‘(/echiquier/blancs/pieces/pion[@numero = "3"]/historique/ coup[@sequence = "1"]/source)[1]’, ‘char(2)’)
FROM #partie

Puisqu’il vous retourne une valeur, value() sera utile dans un SELECT. Pour un test dans une clause WHERE, préférez-lui exist(), les performances sont meilleures.

exist()
exist() vous permet, dans une clause WHERE, de tester une existence à l’aide d’une instruction XPath. Un bit vous est retourné. Test de valeur atomique :

SELECT echiquier.query(‘/echiquier/blancs/pieces/piece[@position = "B3"]’)
FROM #partie
WHERE echiquier.exist(‘/echiquier/blancs/pieces/piece[@position = "B3"]’) = 1

Exemple de recherche avec deux critères d’attribut :

SELECT echiquier.query(‘/echiquier/blancs/pieces/pion[@numero = "2"]’)
FROM #partie
WHERE echiquier.exist(‘/echiquier/blancs/pieces/pion[@numero = "2" and @position = "B3"]’) = 1

Autre syntaxe possible :
SELECT echiquier.query(‘/echiquier/blancs/pieces/pion[@numero = "2"]’)
FROM #partie WHERE echiquier.exist(‘/echiquier/blancs/pieces/pion[@numero = "2"][@position = "B3"]’) = 1

Présence d’un élément :

SELECT echiquier.query(‘/echiquier/blancs/pieces/roi’) FROM #partie WHERE echiquier.exist(‘/echiquier/blancs/pieces/roi’) = 1

nodes()
nodes() extrait des noeuds, créant pour chacun une ligne de résultat. À utiliser dans la clause FROM. Pour spécifier une colonne, vous devez utiliser l’opérateur CROSS APPLY avec cette syntaxe :

FROM table
CROSS APPLY colonnexml.nodes(‘XQuery’) as aliastable(aliascolonne)

Exemple avec une liste :

SELECT col.query(‘.’)
FROM #partie p
CROSS APPLY echiquier.nodes(‘(/echiquier/blancs/pieces/pion, /echiquier/blancs/ pieces/pion/historique/coup)’) tbl(col);

modify()
modify() vous permet d’appliquer une modification au contenu du document, en utilisant une extension créée par Microsoft au langage XQuery, nommée XML-DML.

Exemple :

UPDATE #partie
SET echiquier.modify(‘
replace value of (/echiquier/blancs/pieces/pion[@position = "C5"]/@position)[ 1]
     with            "pris!"’)
WHERE echiquier.exist(‘/echiquier/blancs/pieces/pion[@position = "C5"]’) = 1
SELECT echiquier.query(‘/echiquier/blancs/pieces/pion[@position = "pris!"]’)
FROM #partie

Téléchargez cette ressource

Guide de Reporting Microsoft 365 & Microsoft Exchange

Guide de Reporting Microsoft 365 & Microsoft Exchange

Comment bénéficier d’une vision unifiée de vos messageries, mieux protéger vos données sensibles, vous conformer plus aisément aux contraintes réglementaires et réduire votre empreinte carbone ? Découvrez la solution de reporting complet de l’utilisation de Microsoft Exchange, en mode on-premise ou dans le Cloud.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010