2010-11-02 6 views
6

je suit dans une variable xml @ResultDataSQL Server Xml espace de noms Interrogation problème

<EntityKey_x005B__x005D_> 
    <EntityKey> 
    <KeyData xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKey"> 
     <KeyField> 
     <Field>JournalNum</Field> 
     <Value>LJRN000071</Value> 
     </KeyField> 
    </KeyData> 
    </EntityKey> 
    <EntityKey> 
    <KeyData xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKey"> 
     <KeyField> 
     <Field>JournalNum</Field> 
     <Value>LJRN000072</Value> 
     </KeyField> 
    </KeyData> 
    </EntityKey> 
    <EntityKey> 
    <KeyData xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKey"> 
     <KeyField> 
     <Field>JournalNum</Field> 
     <Value>LJRN000073</Value> 
     </KeyField> 
    </KeyData> 
    </EntityKey> 
    <EntityKey> 
    <KeyData xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKey"> 
     <KeyField> 
     <Field>JournalNum</Field> 
     <Value>LJRN000074</Value> 
     </KeyField> 
    </KeyData> 
    </EntityKey> 
</EntityKey_x005B__x005D_> 

Mais je ne peux pas sembler sélectionner les valeurs de JournalNum en raison de la xmlns=... sur le nœud. En .Net je peux faire quelque chose comme "{http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKey}KeyData" pour le récupérer, mais j'obtiens une erreur de syntaxe en SQL.

Je veux juste obtenir une liste des noeuds de la valeur, dans le document de l'ordre dans une table temporaire et cela ne fonctionne pas non plus ....

SELECT IDENTITY(int,1,1) as 'ID', 
    c.query('(KeyData/KeyField/Value)[1]') as 'JournalNum' 
INTO #tmpBatches 
FROM @ResultData.nodes('//EntityKey') t(c) 

pensées? Suggestions? Solutions?

Répondre

15

Got it ... Bien sûr, juste après avoir demandé

;WITH XMLNAMESPACES (N'http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKey' as DYN) 
    SELECT IDENTITY(int,1,1) 
       as 'ID', 
      c.value('(DYN:KeyData/DYN:KeyField/DYN:Value)[1]', 'VARCHAR(40)') 
       as 'JournalNum' 
    INTO #tmpBatches 
    FROM @ResultData.nodes('//EntityKey') t(c) 
+0

Merci beaucoup! Je me suis enfin débarrassé de ces espaces de noms embêtants dans mes requêtes xpath. –

0

Puisque vous avez un seul espace de noms, vous auriez pu utiliser DEFAULT pour éviter d'avoir à préfixer partout:

;WITH XMLNAMESPACES (DEFAULT N'http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKey') 
     SELECT IDENTITY(int,1,1)             
     as 'ID', c.value('(<strike>DYN:</strike>KeyData/DYN:KeyField/DYN:Value)[1]', 'VARCHAR(40)') 
     as 'JournalNum' 
      INTO #tmpBatches 
     FROM @ResultData.nodes('//EntityKey') t(c) 

En outre, quelques notes je suis tombé sur la façon d'ignorer tous les espaces de noms pour quand il y en a plus d'un et vous savez que vous n'aurez pas de collisions. Someone's blog.

Questions connexes