Сравнить данные XML в SQL - PullRequest
       18

Сравнить данные XML в SQL

2 голосов
/ 15 сентября 2011

У меня есть две таблицы с одним и тем же полем NVARCHAR, которое действительно содержит данные XML.в некоторых случаях это действительно XML-поле действительно совпадает с одной строкой в ​​другой таблице, но отличается в порядке атрибутов , и поэтому сравнение строк не возвращает правильный результат !!!

иОпределяя те же поля XML, мне нужно сравнение:

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

, но я получаю следующее сообщение об ошибке:

Тип данных XML нельзя сравнивать или сортировать, кромепри использовании оператора IS NULL.

тогда каково наилучшее решение для определения того же XML без повторного приведения их к NVARCHAR?

1 Ответ

2 голосов
/ 15 сентября 2011

Зачем вообще это разыгрывать?Просто вставьте их в столбец 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
...