共用方式為


SQL Server 複寫 (疑難解答)

本主題包含以下章節,涉及 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)