在 SSMS 和 VS(Dapper og Entities)中查询时,SQL CHECKSUM 返回不同的值

问题描述 投票:0回答:1

项目目标是能够确定哪些记录需要更新。

两台 SQL 服务器,每台运行 Comp.Level 150。其中一台有一个视图,返回多个参数(Uid、DateTime、int、Varchar ..)的校验和。这是与其他服务器上的表进行比较。当它们不同时,变化就发生了。至少理论上是这样。

在 SSMS 中它们始终匹配,而在 C# (2022) 中,运行 Dapper 或 Entity 框架,引用服务器始终正确,而 src-view 始终返回相同的错误值。

(我不认为这是一个重复的问题。如果是这样,我很抱歉)

如果我比较两个校验和,它们在中间字节不同,例如。

源:6DC8D3BB 参考号:6DCC03BB

1000:8 1101:D 0110:C 0000:0

字节序问题?

CHECKSUM 返回 INT,但我注意到有些 64 位正在发生:

来源:FFFF FFFF B4DD DA5B 参考号:FFFF FFFF B4C40A5B

1101:D 1101:D 0100:4 0000:0

(我使用Windows calc进行转换,我相信它80%,但没有检查值)

Siggemannen:我知道 CHECKSUM 意味着存在冲突风险,并且被认为不如 HASHBYTES 可靠,但这不是我的决定。

Thom:在 SSMS 中,这是一个简单的“从 id = @id 中选择 checkvalue”...这与我在 dapper 中使用的脚本相同: var result = db.Query(script, param), public class checksummodel { public int checkvalue {得到;放;}} 该视图使用 CHECKSUM(field1(int), field2(uniqueidentifier...) ... fieldn()) 作为 [checkvalue]。如果您仍然想要代码,我将尝试构建一个重现该内容的通用演示。

CharlieFace:我考虑过添加固定排序规则,因为它确实会改变结果。这可能是关键:也许 SSMS 做了一些魔法来适应这一点,最终让我感到困惑。我避免了这种改变,因为这意味着我发布了一些 50k 更新(这需要几天的时间)。周末后我会和同事讨论这个问题。然而,我确实觉得奇怪的是,校验和的方式不同,中间字节只有一个乳头。

sql-server visual-studio-2022 checksum
1个回答
0
投票

问题已解决,感谢您的意见。

服务器 1 有一个视图,通过在 CHECKSUM 中连接在一起的一组 CTE 生成校验和。事实证明,其中一个 CTE 返回具有相同时间戳的记录,这导致了随机排序顺序。 当选择总和时,即使没有发生任何变化,我也会得到一个或另一个(我已经告诉他们不要使用该字段,但他们听吗???)

我已经离题了,但我仍然觉得很奇怪,我得到的两个 32 位校验和 (hhhX Xhhh) 之间的位模式始终只在 X 字节上有所不同(如 0000 XXXX 和 XXXX 0000)。

© www.soinside.com 2019 - 2024. All rights reserved.