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
回避策
トランザクション レプリケーションでこの問題を回避するには、次の手順に従います。
SQL Server Management Studio を開き、ディストリビューターとして機能するサーバーに接続します。
[オブジェクト エクスプローラー] で [SQL Server エージェント] を展開し、[ジョブ展開します。
影響を受けるパブリケーションのスナップショット エージェント ジョブを選択して右クリックし、 Properties>Steps>Step 2>Edit を選択します。
ジョブ ステップのプロパティ ウィンドウで、コマンドの最後に
-NativeBcpFileFormatVersion 100
を追加し、OKを選択して変更を保存します。最新の Microsoft OLE DB ドライバーを適用します:
ディストリビューション エージェント (またはマージ エージェント) がプッシュ サブスクリプションに対して実行されている場合は、ディストリビューター サーバーに適用します。
ディストリビューション エージェント (またはマージ エージェント) がプル サブスクリプションに対して実行されている場合は、サブスクライバー サーバーに適用します。
C:\Program Files\Microsoft SQL Server\150\COM フォルダー内のmsoledbsql.dll ファイルの名前を変更します。
プッシュ サブスクリプションの場合は、ディストリビューター サーバー上のフォルダー内のファイルの名前を変更します。
プル サブスクリプションの場合は、サブスクライバー サーバー上のフォルダー内のファイルの名前を変更します。
msoledbsql.dll ファイルを C:\Windows\System32\ フォルダーからコピーし、C:\Program Files\Microsoft SQL Server\150\COM フォルダーに貼り付けます。
マージ レプリケーションでこの問題を回避するには、次の手順に従います。
ディストリビューター サーバー SQL Server 2019 Cumulative Update 15 (CU15) 以降のバージョンを適用します。
トランザクション レプリケーションの問題に適用されるすべての手順に従います。