在SQL 2005 XMLNS问题中存储XML

时间:2010-05-19 15:17:00

标签: xml sql-server-2005 xml-namespaces

我正在尝试在SQL 2005中存储XML。我有一个非常简单的表,其中包含Id和XML列。

当XML包含属性xmlns时,我的搜索不起作用。

这是我的XML;

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

这是我的查询;

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

如果我将属性xmlns更改为其他任何查询都可以工作。

我认为我不太了解XML以了解SQL对命名空间的作用。但它必须处理它并以不同的方式存储它吗?有人有这个问题吗?

1 个答案:

答案 0 :(得分:1)

如果你的XML节点上有一个XML命名空间,你需要在查询时使用它 - 就像这样 - 直接在每个.query().value()函数本地,如下所示:

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

(有关此方法的更多详细信息,请参见SQL Server Books Online),或者如果需要大量引用该XML命名空间,还可以将其定义为范围:

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

MSDN SQL Server Books Online

上查看有关WITH XMLNAMESPACES的详细信息