Das war mein Ansatz:
Es gibt einen schönen Trick mit .query(.data()).value()
alle inneren Text als Raum zurückzuholen getrennt Zeichenfolge. Dies macht es einfach auf String-Ebene vergleichen ...
Ich änderte Ihre Eingabe noch einige Testfälle inlcude:
DECLARE @xmlAuthors1 XML = N'
<Author name="John" surname="Clinton" />
<Author name="Bill" surname="Different" />
<Author name="John" surname="Lokwood" />
<Author name="Test" surname="it" />',
@xmlAuthors2 XML =N'
<Author name="Bill" surname="Skobov" />
<Author name="John" surname="Clinton" />
<Author name="John" surname="Lokwood" />
<Author name="One" surname="More" />';
SELECT ISNULL(Author1,Author2) AS Author
,CASE WHEN Author1 IS NULL THEN 'Exists in 2' ELSE 'Exists in 1' END AS [Source]
FROM
(
SELECT B.query('data(@*)').value('.','varchar(max)') AS Author1
FROM @xmlAuthors1.nodes('/Author') AS A(B)
) AS tbl1
FULL OUTER JOIN
(
SELECT B.query('data(@*)').value('.','varchar(max)') As Author2
FROM @xmlAuthors2.nodes('/Author') AS A(B)
)AS tbl2 ON Author1=Author2
WHERE Author1 IS NULL OR Author2 IS NULL
Wenn Sie möchten, diejenigen finden, die in beide gleich sind, könnten Sie diese
verwenden
SELECT B.query('data(@*)').value('.','varchar(max)') AS EqualAuthor
FROM @xmlAuthors1.nodes('/Author') AS A(B)
INTERSECT
SELECT B.query('data(@*)').value('.','varchar(max)')
FROM @xmlAuthors2.nodes('/Author') AS A(B)
Siehe http://stackoverflow.com/questions/9013680/t-sql-how-can-i-compare-two-variables-of-type-xml-when-length-varcharmax – Serg