如何指定 Oracle 发布服务器的数据类型映射(复制 Transact-SQL 编程)

虽然已经为 Oracle 发布服务器提供了一组默认数据类型映射,但可能仍有必要为给定的发布指定不同的映射。 可以使用复制存储过程,以编程方式指定自定义数据类型映射。 还可以设置在 Microsoft SQL Server 与非 SQL Server 数据库管理系统 (DBMS) 间映射数据类型时使用的默认映射。 有关详细信息,请参阅Oracle 发布服务器的数据类型映射

在创建属于 Oracle 发布的项目时定义自定义数据类型映射

  1. 如果尚不存在 Oracle 发布,请创建一个。 有关详细信息,请参阅如何从 Oracle 数据库创建发布(复制 Transact-SQL 编程)

  2. 在分发服务器上,执行 sp_addarticle。 将 @use_default_datatypes 的值指定为 0。 有关详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)

  3. 在分发服务器上,执行 sp_helparticlecolumns 以查看已发布项目中某列的现有映射。

  4. 在分发服务器上,执行 sp_changearticlecolumndatatype。 为 @publisher 指定 Oracle 发布服务器的名称,并指定 @publication@article@column 以定义已发布的列。 为 @type 指定要映射到的 SQL Server 数据类型的名称,并在必要时指定 @length@precision@scale

  5. 在分发服务器上,执行 sp_articleview。 这将创建用于从 Oracle 发布生成快照的视图。

将映射指定为数据类型的默认映射

  1. (可选)在分发服务器上,对任意一个数据库执行 sp_getdefaultdatatypemapping。 指定 @source_dbms@source_type@destination_dbms@destination_version 以及标识源 DBMS 所需的其他任何参数。 将使用输出参数返回有关目标 DBMS 中当前映射的数据类型的信息。

  2. (可选)在分发服务器上,对任意一个数据库执行 sp_helpdatatypemap。 指定 @source_dbms 以及筛选结果集所需的其他任何参数。 记下结果集中所需映射的 mapping_id 的值。

  3. 在分发服务器上,对任意一个数据库执行 sp_setdefaultdatatypemapping

    • 如果知道在步骤 2 中获得的 mapping_id 的值,请对 @mapping_id 指定该值。

    • 如果不知道 mapping_id,请指定 @source_dbms@source_type@destination_dbms@destination_type 参数以及标识现有映射所需的其他任何参数。

查找针对给定的 Oracle 数据类型的有效数据类型

  • 在分发服务器上,对任何一个数据库执行 sp_helpdatatypemap。 将 @source_dbms 的值指定为 ORACLE,并指定筛选结果集所需的其他任何参数。

示例

此示例将对其类型为 Oracle 数据类型 NUMBER 的列进行更改,以将该列映射到 SQL Server 数据类型 numeric(38,38) 而非默认数据类型 float。

EXEC sp_changearticlecolumndatatype 
    @publication = 'OraPublication', 
    @publisher = 'OraPublisher', 
    @article = 'OraArticle', 
    @column = 'OraArticleCol', 
    @type = 'numeric', 
    @scale = 38, 
    @precision = 38;
GO

此示例查询将返回 Oracle 9 数据类型 CHAR 的默认映射及替代映射。

EXEC sp_helpdatatypemap 
    @source_dbms = N'ORACLE', 
    @source_version = 9,
    @source_type = N'CHAR';
GO

此示例查询在未对 Oracle 9 数据类型 NUMBER 指定小数位数或精度时,返回该数据类型的默认映射。

EXEC sp_helpdatatypemap 
    @source_dbms = N'ORACLE', 
    @source_version = 9,
    @source_type = N'NUMBER',
    @defaults_only = 1;
GO