2010-05-19 8 views
1

Je tente de stocker XML dans SQL 2005. J'ai une table très simple avec un ID et une colonne XML.Stockage XML dans SQL 2005 Problème XMLNS

Lorsque le XML contient l'attribut xmlns, ma recherche ne fonctionne pas.

Ceci est mon XML;

insert into XMLTest (ItemXML) values ( 
'<MessageType> 
    <ItemId id="ABC" xmlns="ss" /> 
    <Subject>sub</Subject> 
</MessageType> 
') 

Et ceci est ma requête;

select itemid, ItemXML.query('(/MessageType/ItemId)') from XMLTest order by ItemId desc 

Si je change l'attribut xmlns en quoi que ce soit d'autre, ma requête fonctionne.

Je ne pense pas en savoir assez sur XML pour comprendre ce que SQL fait avec l'espace de noms. Mais il faut le traiter et le stocker différemment peut-être? Quelqu'un a eu ce problème?

Répondre

1

Si vous avez un espace de noms XML sur votre noeud XML, vous devez utiliser que lors de l'interrogation - quelque chose comme ça - soit directement dans chaque .query() ou la fonction .value() localement comme ceci:

SELECT 
    itemid, 
    ItemXML.query('declare namespace x="ss";(/MessageType/x:ItemId)') 
FROM 
    XMLTest 
ORDER BY 
    ItemId DESC 

(voir ici sur SQL Server Books Online pour plus de détails sur cette approche), ou si vous avez besoin de faire référence à cet espace de noms XML beaucoup, vous pouvez également définir comme un champ d'application:

WITH XMLNAMESPACES('ss' as x) 
SELECT 
    itemid, 
    ItemXML.query('(/MessageType/x:ItemId)') 
FROM 
    XMLTest 
ORDER BY 
    ItemId DESC 

Voir les détails sur WITH XMLNAMESPACES sur MSDN SQL Server Books Online

+1

C'est parfaitement, merci. Aussi Votre exemple de code fonctionne comme un rêve. –