当项目使用存储过程自定义冲突解决程序时,SQL Server 合并复制的同步失败

本文可帮助解决当表项目使用存储过程自定义冲突解决程序时 SQL Server 合并复制的同步失败的问题。

原始产品版本: SQL Server 2008 R2、SQL Server 2008、SQL Server 2005
原始 KB 数: 2585632

症状

请考虑以下方案:

  • 在 sql Server 2008 Microsoft sql Server 2008 或 Microsoft SQL Server 2005 中配置Microsoft SQL Server 2008 R2 中的合并复制。

  • 该出版物包含一个表项目。

  • 表项目包含数据类型varcharnvarchar或 .

    注释

    表项目可能包含这两种数据类型的列。

  • 该表项目还包含数据类型 decimal的列。

    注释

    该表还可以包含数据类型 numeric 的列或 money

  • 具有uniqueidentifier该属性的数据类型Rowguidcol列不是表中的最后一列。 例如,数据类型 decimal的列, numericmoney 按列排序 uniqueidentifier

  • 将表项目配置为使用存储过程自定义冲突解决程序。

  • 检测到表项目的冲突。

在此方案中,同步可能会在冲突解决期间失败。 出现此问题时,可能会收到类似于以下内容之一的错误消息:

错误消息 1

由于发布服务器上的项目架构与订阅服务器上的项目架构不匹配,因此合并代理失败。 当订阅服务器上有挂起的 DDL 更改在等待应用时,可能出现此错误。
重新启动合并代理以应用 DDL 更改,然后同步订阅。

错误消息 2

合并过程无法存储项目“article_name”的冲突信息。 检查发布属性以确定存储冲突记录的位置。
强制转换规范的字符值无效。

如果合并代理作业失败,合并代理会报告这些错误。

原因

出现此问题的原因是存储过程自定义冲突解决程序返回的数据被错误地转换为基表中的 SQL Server 数据类型。

注释

存储过程返回正确的数据。

状态

Microsoft已确认,这是本文开头的“原始产品版本”中列出的Microsoft产品中的 bug。

解决方法 1:将数据类型 varchar 的列强制转换为 char

注释

收到的错误消息取决于表定义。 你可能必须尝试这些方法的变体来解决此问题。

若要解决此问题,请将数据类型 varchar 的列强制转换为存储过程自定义冲突解决程序代码中的数据类型 char

解决方法 2:更改基础表中的列顺序

若要解决此问题,请更改基础表中的列顺序。 例如,更改列顺序,使uniqueidentifier具有该属性的列在数据类型Rowguidcoldecimal、和numericmoney列之后varchar排序。

注释

可能需要删除列,然后重新添加列以更改排序顺序。 此外,如果以后添加列,问题可能会再次出现。