我在 Microsoft SQL Server 中遇到了一些非常奇怪的事情,基本上它与 CHECKSUM_AGG(BINARY_CHECKSUM(*))
函数有关。
如您所见,每个表格只有 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;
它们将显示相同的结果:
这很奇怪,我不知道为什么会这样。我正在执行 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;
关于SQL CHECKSUM_AGG(BINARY_CHECKSUM(*)) 对具有相似内容的 2 个不同表给出相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63542681/