比较两个文本文件的常见做法是使用SHA-512 [或任何其他实际的SHA算法]。如果两个SHA结果不相同,则文件不会完全相同。
我想对两个SQL查询做同样的事情。我只是想知道查询是否给出100%相同的结果与SHA-512 [或sha-256也可以]?
这可以执行吗?我正在使用SQL Server ...
答案 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示例。
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,因为它会对组合结果集进行排序。