症状
假设你在 Microsoft SQL Server 2008 中使用事务复制,并且在发布上运行有一个更新查询。 如果将 SQL Server 升级到 SQL Server 2012 或 SQL Server 2014,并且更新查询未在升级前分发,则日志读取器代理可能会失败,并出现以下错误:
<Date> <Time> Publisher: {call sp_replcmds (500,0,0,0,500000)}<日期> <时间> 状态:0,代码:20011,文本: "进程无法在" Sp_replcmds 发布者名称< "上执行">"。<Date> <Time> 进程无法在 "<Publisher Name>" 上执行 "sp_replcmds"。<Date> <Time> 复制代理状态: 6<日期> <时间> 状态:0,代码:542,文本: "遇到无效的 datetime 值。 值超过9999年。 "。<Date> <Time> 状态:0,代码:3621,文本: ' 语句已终止。 '。<Date> <Time> 状态:0,代码:22037,文本: "进程无法在" 上执行 "sp_replcmds"<发布者名称>"。"。
即使没有出现此问题,也可以通过日志读取器代理对更新语句的已升级日志记录进行误解,并且分发代理中可能会出现以下错误:
515不能将值 NULL 插入列 "<列名称>",table "<表名称>";列不允许空值。 更新失败。
注意
-
不同的数据类型和约束可能导致报告不同的错误,并且此问题甚至可能导致不收敛。
-
从 SQL Server 2008 或 sql server 2008 R2 升级到 SQL Server 2012 或 SQL Server 2014 时出现此问题。
解决方案
如果错误 "515 不能将值 NULL 插入列"<列名称>",table"<表名称>";列不允许空值。 更新失败 "在分发代理中出现时,应重新初始化复制。 此修补程序不修复此错误。 若要避免此错误,请在升级之前禁用日志读取器代理,然后将所有方法升级到此修补程序,然后重新启用日志读取器代理。此问题首先在 SQL Server 的累积更新中修复。
SQL Server 2012 SP2 的累积更新2 /en-us/help/2983175
SQL Server 2014 的累积更新3 /en-us/help/2984923
SQL Server 2012 SP1 的累积更新11 /en-us/help/2975396
SQL Server 的每个新的累积更新均包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。