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

适用于: SQL Server 2019

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

现象

假设出现了下面这种情景:

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

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

  • 在发布服务器数据库中,定义为字符数据类型的列包括 NULL 值 - ASCII 字符 0 char(0)

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

  • 转换 Publisher 数据库表中的列(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. 遵循应用于事务复制问题的所有步骤。