次の方法で共有


ASCII 関数は、パブリッシャー データベース テーブルとサブスクライバー データベース テーブルで異なる結果を返します

適用対象: SQL Server 2019

この記事では、 ASCII 関数がパブリッシャー データベース テーブルとサブスクライバー データベース テーブルで異なる結果を返す問題の回避策について説明します。

現象

以下のシナリオについて考えてみます。

  • SQL Server 2019 では、トランザクション レプリケーションまたはマージ レプリケーションを使用します。

  • 初期スキーマとデータは、レプリケーション スナップショット エージェントを通じて適用されます。

  • Publisher データベースでは、文字データ型として定義されている列に 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. 影響を受けるパブリケーションのスナップショット エージェント ジョブを選択して右クリックし、 Properties>Steps>Step 2>Edit を選択します。

    4. ジョブ ステップのプロパティ ウィンドウで、コマンドの最後に-NativeBcpFileFormatVersion 100を追加し、OKを選択して変更を保存します。

    5. 最新の Microsoft OLE DB ドライバーを適用します:

      • ディストリビューション エージェント (またはマージ エージェント) がプッシュ サブスクリプションに対して実行されている場合は、ディストリビューター サーバーに適用します。

      • ディストリビューション エージェント (またはマージ エージェント) がプル サブスクリプションに対して実行されている場合は、サブスクライバー サーバーに適用します。

    6. C:\Program Files\Microsoft SQL Server\150\COM フォルダー内のmsoledbsql.dll ファイルの名前を変更します。

      • プッシュ サブスクリプションの場合は、ディストリビューター サーバー上のフォルダー内のファイルの名前を変更します。

      • プル サブスクリプションの場合は、サブスクライバー サーバー上のフォルダー内のファイルの名前を変更します。

    7. msoledbsql.dll ファイルを C:\Windows\System32\ フォルダーからコピーし、C:\Program Files\Microsoft SQL Server\150\COM フォルダーに貼り付けます。

  • マージ レプリケーションでこの問題を回避するには、次の手順に従います。

    1. ディストリビューター サーバー SQL Server 2019 Cumulative Update 15 (CU15) 以降のバージョンを適用します。

    2. トランザクション レプリケーションの問題に適用されるすべての手順に従います。