ASCII 函数在发布服务器和订阅服务器数据库表中返回不同的结果

适用于:2019 SQL Server

本文提供了函数在发布服务器和订阅服务器数据库表中返回不同结果的问题 ASCII 的解决方法。

症状

请考虑以下情况:

  • 在 2019 SQL Server 中使用事务复制或合并复制。

  • 初始架构和数据通过复制快照代理应用。

  • 在 Publisher 数据库中,定义为字符数据类型的列包含 NULL 值 - ASCII 字符 0 char(0)

在此方案中,使用 ASCII 函数转换发布服务器和订阅服务器数据库表中的列时,将返回不同的结果。 可以参考以下示例:

  • 转换发布服务器数据库表中的列 (col1) :

    SELECT id, col1, ASCII(col1) FROM PublisherTable
    

    发布者表的结果的屏幕截图。

  • 转换订阅服务器数据库表中的列 (col1) :

    SELECT id, col1, ASCII(col1) FROM SubscriberTable
    

    订阅服务器表的结果的屏幕截图。

解决方法

  • 若要解决事务复制的此问题,请执行以下步骤:

    1. 打开SQL Server Management Studio并连接到充当分发服务器的服务器。

    2. “对象资源管理器”下,展开“SQL Server 代理”,再展开“作业”。

    3. 为受影响的发布选择快照代理作业,右键单击它,然后选择“属性>步骤步骤>2>编辑”。

    4. 在“ 作业步骤属性” 窗口中,在命令末尾添加 -NativeBcpFileFormatVersion 100 并选择“ 确定 ”以保存更改。

    5. 应用最新的 Microsoft OLE DB 驱动程序

      • 如果分发代理 (或合并代理) 为推送订阅运行,请在分发服务器上应用它。

      • 如果分发代理 (或合并代理) 为请求订阅运行,请在订阅服务器上应用它。

    6. 重命名 C:\Program Files\Microsoft SQL Server\150\COM 文件夹中的 msoledbsql.dll 文件:

      • 如果是推送订阅,请重命名分发服务器上的 文件夹中的文件。

      • 如果是请求订阅,请重命名订阅服务器服务器上的 文件夹中的文件。

    7. C:\Windows\System32\ 文件夹中复制 msoledbsql.dll 文件,并将其粘贴到 C:\Program Files\Microsoft SQL Server\150\COM 文件夹中。

  • 若要解决合并复制的此问题,请执行以下步骤:

    1. 在分发服务器上应用 SQL Server 2019 累积更新 15 (CU15) 或更高版本。

    2. 按照应用于事务复制问题的所有步骤进行操作。