首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取任何SQL查询的SHA-512。

获取任何SQL查询的SHA-512。
EN

Stack Overflow用户
提问于 2018-06-06 15:24:43
回答 2查看 716关注 0票数 1

比较两个文本文件的一个常见做法是使用SHA-512或任何其他已实现的SHA。如果两个SHA结果不相同,那么文件就不是完全相同的。

我也想对两个SQL查询做同样的工作。我只想知道,使用SHA-512或sha-256查询是否提供100%相同的结果也可以。

有可能这样做吗?我正在使用SQL Server..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-06 15:35:56

只是为了帮助..。

据了解,两个查询都以相同的顺序返回相同的列。

你必须这样做:

代码语言:javascript
复制
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,则两个查询返回相同的

为试验目的:

代码语言:javascript
复制
SELECT COUNT(*) FROM (
  (select 1 a
   EXCEPT
   select 1)
  UNION ALL
  (select 1
   EXCEPT
   select 1)
  ) EX

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

票数 3
EN

Stack Overflow用户

发布于 2018-06-06 16:04:22

下面是一些使用2种方法的SQL示例。

  1. 对于XML & 哈希泰斯
  2. 例外
代码语言:javascript
复制
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”。

但是请注意,仅仅因为结果集是相同的,并不意味着所使用的标准是等价的。

这可能只是运气不好,他们目前正在返回相同的结果。

(只要取消对猴子扳手记录的评论,就可以从这两种记录中得到错误信息)

另外,关于FOR XML。当其中一个ORDER是不同的,则结果XML和HASH也会有所不同。

如果使用一个end,则只能在末尾添加ORDER,因为它对组合结果集进行排序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50724104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档