项目目标是能够确定哪些记录需要更新。
两台 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 更新(这需要几天的时间)。周末后我会和同事讨论这个问题。然而,我确实觉得奇怪的是,校验和的方式不同,中间字节只有一个乳头。
问题已解决,感谢您的意见。
服务器 1 有一个视图,通过在 CHECKSUM 中连接在一起的一组 CTE 生成校验和。事实证明,其中一个 CTE 返回具有相同时间戳的记录,这导致了随机排序顺序。 当选择总和时,即使没有发生任何变化,我也会得到一个或另一个(我已经告诉他们不要使用该字段,但他们听吗???)
我已经离题了,但我仍然觉得很奇怪,我得到的两个 32 位校验和 (hhhX Xhhh) 之间的位模式始终只在 X 字节上有所不同(如 0000 XXXX 和 XXXX 0000)。