共用方式為


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)