我有两个具有相同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的最佳解决方案是什么?
答案 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