我正在尝试在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对命名空间的作用。但它必须处理它并以不同的方式存储它吗?有人有这个问题吗?
答案 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
上查看有关WITH XMLNAMESPACES
的详细信息