2010-08-11 15 views
4

Pour fond.Voir cette question:Problèmes d'utilisation espace de noms dans le type de données XML SQL Server requête

SQL Server XML Data Type query issue

J'essaie d'interroger contre un objet XML dans SQL Server 2005. La requête fonctionne très bien quand il n'y a pas namespace défini dans le XML. Cependant, quand l'élément namespace est là, je n'arrive pas à obtenir la valeur d'un élément node. Voici un exemple:

DECLARE @xmlWithNameSpace XML 
DECLARE @xmlWithoutNameSpace XML 

SET @xmlWithNameSpace = '<?xml version="1.0" encoding="UTF-8"?> 
    <Feed xmlns="gizmo"> 
     <Product id="4444"> 
      <ProductId>4444</ProductId> 
     </Product> 
    </Feed>' 

SET @xmlWithoutNameSpace = '<?xml version="1.0" encoding="UTF-8"?> 
    <Feed> 
     <Product id="4444"> 
      <ProductId>4444</ProductId> 
     </Product> 
    </Feed>' 

SELECT feed.product.value('@id[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product) 

UNION ALL 

SELECT feed.product.value('ProductId[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product) 

UNION ALL 

SELECT feed.product.value('@id[1]', 'INT') AS productId 
FROM @xmlWithoutNameSpace.nodes('/Feed/Product') feed(product) 

UNION ALL 

SELECT feed.product.value('ProductId[1]', 'INT') AS productId 
FROM @xmlWithoutNameSpace.nodes('/Feed/Product') feed(product) 

Ce retour

4444 
NULL 
4444 
4444 

Que dois-je faire le mal pour obtenir la valeur du nœud ProductId (4444) lorsque l'espace de noms est utilisé?

Merci d'avance pour toute indication.

Répondre

4

La réponse est que je dois aussi définir l'élément de noeud auquel j'essaye d'accéder avec la namespece. Tous ces échantillons retournent 4444 comme prévu:

WITH XMLNAMESPACES ('gizmo' AS nsWithXNS) 

SELECT feed.product.value('@id[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('/nsWithXNS:Feed/nsWithXNS:Product') feed(product) 

UNION ALL 

SELECT feed.product.value('nsWithXNS:ProductId[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('/nsWithXNS:Feed/nsWithXNS:Product') feed(product) 

UNION ALL 

SELECT feed.product.value('@id[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product) 

UNION ALL 

SELECT feed.product.value('declare namespace ns="gizmo"; ns:ProductId[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product) 

Merci pour la lecture et j'espère que cela aide quelqu'un d'autre.

+0

La question de la partie supérieure fonctionne très bien, mais la partie inférieure (avec le mot-clé WITH) renvoie une erreur de syntaxe dans SQL-Server-2012 - Any ideas RP? – Hardryv

+0

Essayez d'ajouter un point-virgule avant le WITH. J'espère que ça aide. –