获取任何SQL查询的SHA-512

时间:2018-06-06 15:24:44

标签: sql sql-server sha sha512

比较两个文本文件的常见做法是使用SHA-512 [或任何其他实际的SHA算法]。如果两个SHA结果不相同,则文件不会完全相同。

我想对两个SQL查询做同样的事情。我只是想知道查询是否给出100%相同的结果与SHA-512 [或sha-256也可以]?

这可以执行吗?我正在使用SQL Server ...

2 个答案:

答案 0 :(得分:3)

只是为了帮助...

我们知道两个查询都以相同的顺序返回相同的列。

你必须这样做:

SELECT COUNT(*) FROM (
  ([YOUR_QUERY_A]
   EXCEPT
   [YOUR_QUERY_B]) -- A_B
  UNION ALL
  ([YOUR_QUERY_B]
   EXCEPT
   [YOUR_QUERY_A]) -- B_A
  ) EX

如果返回0,则两个查询都返回相同的

出于测试目的:

SELECT COUNT(*) FROM (
  (select 1 a
   EXCEPT
   select 1)
  UNION ALL
  (select 1
   EXCEPT
   select 1)
  ) EX

更改一些内部查询并查看更改

答案 1 :(得分:0)

这里有一些使用2种方法的SQL示例。

  1. FOR XML &安培; HASHBYTES
  2. EXCEPT
  3. IF OBJECT_ID('tempdb..#tmpTest') IS NOT NULL DROP TABLE #tmpTest;
    CREATE TABLE #tmpTest (
        id int identity(1,1) primary key, 
        col1 decimal(10,2), 
        col2 varchar(30)
    );
    
    insert into #tmpTest (col1, col2) values 
    (1,'val1'),
    (null,'val2'),
    (3,null),
    (4,'val4')
    -- ,(5,'monkeywrench')
    ;
    
    declare @SQL1 VARCHAR(1000);
    declare @SQL2 VARCHAR(1000);
    declare @SQLHASH VARCHAR(3000);
    declare @SQLEXCEPT VARCHAR(5000);
    
    set @SQL1 = 'select col1, col2 
    from #tmpTest
    where (col1 is null or col1 between 1 and 4)
    ';
    
    set @SQL2 = 'select col1, col2 
    from #tmpTest
    where (col2 is null or col2 is not null)
    ';
    
    set @SQLHASH = 'select 
    IIF(LEN(query1.x) = LEN(query2.x) AND HASHBYTES(''SHA2_512'', query1.x) = HASHBYTES(''SHA2_512'', query2.x),''true'',''false'') as SameHash
    from (
        '+ @SQL1 +'
        order by 1, 2
        for xml auto
    ) query1(x)
    cross join (
        '+ @SQL2 +'
        order by 1, 2
        for xml auto
    ) query2(x)';
    
    --select @SQLHASH as SQLHASH;
    execute(@SQLHASH);
    
    set @SQLEXCEPT = 'select 
    IIF(count(*) = 0,''true'',''false'') as SameRecords
    from (
        select * from
        (
            '+ @SQL1 +'
            except
            '+ @SQL2 +'
        ) as q1exceptq2
    
        union all
    
        select * from (
            '+ @SQL2 +'
            except
            '+ @SQL1 +'
        ) as q2exceptq1
    ) q';
    
    --select @SQLEXCEPT as SQLEXCEPT;
    execute(@SQLEXCEPT);
    

    在此示例中,两个动态查询都返回' true'。

    但请注意,仅仅因为结果集是相同的,并不意味着使用的标准是等效的。
    他们目前正在返回相同的结果可能只是运气不好 (只需将Monkeywrench记录取消注释即可从两者中获取错误)

    另外,关于FOR XML。当其中一个ORDER BY不同时,生成的XML和HASH也会不同。

    虽然使用EXCEPT,但最后只能添加ORDER BY,因为它会对组合结果集进行排序。