【问题标题】:How to compare two xml files in mssql如何比较mssql中的两个xml文件
【发布时间】:2016-11-30 07:02:00
【问题描述】:

我有 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 的每一行

【问题讨论】:

标签: sql sql-server xml sql-server-2012


【解决方案1】:

例如,您可以像这样比较它们:

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

如果相等就没有输出

【讨论】:

  • 您是否使用不相等的数据对此进行了测试?
  • 只是看起来更近了一点...您的想法非常接近我的想法,您将整个元素转换为字符串...但是WHERE x1 != x2 不处理NULLs,这表明FULL OUTER JOIN中的缺失值...
  • 是的,我已经测试过了,如果 x1 有值且 x2 为空或 x1 为空且 x2 有值,则工作正常。
  • 或者我不明白的东西,但是你的例子没有运行,它只有在需要找到一个相等的行时才会被激活。 operation not equal 当行不同或编号不同时不显示任何内容
  • 很奇怪,我稍后再检查。在我提供的示例中,它输出两行,如果从 'Johns' 中删除 's' - 没有行,这是昨天我检查的时候。
【解决方案2】:

这是我的方法:

.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)

【讨论】:

    【解决方案3】:

    这取决于平等对你意味着什么。我会比较数据如下:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 2023-03-30
      相关资源
      最近更新 更多