本主題包含以下章節,涉及 OLE DB Provider for DB2 與 SQL Server(資料提供者)之間的問題疑難排解。
無法將DATETIME2數據行復寫至 DB2 TIMESTAMP 數據行
如需 SQL Server 複寫的詳細資訊,請參閱《SQL Server 在線叢書》中的 開發人員指南(復寫) (https://go.microsoft.com/fwlink/?LinkId=193231)。
不正確的數據類型對應
根據從 SQL Server 到 DB2 資料類型的預設對應,SQL Server 複寫可能會不正確地轉換數據。 我們建議系統管理員和開發人員使用下列 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) 並使用具有字串常值值的訂閱發行項命令時,就會發生這種情況。
解決方案
重新設定 SQL Server 2008 複寫,以將 DATETIME2 映射至 DB2 TIMESTAMP,並使用參數調整訂閱文章命令。 這可讓數據提供者將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為 189。
mapping_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。
mapping_id | source_dbms | 來源類型 | destination_dbms | 目的地類型 | 目的地長度 |
---|---|---|---|---|---|
494 | MSSQLSERVER | datetime2 | DB2 | 時間戳記 | 零 |
步驟 5. 識別要重新設定的複寫訂閱專案。 使用 Transact-SQL USE
語句,從 master 資料庫切換到您要復寫的資料庫。
USE [Test]
select name, status from sysarticles
結果應該會顯示要修改的文章名稱。 在此範例中,下表顯示名稱DB2TS01的結果。
名稱 | 地位 |
---|---|
DB2TS01 | 25 |
如果此狀態值為 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)。
復寫 INSERT 作業失敗,錯誤 8152:字串或二進位數據將被截斷
問題
SQL Server 複寫 INSERT 作業可能會失敗,SQL Server 錯誤 8152(字串或二進位數據將會被截斷。 當 (1) 數據提供者未設定為使用早期元數據,且 (2) 複寫未設定為使用參數化 INSERT 語句時,可能會發生這種情況。
解決方案
步驟 1. 重新設定數據提供者連接,以在 SQL Server 複寫訂閱者數據源定義中指定「使用早期元數據=true」。
如需詳細資訊,請參閱在 OLE DB Provider for DB2 檔中 設定 DB2 資料鏈接的數據提供者 (DB2) 所有屬性 。
步驟 2 重新設定 SQL Server 複寫訂閱一文以包含選項 「24」 (“包含 INSERT 語句中的數據行名稱並使用參數化語句”。」
如需詳細資訊,請參閱 SQL Server 文件中的 SQL Server 複寫 sp_addarticle (Transact-SQL)。