SQL CHECKSUM在SSMS与VS(Dapper/EF)中返回值不一致问题求助
问题:SQL Server CHECKSUM在SSMS与C#(Dapper/EF)中返回值不一致
背景
- 目标:识别两台运行兼容性级别150的SQL Server中需要更新的记录,通过对比其中一台视图返回的多字段(Uid、DateTime、int、Varchar等)
CHECKSUM值与另一台服务器表的对应值,判断记录是否变更。
现象
- 在SSMS中执行相同查询,两边的CHECKSUM结果始终匹配;
- 在C# 2022中使用Dapper或Entity Framework查询时,参考服务器的结果始终正确,源视图却持续返回固定的错误值。
差异细节
对比发现CHECKSUM结果的中间字节存在差异:
- 示例1:
- 源视图返回值:
6DC8 D3BB - 参考服务器返回值:
6DCC 03BB - 二进制差异:
1000(8)vs1101(D);0110(C)vs0000(0),怀疑是字节序问题。
- 源视图返回值:
- 示例2(64位相关现象):
- 源视图返回值:
FFFF FFFF B4DD DA5B - 参考服务器返回值:
FFFF FFFF B4C4 0A5B - 二进制差异:
1101(D)vs1101(D);0100(4)vs0000(0)(Windows计算器转换,可信度80%)
- 源视图返回值:
补充信息
- 已知
CHECKSUM存在碰撞风险,可靠性低于HASHBYTES,但当前方案并非本人制定; - SSMS与C#代码使用完全相同的查询语句,视图通过
CHECKSUM(字段1, 字段2, ...)生成checkvalue,可提供复现代码; - 曾考虑通过添加固定排序规则解决(排序规则会影响CHECKSUM结果),但修改需执行5万次更新(耗时数天),暂未实施,同时对仅中间单个字节差异的现象存在疑问。
内容的提问来源于stack exchange,提问作者Henrik Carlsen
相关产品推荐
相关产品推荐

