SQL Server 复制 (故障排除)

本主题包含以下部分,这些部分涉及排查 OLE DB Provider for DB2 和 SQL Server(数据提供程序)与 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 值的字符串表示形式不是有效的日期时间值)。 当复制配置为将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'  
  

结果应指示出要修改的映射ID。 下表显示了此示例的结果窗格,其中mapping_id为 189。

映射标识符 source_dbms 源类型 destination_dbms 目的地类型 destination_length
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。

映射标识符 source_dbms 来源类型 destination_dbms 目的地类型 目的地长度
494 MSSQLSERVER datetime2 DB2 时间戳 Null

步骤 5. 确定要重新配置的复制订阅项目。 使用 Transact-SQL USE 语句从 master 数据库切换到要从中复制的数据库。

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)。

复制 INSERT 操作失败,出现错误 8152:字符串或二进制数据将被截断

问题

SQL Server 复制 INSERT操作可能会失败,出现 SQL Server 错误 8152(字符串或二进制数据将被截断)。 如果 (1) 数据提供程序未配置为使用早期元数据,并且 (2) 复制未配置为使用参数化 INSERT 语句,则可能会出现这种情况。

解决方案

步骤 1. 重新配置数据提供程序连接,以便在 SQL Server 复制订阅服务器的数据源定义中设置“Use Early Metadata=true”。

有关详细信息,请参阅 OLE DB Provider for DB2 文档中的 DB2 数据链接(DB2)所有属性配置数据提供程序

步骤 2 重新配置 SQL Server 复制订阅项目以包括选项“24”(“在 INSERT 语句中包含列名并使用参数化语句”)。

有关详细信息,请参阅 SQL Server 文档中的 SQL Server 复制sp_addarticle(Transact-SQL)。