J'ai un document XML typé stocké comme texte. J'utilise donc convertir le type de données en XML en utilisant une expression de table commune afin de pouvoir utiliser des méthodes XML:
WITH xoutput AS (
SELECT CONVERT(xml, t.requestpayload) 'requestpayload'
FROM TABLE t
WHERE t.methodid = 1)
SELECT x.requestpayload.query('declare namespace s="http://blah.ca/api";/s:validate-student-request/s:student-id') as studentid
FROM xoutput x
La requête fonctionne, retourne à moi l'élément. Mais je ne suis intéressé que par la valeur:
WITH xoutput AS (
SELECT CONVERT(xml, t.requestpayload) 'requestpayload'
FROM TABLE t
WHERE t.methodid = 1)
SELECT x.requestpayload.value('declare namespace s="http://blah.ca/api";/s:validate-student-request/s:student-id', 'int') as studentid
FROM xoutput x
Cela me donne l'erreur suivante:
'Valeur ()' nécessite un singleton (ou une séquence vide), trouvée opérant de type 'xdt: non typedatomic *'
Ce que j'ai dit que j'ai dit que le XPATH/XQuery doit être entre parenthèses et/ou besoins "[1]" - ni non plus. Il n'y a qu'un seul élément d'étudiant-identifiant dans le XML, bien que je suppose que le schéma en permet plus?
De plus, il existe de nombreuses valeurs d'éléments que je voudrais récupérer - existe-t-il un moyen de déclarer l'espace de noms une fois que l'appel de la méthode?
Vous devez utiliser ceci:
SELECT
x.requestpayload.value('declare namespace s="http://blah.ca/api";
(/s:validate-student-request/s:student-id)[1]', 'int')
AS
studentid
FROM
xoutput x
Vous devez mettre votre XPath en ( ... )
et ajouter un [1]
Pour sélectionner simplement la première valeur de cette séquence.
Je crois que cela pourrait aussi faire:
SELECT
x.requestpayload.query('declare namespace s="http://blah.ca/api";
/s:validate-student-request/s:student-id').value('.', 'int')
as studentid
FROM xoutput x