Поделиться через


Функция ASCII возвращает различные результаты в таблицах баз данных издателя и подписчика.

Область применения: SQL Server 2019 г.

В этой статье приводятся обходные решения проблемы, из-за чего ASCII функция возвращает различные результаты в таблицах базы данных издателя и подписчика.

Симптомы

Рассмотрим следующий сценарий.

  • Репликация транзакций или репликация слиянием используется в SQL Server 2019 г.

  • Исходная схема и данные применяются через агент моментальных снимков репликации.

  • В базе данных Publisher столбец, определенный как символьный тип данных, содержит значение NULL — символ ASCII 0 char(0).

В этом сценарии при использовании ASCII функции для преобразования столбца в таблицах базы данных издателя и подписчика возвращаются разные результаты. Вы можете обратиться к следующему примеру:

  • Преобразуйте столбец (col1) в таблице базы данных Publisher:

    SELECT id, col1, ASCII(col1) FROM PublisherTable
    

    Снимок экрана: результаты для таблицы издателя.

  • Преобразуйте столбец (col1) в таблице базы данных подписчика:

    SELECT id, col1, ASCII(col1) FROM SubscriberTable
    

    Снимок экрана: результаты для таблиц подписчиков.

Обходной путь

  • Чтобы обойти эту проблему при репликации транзакций, выполните следующие действия:

    1. Откройте SQL Server Management Studio и подключитесь к серверу, выступая в качестве распространителя.

    2. В разделе обозреватель объектов разверните узел агент SQL Server, а затем — Задания.

    3. Выберите задание агента snapshot для затронутой публикации, щелкните его правой кнопкой мыши и выберите Свойства>Шаг>2>Изменить.

    4. В окне Свойства шага задания добавьте -NativeBcpFileFormatVersion 100 в конце команды и нажмите кнопку ОК , чтобы сохранить изменения.

    5. Примените последнюю версию драйвера Microsoft OLE DB:

      • Если агент распространителя (или агент слияния) работает для принудительных подписок, примените его на сервере распространителя.

      • Если агент распространителя (или агент слияния) выполняется для подписок по запросу, примените его на сервере подписчика.

    6. Переименуйте файл msoledbsql.dll в папку C:\Program Files\Microsoft SQL Server\150\COM:

      • Если это принудительная подписка, переименуйте файл в папке на сервере распространителя.

      • Если это подписка по запросу, переименуйте файл в папке на сервере подписчика.

    7. Скопируйте файлmsoledbsql.dll из папки C:\Windows\System32\ и вставьте его в папку C:\Program Files\Microsoft SQL Server\150\COM.

  • Чтобы обойти эту проблему при репликации слиянием, выполните следующие действия.

    1. Примените SQL Server накопительным пакетом обновления 15 (CU15) 2019 или более поздней версии на сервере распространителя.

    2. Выполните все действия, которые применяются к проблеме репликации транзакций.