本主题包含以下部分,这些部分涉及排查 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)。