【问题标题】:SQL CHECKSUM_AGG(BINARY_CHECKSUM(*)) gives same result for 2 different tables with similar contentSQL CHECKSUM_AGG(BINARY_CHECKSUM(*)) 为具有相似内容的 2 个不同表提供相同的结果
【发布时间】:2020-08-23 01:48:36
【问题描述】:

我在 Microsoft SQL Server 中遇到了一些很奇怪的东西,基本上和 CHECKSUM_AGG(BINARY_CHECKSUM(*)) 函数有关。

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

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

  • 103 |托马斯
  • 112 |空

但是,它们仍然不同,因为第二个表有 5 个这样的行组合,但是如果我尝试通过运行计算 2 个表的 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 函数来查看两个表是否具有相同的内容,到目前为止,它看起来运行良好。但是,在极少数情况下,两个表的内容与上面的两个相似^^,恐怕该函数会为这两个表返回相同的结果。

有人能解释一下这背后的原因吗?是否有办法缓解这个问题?

在此先感谢,如果能提供任何帮助,我将不胜感激 :)

【问题讨论】:

    标签: sql sql-server checksum


    【解决方案1】:

    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;
    

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

    【讨论】:

    • 啊,我明白了,非常感谢@vvv4d 的回复。嗯,我试过了,它看起来像是在为每一行输出某种十六进制值。如果我有时间,我会再研究一下。老实说,我是 SQL 的新手,所以是的,还在学习。我也在研究触发器,因为显然这是查看表是否已被修改而不是使用哈希/校验和的正确方法。谢谢大家!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 2021-03-23
    • 2020-05-10
    • 2023-03-15
    • 1970-01-01
    • 2020-08-20
    相关资源
    最近更新 更多