SQL CHECKSUM_AGG(BINARY_CHECKSUM(*)) 对具有相似内容的 2 个不同表给出相同的结果

标签 sql sql-server checksum

我在 Microsoft SQL Server 中遇到了一些非常奇怪的事情,基本上它与 CHECKSUM_AGG(BINARY_CHECKSUM(*)) 函数有关。

假设我有 2 个不同的表,其中的内容如下:

如您所见,每个表格只有 2 个可能的行内容:

  • 103 |托马斯
  • 112 |空

但是,它们仍然不同,因为第二个表有 5 个这样的行组合,但是如果我尝试通过运行计算这两个表的 CHECKSUM_AGG(BINARY_CHECKSUM(*))

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) AS "Table 1 Checksum" FROM Table_1;
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))AS "Table 2 Checksum" FROM Table_2;

它们将显示相同的结果:

2 Tables with same CHECKSUM_AGG result

这很奇怪,我不知道为什么会这样。我正在执行 CHECKSUM_AGG 函数来查看 2 个表是否具有相同的内容,到目前为止它看起来运行良好。但是,在极少数情况下,两个表的内容与上述两个表相似 ^^,我担心该函数将对两个表返回相同的结果。

谁能解释一下这背后的原因,以及是否有任何方法可以缓解这个问题?

提前致谢,如果有任何帮助,我将不胜感激:)

最佳答案

BINARY_CHECKSUM 正在检查值是否相同,但不考虑一个值与另一个表相比可能出现的次数。如果值出现的次数很重要,并且您想检测到不相同,因为尽管它们具有相同的值,但一个表确实比另一个表具有更多的值,您可以使用 HASHBYTES检测差异。

BINARY_CHECKSUM satisfies the properties of a hash function: when applied >over any two lists of expressions, returns the same value if the corresponding >elements of the two lists have the same type and are equal when compared >using the equals (=) operator.

例子

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) AS "Table 1 Checksum",
HashBytes('md5',convert(varbinary(max),(SELECT * FROM Table_1 FOR XML AUTO))) AS "Table 1 Hashbytes",
 FROM Table_1;

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))AS "Table 2 Checksum",
HashBytes('md5',convert(varbinary(max),(SELECT * FROM Table_2  FOR XML AUTO))) AS "Table 2 Hashbytes",
FROM Table_2;

https://learn.microsoft.com/en-us/sql/t-sql/functions/binary-checksum-transact-sql?view=sql-server-ver15#remarks

关于SQL CHECKSUM_AGG(BINARY_CHECKSUM(*)) 对具有相似内容的 2 个不同表给出相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63542681/

相关文章:

dart - 在Dart中,hashCode()方法调用能否在相等(==)的对象上返回不同的值?

sql - Talend 开放工作室 : Load input files into database

SQL - 非空或条件

mysql - 当每个外键只需要一行时,SQL 会减少 SELECT 中完成的工作

javascript - 在 SSRS 报告中包含外部 javascript 文件

sql - 多行合并为单行并合并列 SQL

sql - 如何处理 AWS Redshift 卸载命令中的引用值?

c# - 从数据库中获取浮点值

algorithm - 可以用什么方法来分析和猜测4位校验和算法?

udp - 我的 UDP 校验和计算每次都会给出错误的结果