SQL Server 複寫 (疑難排解)
本主題包含下列各節,與針對 OLE DB Provider for 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) 並使用具有字串文件資料值的訂閱文章命令時,可能會發生此問題。
解決方案
將 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。 下表顯示此範例的結果窗格,其中 mapping_id 為 189。
mapping_id | source_dbms | source_type | destination_dbms | destination_type | destination_length |
---|---|---|---|---|---|
189 | MSSQLSERVER | datetime2 | DB2 | VARCHAR | 27 |
步驟 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 | source_type | destination_dbms | destination_type | destination_length |
---|---|---|---|---|---|
494 | MSSQLSERVER | datetime2 | DB2 | timestamp | NULL |
步驟 5: 識別要重新設定的複寫訂閱文章。 使用 Transact-SQL USE
語句,從 master 資料庫切換到您要複寫的資料庫。
USE [Test]
select name, status from sysarticles
結果應顯示要修改的文章名稱。 在此範例中,下表顯示名稱為 DB2TS01 的結果。
NAME | status |
---|---|
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;
如需詳細資訊,請參閱《線上叢書》中的複寫系統預存程式概念 (https://go.microsoft.com/fwlink/?LinkId=193232 SQL Server) 。
複寫 INSERT 作業失敗,錯誤 8152:字串或二進位資料會被截斷
問題
SQL Server 複寫 INSERT 作業可能會失敗,SQL Server錯誤 8152 (字串或二進位資料會被截斷。) 。 當 (1) 資料提供者未設定為使用早期中繼資料,而且 (2) 複寫未設定為使用參數化 INSERT 語句時,可能會發生這種情況。
解決方案
步驟 1。 重新設定資料提供者連線,以在SQL Server 複寫訂閱者資料來源定義中指定「使用早期中繼資料=true」。
如需詳細資訊,請參閱設定 DB2 資料連結的資料提供者 (DB2) OLE DB Provider for DB2 中的所有屬性檔。
步驟 2重新設定訂用帳戶SQL Server 複寫文章,以包含選項 「24」 (「在 INSERT 語句中包含資料行名稱,並使用參數化語句」。) 。
如需詳細資訊,請參閱SQL Server 檔中的 SQL Server 複寫 sp_addarticle (Transact-SQL) 。