このトピックには、OLE DB Provider for DB2 と SQL Server (Data Provider) と SQL Server の間の問題のトラブルシューティングに関連する次のセクションが含まれています。
DATETIME2列を DB2 TIMESTAMP 列にレプリケートできない
SQL Server レプリケーションの詳細については、SQL Server オンライン ブック の開発者ガイド (レプリケーション) (https://go.microsoft.com/fwlink/?LinkId=193231) を参照してください。
正しくないデータ型マッピング
SQL Server レプリケーションでは、SQL Server から DB2 データ型への既定のマッピングに基づいて、データが正しく変換されない可能性があります。 管理者と開発者は、次の SQL Server システム ストアド プロシージャを使用して、レプリケーション データ型のマッピングを確認して変更することをお勧めします。
sp_helpdatatypemap
sp_getdefaultdatatypemapping
sp_setdefaultdatatypemapping
詳細については、[システム ストアド プロシージャ (Transact-SQL)](https://go.microsoft.com/fwlink/?LinkID=180765\) を参照してください。
DATETIME2列を DB2 TIMESTAMP 列にレプリケートできない
問題
SQL Server 2008 DB2 for z/OS へのレプリケーションは、SQLCODE -188 で失敗する可能性があります (datetime 値の文字列表現は有効な datetime 値ではありません)。 これは、DATETIME2を DB2 VARCHAR(27) にマップするようにレプリケーションが構成され、サブスクリプションアーティクル コマンドと文字列リテラル データ値を使用する場合に発生します。
ソリューション
パラメーターを使用して、DATETIME2を DB2 TIMESTAMP およびサブスクリプションアーティクル コマンドにマップするように SQL Server 2008 レプリケーションを再構成します。 これにより、データ・プロバイダーはDATETIME2を、IBM DB2 データベース・サーバーでサポートされる DB2 TIMESTAMP 構造体としてフォーマットすることができます。
ステップ バイ ステップの手順
手順 1. 変更するデータ型マッピングを特定します。
USE MASTER
すべてのステップにおいて
select * from sys.fn_helpdatatypemap
(
'MSSQLSERVER',
'%',
'%',
'%',
'%',
'%',
0
)
where destination_dbms = 'DB2' and source_type = 'datetime2'
結果は、変更するmapping_idを示す必要があります。 次の表に、mapping_idが 189 であるこの例の結果ウィンドウを示します。
mapping_id(マッピングID) | source_dbms | ソースタイプ | destination_dbms | 配送先タイプ | 行き先の長さ |
---|---|---|---|---|---|
189 | MSSQLSERVER | datetime2 | DB2 | VARCHAR | 二十七 |
手順 2. データ型マッピングを削除します。
exec sp_dropdatatypemapping 189
手順 3. データ型マッピングを追加します。
exec sp_adddatatypemapping
@source_dbms = 'MSSQLSERVER',
@source_type = 'datetime2',
@destination_dbms = 'DB2',
@destination_type = 'TIMESTAMP',
@destination_nullable = 1,
@destination_createparams = 0,
@dataloss = 0,
@is_default = 1
手順 4. クエリをもう一度実行して、新しいデータ型マッピングを確認します。
select * from sys.fn_helpdatatypemap
(
'MSSQLSERVER',
'%',
'%',
'%',
'%',
'%',
0
)
where destination_dbms = 'DB2' and source_type = 'datetime2'
結果には、新しいデータ型マッピングが表示されます。 この例では、次の表に示すmapping_idは 189 です。
マッピングID | source_dbms | ソースタイプ | 送信先_DBMS | 目的地タイプ | 宛先の長さ |
---|---|---|---|---|---|
494 | MSSQLSERVER | datetime2 | DB2 | タイムスタンプ | ヌル |
ステップ 5. 再構成するレプリケーション サブスクリプションの記事を特定します。 Transact-SQL USE
ステートメントを使用して、マスター データベースからレプリケート元のデータベースに切り替えます。
USE [Test]
select name, status from sysarticles
結果には、変更するアーティクルの名前が表示されます。 この例では、次の表に、名前がDB2TS01である結果を示しています。
名前 | ステータス |
---|---|
DB2TS01 | 二十五 |
状態値が 1 または 9 の場合、アーティクルは文字列リテラルの書式設定用に構成されます。
状態値が 17 または 25 の場合、アーティクルはパラメーター化された書式設定用に構成されます。
手順 6. パラメーター化されたコマンドのレプリケーション サブスクリプションに関する記事を構成します。
USE [Test]
DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = N'DB2TS_PUB01';
SET @article = N'DB2TS01';
EXEC sp_changearticle @publication, @article, 'status' , 'parameters' , 0 , 0;
詳細については、SQL Server オンライン ブックの レプリケーション システム ストアド プロシージャの概念 (https://go.microsoft.com/fwlink/?LinkId=193232) を参照してください。
エラー 8152: 文字列またはバイナリ データが切り捨てられるというエラーでレプリケーション INSERT 操作が失敗する
問題
SQL Server レプリケーションの INSERT 操作が SQL Server エラー 8152 で失敗する可能性があります (文字列またはバイナリ データは切り捨てられます)。 これは、(1) データ プロバイダーが初期メタデータを使用するように構成されておらず、(2) パラメーター化された INSERT ステートメントを使用するようにレプリケーションが構成されていない場合に発生する可能性があります。
ソリューション
手順 1. データ プロバイダー接続を再構成して、SQL Server レプリケーション サブスクライバーのデータ ソース定義で "Use Early Metadata=true" を指定します。
詳細については、OLE DB Provider for DB2 のドキュメントに記載されている「DB2 データ リンク (DB2) のすべてのプロパティの構成」を参照してください。
手順 2 オプション "24" を含むように SQL Server レプリケーション サブスクリプションの記事を再構成します ("INSERT ステートメントに列名を含め、パラメーター化されたステートメントを使用します")。
詳細については、 SQL Server のドキュメントの SQL Server レプリケーション sp_addarticle (Transact-SQL) を参照してください。