比较SQL中的Xml数据

时间:2011-09-15 09:20:52

标签: sql xml sql-server-2008 xquery

我有两个具有相同NVARCHAR字段的表,它们实际上包含XML数据。 在某些情况下,这个真正的XML字段与其他表中的一行完全相同,但属性顺序不同,因此字符串比较不会返回正确的结果!!!

并确定相同的XML字段,我需要进行比较,如:

  cast('<root><book b="" c="" a=""/></root>' as XML) 
= cast('<root><book a="" b="" c=""/></root>' as XML)

但是我得到了这个Err Msg:

  

除非使用XML数据类型,否则无法比较或排序XML数据类型   IS NULL运算符。

那么确定相同XML而不将它们重新转换为NVARCHAR的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:2)

为什么要施展它?只需将它们插入临时表中的XML列并运行Xquery即可将它们与其他表进行比较。编辑:包括比较的例子。有许多方法可以针对XML运行查询以获取相同的行 - 确切地说,查询的编写方式将取决于首选项,要求等。我使用了一个简单的组/ count,但是可以使用自联接,WHERE EXISTS针对正在搜索重复项的列,您可以命名。

CREATE TABLE #Test (SomeXML NVARCHAR(MAX))
CREATE TABLE #XML (SomeXML XML)

INSERT #Test (SomeXML)
VALUES('<root><book b="b" c="c" a="a"/></root>')
    ,('<root><book a="a" b="b" c="c"/></root>')

INSERT #XML (SomeXML)

SELECT SomeXML FROM #Test;

WITH XMLCompare (a,b,c)
AS
(
SELECT 
    x.c.value('@a[1]','char(1)') AS a
    ,x.c.value('@b[1]','char(1)') AS b 
    ,x.c.value('@c[1]','char(1)') AS c  
FROM #XML
CROSS APPLY SomeXMl.nodes('/root/book') X(C)
)

SELECT 
    a
    ,b
    ,c
FROM XMLCompare as a
GROUP BY
    a
    ,b
    ,c
HAVING COUNT(*) >1