MS Access 2022链接SQL Server 2012表全行列显示#Deleted如何解决
故障根因
该故障是MS Access 2022即点即用版本(Build 14931.20392属于2022年9月更新的当前通道版本)的已知兼容性问题,和权限、驱动本身、链接配置无关:
- Access 2022从该版本开始默认启用了针对SQL Server链接表的增强元数据校验逻辑,拉取数据后会严格比对行唯一标识、字段类型精度、行版本戳的元数据标记,一旦标记不匹配就会直接判定该行已删除,返回
#Deleted占位符。 - SQL Server 2012默认使用TDS 7.1协议返回结果集,其
rowversion/timestamp字段、大值类型字段的元数据标记格式和Access 2022新校验逻辑的预期格式不匹配,直接触发全表判定为已删除的现象。 - 已开展的排查结果完全符合该问题的特征:换驱动、刷新链接不会改变Access本身的校验逻辑,旧版本Access(2018/2019)未启用该严格校验,因此不会复现故障。
可行解决方案
按落地成本从低到高排序,选其一即可:
- 方案1:关闭Access全局增强校验开关
打开Access 2022,进入「文件 > 选项 > 当前数据库」,滚动到页面底部的数据引擎设置区域,取消勾选针对SQL Server使用增强元数据校验,确认后重启Access,刷新链接表即可恢复正常。该配置为客户端全局配置,一次修改对所有本地打开的Access数据库生效。 - 方案2:通过连接参数指定旧版TDS协议
无需修改全局配置,给所有SQL Server链接表的连接串追加TDS_Version=7.0参数,强制Access用旧版协议逻辑解析返回结果。可直接运行以下VBA代码批量修改:Sub FixLinkedTableConnect() Dim tdf As TableDef For Each tdf In CurrentDb.TableDefs ' 仅处理带连接串的SQL Server链接表 If Len(tdf.Connect) > 0 And InStr(tdf.Connect, "SQL Server") > 0 Then If InStr(1, tdf.Connect, "TDS_Version", vbTextCompare) = 0 Then tdf.Connect = tdf.Connect & ";TDS_Version=7.0" tdf.RefreshLink End If End If Next Set tdf = Nothing MsgBox "链接表修复完成" End Sub - 方案3:服务端打补丁适配新校验逻辑
给SQL Server 2012安装SP4及后续最新累积更新,补丁会补全TDS协议返回的元数据标记格式,适配Access 2022的新校验规则。该方案适合域内统一推送客户端、不方便修改用户本地Access配置的企业环境,补丁安装完成后需重启SQL Server服务生效。 - 方案4:回退Access版本
将客户端Access 2022回退到Build 14332.20000之前的版本,该版本上线前未启用增强元数据校验逻辑,不会触发该故障。
注意:无需浪费时间排查32/64位驱动匹配、表主键缺失、用户权限类问题,相同文件在旧版本Access可正常运行,已经排除以上因素。
内容的提问来源于stack exchange,提问作者jmichaelwDBA
相关产品推荐
相关产品推荐

