2010-11-02 21 views
6

Tengo el siguiente en una variable XML @ResultDataSQL Server XML Espacio de nombres Consulta Problema

<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_> 

Pero me parece que no puede seleccionar los valores JournalNum de ella debido a la xmlns=... en el nodo. En .Net puedo hacer algo como "{http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKey}KeyData" para recuperarlo, pero obtengo un error de sintaxis en SQL.

sólo quiero obtener una lista de los nodos de valor, con el fin documento en una tabla temporal y esto no funciona bien ....

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

Pensamientos? Sugerencias? Soluciones?

Respuesta

15

¡Gracias ... por supuesto, justo después de pedir

;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

Muchas gracias !! Finalmente me deshice de estos molestos espacios de nombres en mis consultas xpath. –

0

Dado que sólo tiene un espacio de nombres, se podría haber utilizado DEFAULT para evitar tener que prefijar todas partes:

;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) 

Además, algunas notas que encontré sobre cómo ignorar todos los espacios de nombres para cuando hay más de uno y SABES que no habrá colisiones. Someone's blog.

Cuestiones relacionadas