32 votes

XML query () fonctionne, value () nécessite un singleton trouvé xdt: untypedAtomic

J'ai tapé un document xml stockés en tant que texte. J'utilise donc CONVERTIR le type de données xml à l'aide d'une Expression de Table Commune afin d'être en mesure d'utiliser XML méthodes:

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

Requête fonctionne, en revenant à moi l'élément. Mais je suis seulement intéressé 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 de()' requiert un singleton (ou séquence vide), trouvé opérande de type 'xdt:untypedAtomic *'

Ce que j'ai googlé dit que le XPATH/XQUERY doit être à l'intérieur des parenthèses et/ou des besoins "[1]" - ni a travaillé. Il n'y a qu'un seul étudiant-id de l'élément dans le fichier xml, mais je suppose que le schéma permet de mieux?

En outre, il existe de nombreuses valeurs d'élément que j'aimerais récupérer existe - il un moyen de déclarer l'espace de noms une fois plutôt que par appel de méthode?

66voto

marc_s Points 321990

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 dans ( ... ) et ajouter un [1] pour sélectionner simplement la première valeur de cette séquence.

8voto

Ken Points 41

Je pense 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X