SQL Server 复制(疑难解答)
本主题包含以下部分,它们均关乎 DB2 和 SQL Server 的 OLE DB 提供程序(数据提供程序)与 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 失败(日期时间值的字符串表示形式不是有效的日期时间值)。 当复制配置为将 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
语句从主数据库切换到要从中复制的数据库。
USE [Test]
select name, status from sysarticles
结果应该显示要修改的文章名称。 在此示例中,下表显示的是名称为 DB2TS01 的结果。
name | 状态 |
---|---|
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 复制订阅服务器数据源定义中,重新配置数据提供程序连接以指定“Use Early Metadata=true”。
有关详细信息,请参阅 为 DB2 数据链接配置数据提供程序 (DB2) OLE DB Provider for DB2 中的所有属性文档。
步骤 2 重新配置 SQL Server 复制订阅项目,以包含选项“24”(“在 INSERT 语句中包括列名并使用参数化语句。”)。
有关详细信息,请参阅 SQL Server 文档中的 SQL Server 复制 sp_addarticle (Transact-SQL) 。