web-dev-qa-db-fra.com

Query XML () Works, Valeur () Nécessite Singleton trouvé XDT: Unttyledatomic

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?

32
OMG Ponies

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.

66
marc_s

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
8
Ken