[英]How to compare two xml files in mssql
我有2个文件类型:
@xmlAuthors1 XML =N'
<Author name="John" surname="Clinton" />
<Author name="Bill" surname="Skobov" />
<Author name="John" surname="Lokwood" />;
@xmlAuthors2 XML =N'
<Author name="Bill" surname="Skobov" />
<Author name="John" surname="Clinton" />
<Author name="John" surname="Lokwood" />;
如何找出它们相等? 比较文件1的每一行与文件2的每一行
例如,您可以像这样比较它们:
DECLARE @xmlAuthors1 XML = N'
<Author name="John" surname="Clinton" />
<Author name="Bill" surname="Skobov" />
<Author name="John" surname="Lokwood" />',
@xmlAuthors2 XML =N'
<Author name="Bill" surname="Skobov" />
<Author name="Johns" surname="Clinton" />
<Author name="John" surname="Lokwood" />'
SELECT *
FROM (
SELECT CAST(x1.t.query('.') as nvarchar(max)) as x1,
CAST(x2.t.query('.') as nvarchar(max)) as x2
FROM @xmlAuthors1.nodes('/*') as x1(t)
FULL OUTER JOIN @xmlAuthors2.nodes('/*') as x2(t)
ON CAST(x1.t.query('.') as nvarchar(max)) = CAST(x2.t.query('.') as nvarchar(max))
) as x
WHERE x1 is null or x2 is null
如果相等,将没有输出
这取决于对您意味着什么。 我将比较数据如下:
DECLARE @xmlAuthors1 XML =N'
<Author name="John" surname="Clinton" />
<Author name="Bill" surname="Skobov" />
<Author name="John" surname="Lokwood" />
<Author name="John" surname="Blurred" />';
DECLARE @xmlAuthors2 XML =N'
<Author name="Bill" surname="Skobov" />
<Author name="John" surname="Clinton" />
<Author name="John" surname="Lokwood" />';
WITH Xml1 AS
(
SELECT
T.A.value('@name', 'varchar(20)') Name,
T.A.value('@surname', 'varchar(20)') Surname
FROM @xmlAuthors1.nodes('/Author') T(A)
), Xml2 AS
(
SELECT
T.A.value('@name', 'varchar(20)') Name,
T.A.value('@surname', 'varchar(20)') Surname
FROM @xmlAuthors2.nodes('/Author') T(A)
)
SELECT 'Unique in 1' [Description], * FROM (SELECT * FROM Xml1 EXCEPT SELECT * FROM Xml2) Q1
UNION ALL
SELECT 'Unique in 2' [Description], * FROM (SELECT * FROM Xml2 EXCEPT SELECT * FROM Xml1) Q2
这个特定的例子产生:
Description Name Surname
----------- ---- -------
Unique in 1 John Blurred
这是我的方法:
.query(.data()).value()
有一个不错的技巧,可将所有内部文本检索为以空格分隔的字符串。 这样可以轻松地在字符串级别进行比较...
我将您的输入更改为包括更多测试用例:
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
如果要查找两者相等的对象,则可以使用此方法
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.