sql - SQL CHECKSUM_AGG(BINARY_CHECKSUM(*)) 为具有相似内容的 2 个不同表提供相同的结果
问题描述
我在 Microsoft SQL Server 中遇到了一些非常奇怪的东西,基本上它与CHECKSUM_AGG(BINARY_CHECKSUM(*))
函数有关。
如您所见,每个表只有 2 个可能的行内容:
- 103 | 托马斯
- 112 | 无效的
但是,它们仍然不同,因为第二个表有 5 个这样的行组合,但是如果我尝试CHECKSUM_AGG(BINARY_CHECKSUM(*))
通过运行来计算 2 个表中的
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 满足散列函数的属性:当应用于任何两个表达式列表时,如果两个列表的相应 > 元素具有相同的类型并且在使用等于 (=) 运算符比较时相等,则返回相同的值。
例子
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;
推荐阅读
- django - 将字典列表中存在的多个 id 与模型 django 的 id 进行比较
- java - java.util.zip解压时为什么我的程序会跳过文件?
- pip - 无法使用 pip install --upgrade pip 升级 pip
- amazon-web-services - 无服务器 AWS Lambda Dynamodb 引发内部错误
- firebase - 使用 ListView 进行 Flutter 流分页
- python - AttributeError:模块“条带”没有属性“PaymentIntent”
- c# - 具有自定义数字格式字符串的 double.ToString(string) 不会产生预期的结果
- javascript - 如何使用 JavaScript 覆盖 CSS?
- if-statement - 首先如果语句为真,否则为真汇编语言
- c# - Binance API - “此请求的签名无效”