项目设置(转换)(OracleToSQL)

“项目设置”对话框的“转换”页面包含一些设置,用来自定义 SSMA 如何将 Oracle 语法转换为 SQL Server 语法。

“项目设置”和“默认项目设置”对话框中提供了“转换”窗格:

  • 要指定用于所有 SSMA 项目的设置,请在“工具”菜单上单击“默认项目设置”,从“迁移目标版本”下拉列表中选择需要为其查看或更改设置的迁移项目类型,单击左侧窗格底部的“常规”,然后单击“转换”。

  • 要指定用于当前项目的设置,请在“工具”菜单上单击“项目设置”,单击左侧窗格底部的“常规”,然后单击“转换”。

内置函数和所提供的包

术语 定义
将 COUNT 函数转换为 COUNT_BIG COUNT如果函数可能返回大于 2,147,483,647(即 231-1)的值,则应将函数转换为 COUNT_BIG

如果选择“是”,SSMA 会将所使用的全部 COUNT 转换为 COUNT_BIG

如果选择“否”,函数将保持为 COUNT。 如果函数返回大于 231-1 的值,SQL Server 将返回一个错误。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/完整模式:
乐观模式:否
将 SUBSTR 函数调用转换为 SUBSTRING 函数调用 SSMA 可以根据参数数量将 Oracle SUBSTR 函数调用转换为 SQL Server substring 函数调用。 如果 SSMA 无法转换 SUBSTR 函数调用,或者不支持参数数量,SSMA 会将 SUBSTR 函数调用转换为自定义 SSMA 函数调用。

如果选择“是”,SSMA 会将使用三个参数的 SUBSTR 函数调用转换为 SQL Server substring。 SSMA 将转换其他 SUBSTR 函数,以调用自定义 SSMA 函数。

如果选择“否”,SSMA 会将 SUBSTR 函数调用转换为自定义 SSMA 函数调用。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观模式:
完整模式:否
转换 TO_CHAR(date, format) 函数调用 SSMA 可以将 Oracle TO_CHAR(date, format)ssma_oracle 架构转换为过程。

如果选择“使用 TO_CHAR_DATE 函数”,SSMA 会使用用于转换的英语语言将 TO_CHAR(date, format) 转换为 TO_CHAR_DATE 函数。

如果选择“使用 TO_CHAR_DATE_LS 函数 (NLS care)”,SSMA 会使用用于转换的英语语言将 TO_CHAR(date, format) 转换为 TO_CHAR_DATE_LS 函数。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观模式:使用 TO_CHAR_DATE 函数
完整模式:使用 TO_CHAR_DATE_LS 函数 (NLS care)
为 DBMS_SQL.PARSE 生成错误 如果选择“错误”,SSMA 将在转换 DBMS_SQL.PARSE 时生成错误。

如果选择“警告”,SSMA 将在转换 DBMS_SQL.PARSE 时生成警告。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:
默认/乐观/完整模式:错误
在 CONCAT 函数调用中使用 ISNULL ISNULL 语句用于 CONCAT 函数调用,以模拟 Oracle 行为。 此设置具有以下选项:





在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观模式:
完整模式:
在 REPLACE 函数调用中使用 ISNULL ISNULL 语句用于 REPLACE 函数调用,以模拟 Oracle 行为。 此设置具有以下选项:





在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观模式:
完整模式:
尽可能使用本机转换函数 如果选择“是”,SSMA 会尽可能将 TO_CHAR(date, format) 转换为本机转换函数。

如果选择“否”,SSMA 会将 TO_CHAR(date, format) 转换为 TO_CHAR_DATETO_CHAR_DATE_LS(由“转换 TO_CHAR(date, format)”选项定义)。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观模式:
完整模式:否

转换消息

术语 定义
生成有关问题的消息 指定 SSMA 在转换期间是否生成信息性消息、在“输出”窗格中显示这些消息,并将其添加到转换后的代码中。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观模式:
完整模式:否

“杂项”选项

术语 定义
将 ROWNUM 表达式强制转换为整数 当转换 ROWNUM 表达式时,SSMA 会将表达式转换为一个 TOP 子句,后跟表达式。 如下示例显示了一个 Oracle ROWNUM 语句中的 DELETE

DELETE FROM Table1
WHERE ROWNUM < expression and Field1 >= 2

如下示例显示了所生成的 Transact-SQL:

DELETE TOP (expression-1)
FROM Table1
WHERE Field1>=2

TOP 要求 TOP 子句表达式的计算结果是一个整数。 如果此整数为负,该语句将产生一个错误。

如果选择“是”,SSMA 会将表达式强制转换为整数。

如果选择“否”,SSMA 会在转换后的代码中将所有非整数表达式标记为一个错误。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/完整模式:
乐观模式:是
默认架构映射 此设置指定如何将 Oracle 架构映射到 SQL Server 架构。 此设置提供了两个选项:

架构到数据库:在此模式下,Oracle 架构 sch1 默认映射到 SQL Server 数据库 sch1 中的 dbo SQL Server 架构。

架构到数据库:在此模式下,Oracle 架构 sch1 默认映射到连接对话框中提供的默认 SQL Server 数据库中的 sch1 SQL Server 架构。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:架构到数据库
模拟 ORDER BY 子句中的 Oracle null 行为 在 SQL Server 和 Oracle 中,NULL 值以不同的方式排序:

在 SQL Server 中,NULL 值是有序列表中的最小值。 在升序列表中,会首先显示 NULL 值。

在 Oracle 中,NULL 值是有序列表中的最大值。 默认情况下,在升序列表中,会最后显示 NULL 值。

Oracle 具有 NULLS FIRSTNULLS LAST 子句,可用于更改 Oracle 对 NULL 进行排序的方式。

SSMA 可以通过检查 NULL 值来模拟 Oracle ORDER BY 的行为。 随后,它首先按指定顺序中的 NULL 值排序,然后按其他值排序。

如果选择“是”,SSMA 将以模拟 Oracle ORDER BY 行为的方式转换 Oracle 语句。

如果选择“否”,SSMA 将忽略 Oracle 规则,并在遇到 NULLS FIRSTNULLS LAST 子句时生成一个错误消息。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观模式:
完整模式:
在 SELECT 中模拟行计数异常 如果一个具有 INTO 子句的 SELECT 语句未返回任何行,Oracle 将引发一个 NO_DATA_FOUND 异常。 如果此语句返回两个或更多的行,将会引发 TOO_MANY_ROWS 异常。 如果行计数不等于 1,SQL Server 中的转换语句不会引发任何异常。

如果选择“是”,SSMA 会在每个 SELECT 语句之后添加对特殊 db_error_exact_one_row_check 过程的调用。 此过程将模拟 NO_DATA_FOUNDTOO_MANY_ROWS 异常。 这是默认设置,它允许尽可能准确地重现 Oracle 的行为。 如果源代码具有处理这些错误的异常处理程序,则应始终选择“是”。 请注意,如果 SELECT 语句发生在用户定义的函数内,此模块将转换为一个存储过程,因为执行存储过程和引发异常这两项操作与 SQL Server 函数上下文不兼容。

如果选择“否”,将不会生成异常。 当 SSMA 转换用户定义的一个函数,而且用户希望它在 SQL Server 中保持为一个函数时,此设置非常有用。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:
启用修复顾问 启用后,SSMA 将尝试借鉴用户在目标 T-SQL 代码中进行的修改,并建议在可以应用类似模式的其他位置执行潜在的代码修复。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:
生成常量表达式列别名 如果 SELECT 列表中的表达式缺少别名,SSMA 可以生成常量别名(例如 expr1expr2 等等),或者将表达式本身用作别名。 由于表达式可能很长且列名长度有限,因此对此类别名使用常量基本名称会更安全。 尽管这是一个更安全的选项,但有时并不可行,因为可能存在对所生成的数据集的外部依赖关系。 在这些情况下,用户可能希望根据值表达式来命名列,类似于 Oracle 的行为。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观模式:
完整模式:否
省略扩展属性 启用后,SSMA 不会将扩展属性添加到它在目标数据库中创建的对象。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:
转换错误代码 启用后,如果发现了映射,目标 SQL Server 端上的错误代码将转换为 Oracle 错误代码。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/完整模式:
乐观模式:否
对类型引用使用完整类型规范 启用后,SSMA 将遵循例程参数和返回值的完整类型规范(包括标度和精度)。 Oracle 不允许对例程参数使用数据类型参数,但在某些情况下,可以隐式派生这些参数,例如当使用 %TYPE%ROWTYPE 属性时。 在这样的情况下,SSMA 可以在将其转换为 SQL Server 时使用完整类型规范(包括精度和标度)。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观模式:
完整模式:否
在字符串串联中使用 ISNULL 当字符串串联包含 NULL 值时,Oracle 和 SQL Server 会返回不同的结果。 Oracle 将 NULL 值视为空字符集。 SQL Server 将返回 NULL

如果选择“是”,SSMA 会将 Oracle 串联字符 (||) 替换为 SQL Server 串联字符 (+)。 SSMA 还会检查串联两侧的表达式中是否存在 NULL 值。

如果选择“否”,SSMA 将替换串联字符,但不检查 NULL 值。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:

对象转换

术语 定义
在 NOT NULL 的列上,使用 SET NULL 引用操作来转换外键 Oracle 允许创建外键约束,但无法在其中执行 SET NULL 操作,因为引用的列中不允许 NULL。 SQL Server 不允许此类外键配置。

如果选择“是”,SSMA 将在 Oracle 中生成引用操作,但在将约束加载到 SQL Server 之前,需要进行手动更改。 例如,可以选择 NO ACTION 而不是 SET NULL

如果选择“否”,会将约束标记为错误。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:
转换子类型 SSMA 可以通过两种方式转换 PL/SQL 子类型:

如果选择“是”,SSMA 将从子类型创建 SQL Server 用户定义的类型,并将其用于此子类型的每个变量。

如果选择“否”,SSMA 会将子类型的所有源声明替换为基础类型,并照常转换结果。 在这种情况下,不会在 SQL Server 中创建其他类型。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:
转换同义词 可以将以下 Oracle 对象的同义词迁移到 SQL Server:

表和对象表

视图和对象视图

存储过程和函数

具体化视图

可以将以下 Oracle 对象的同义词替换为直接对象引用:

序列



Java 类架构对象

用户定义的对象类型

无法迁移其他同义词。 SSMA 将为同义词和使用同义词的所有引用生成错误消息。

如果选择“是”,SSMA 将根据前面的列表创建 SQL Server 同义词和直接对象引用。

如果选择“否”,SSMA 将为此处列出的所有同义词创建直接对象引用。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:
本地模块转换 定义(在独立存储过程或函数中声明的)Oracle 嵌套子程序转换的类型。

如果选择“内联”,会将嵌套子程序调用替换为它的正文。

如果选择“存储过程”,会将嵌套子程序转换为 SQL Server 存储过程,并在此过程调用上替换它的调用。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:内联

记录转换

术语 定义
将记录转换为单独变量的列表 SSMA 可以将 Oracle 记录转换为单独的变量和具有特定结构的 XML 变量。

如果选择“是”,SSMA 会将记录转换为单独变量的列表(如果可能)。

如果选择“否”,SSMA 会将记录转换为具有特定结构的 XML 变量。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:
使用 SELECT...FOR XML 为记录变量转换 SELECT...INTO 指定在选择进入一个记录变量时是否生成一个 XML 结果集。

如果选择“是”,SELECT 语句将返回 XML。

如果选择“否”,SELECT 语句将返回一个结果集。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:

RETURNING 子句转换

术语 定义
将 DELETE 语句中的 RETURNING 子句转换为 OUTPUT Oracle 提供了一个 RETURNING 子句,用来立即获取已删除的值。 SQL Server 将此功能与 OUTPUT 子句一同提供。

如果选择“是”,SSMA 会将 DELETE 语句中的 RETURNING 子句转换为 OUTPUT 子句。 由于表上的触发器可能更改值,因此 SQL Server 中返回的值可能不同于 Oracle 中的值。

如果选择“否”,SSMA 将在 DELETE 语句之前生成一个 SELECT 语句,以检索返回的值。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:
将 INSERT 语句中的 RETURNING 子句转换为 OUTPUT Oracle 提供了一个 RETURNING 子句,用来立即获取所插入的值。 SQL Server 将此功能与 OUTPUT 子句一同提供。

如果选择“是”,SSMA 会将 RETURNING 语句中的 INSERT 子句转换为 OUTPUT。 由于表上的触发器可能更改值,因此 SQL Server 中返回的值可能不同于 Oracle 中的值。

如果选择“否”,SSMA 将通过插入并从引用表中选择值来模拟 Oracle 功能。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:
将 UPDATE 语句中的 RETURNING 子句转换为 OUTPUT Oracle 提供了一个 RETURNING 子句,用来立即获取更新后的值。 SQL Server 将此功能与 OUTPUT 子句一同提供。

如果选择“是”,SSMA 会将 UPDATE 语句中的 RETURNING 子句转换为 OUTPUT 子句。 由于表上的触发器可能更改值,因此 SQL Server 中返回的值可能不同于 Oracle 中的值。

如果选择“否”,SSMA 将在 UPDATE 语句之后生成 SELECT 语句,以检索返回值。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:

ROWID 生成

术语 定义
生成 ROWID 列 当 SSMA 在 SQL Server 中创建表时,它可以创建一个 ROWID 列。 迁移数据之后,每行都会获取 newid() 函数生成的一个新 UNIQUEIDENTIFIER 值。

如果选择“是”,会在所有表上创建 ROWID 列,SQL Server 会生成 GUID 作为插入值。 如果计划使用 SSMA 测试器,请始终选择“是”。

如果选择“否”,则不会将 ROWID 列添加到表中。

为包含触发器的表添加 ROWID 列将为包含触发器的表添加 ROWID

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观模式:为包含触发器的表添加 ROWID 列

完整模式:
在 ROWID 列上生成唯一索引 指定 SSMA 是否在所生成的 ROWID 列上生成唯一索引列。 如果将此选项设置为“是”,将会在 ROWID 列上生成唯一索引;如果设置为“否”,将不会生成唯一索引。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:

序列和标识转换

术语 定义
将标识转换为 Oracle 为标识列提供了多个配置选项。 SQL Server 中的标识功能不支持其中的一些选项。

保留这些选项的方法是将标识转换为序列。

如果选择“序列”,Oracle 标识列将不再转换为 SQL 标识列。 而是创建一个序列,用来为列生成默认值。

如果选择“标识”,Oracle 标识列将转换为 SQL 标识列。 不会转换不支持的选项。

如果选择“最佳适应”,SSMA 将根据 Oracle 标识列的配置确定最佳适应转换方法(标识或序列)。
转换序列生成器 在 Oracle 中,可以使用序列生成唯一标识符。

SSMA 可以将序列转换为以下内容。

使用 SQL Server 序列生成器。

使用 SSMA 序列生成器。

使用列标识。

默认选项是使用 SQL Server 序列生成器。 然而,SQL Server 不支持获取当前序列值(例如 Oracle 序列 CURRVAL 方法的序列值)。 有关迁移 Oracle 序列 CURRVAL 方法的指导,请参阅 SSMA 团队博客网站。

SSMA 还提供了一个选项,用于将 Oracle 序列转换为 SSMA 序列模拟器。 在 2012 年之前转换为 SQL Server 时,这是默认选项。

最后,还可以将分配给表中的一个列的序列转换为 SQL Server 标识值。 必须在 Oracle“表”选项卡上指定序列与标识列之间的映射。
转换 CURRVAL 外部触发器 只在“转换序列生成器”设置为“使用列标识”时可见。 Oracle 序列是独立于表的对象,因此很多使用序列的表都使用一个触发器来生成和插入新的序列值。 SSMA 将为这些语句添加注释,或者在注释产生错误时将它们标记为错误。

如果选择“是”,SSMA 会将对转换后的序列 CURRVAL 上的外部触发器的所有引用标记为警告。

如果选择“否”,SSMA 会将对转换后的序列 CURRVAL 上的外部触发器的所有引用标记为错误。

语句转换

术语 定义
MERGE 语句的转换 如果选择“使用 INSERT、UPDATE、DELETE 语句”,SSMA 会将 MERGE 语句转换为 INSERTUPDATEDELETE 语句。

如果选择“使用 MERGE 语句”,SSMA 会将 MERGE 语句转换为 SQL Server 中的 MERGE 语句。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:使用 MERGE 语句
将调用转换为使用默认参数的子程序 SQL Server 函数不支持在函数调用中省略参数。 此外,SQL Server 函数和过程不支持将表达式用作默认参数值。

如果选择“是”,并且一个函数调用省略了参数,SSMA 会将关键字 default 插入到函数和调用中的正确位置。 随后,它会将调用标记为警告。

如果选择“否”,SSMA 会将函数调用标记为错误。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:
将 FORALL 语句转换为 WHILE 语句 定义 SSMA 如何处理 PL/SQL 集合元素上的 FORALL 循环。

如果选择“是”,SSMA 将创建一个 WHILE 循环,在此循环中会逐个检索集合元素。

如果选择“否”,SSMA 将使用 nodes() 方法从集合中生成一个行集,并将其用作单个表。 这种做法更高效,但输出代码的可读性欠佳。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观模式:
完整模式:
将函数调用转换为过程调用 有些 Oracle 函数定义为自治事务,或者包含一些在 SQL Server 中无效的语句。 在这些情况下,SSMA 将创建一个过程和一个用作此过程的包装器的函数。 转换后的函数将调用实现过程。

SSMA 可以将对包装器函数的调用转换为对此过程的调用。 这样可以创建更具可读性的代码,并能够提高性能。 不过,上下文并不总是允许这样做;例如,无法将 SELECT 列表中的函数调用替换为一个过程调用。 SSMA 具有几个选项,可涵盖常见情况:

如果选择“始终”,SSMA 会尝试将包装器函数调用转换为过程调用。 如果当前上下文不允许此转换,将会产生一条错误消息。 这样,所生成的代码中不会保留任何函数调用。

如果选择“如果可能”,SSMA 将只在函数具有输出参数时才会转换为过程调用。 如果无法进行此转换,将会移除参数的输出属性。 在所有其他情况下,SSMA 都将保留函数调用。

如果选择“从不”,SSMA 会将所有函数调用保留为函数调用。 由于性能原因,有时可能无法接受此选项。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:如果可能
转换 LOCK TABLE 语句 SSMA 可以将很多 LOCK TABLE 语句转换为表提示。 SSMA 无法转换任何包含 PARTITIONSUBPARTITION@dblinkNOWAIT 子句的 LOCK TABLE 语句,还会将此类语句标记为转换错误消息。

如果选择“是”,SSMA 会将受支持的 LOCK TABLE 语句转换为表提示。

如果选择“否”,SSMA 会将所有 LOCK TABLE 语句标记为转换错误消息。

下表显示了 SSMA 如何转换 Oracle 锁定模式:

Oracle 锁定模式

ROW SHARE
ROW EXCLUSIVE
SHARE UPDATE = ROW SHARE
SHARE
SHARE
EXCLUSIVE

SQL Server 表提示

ROWLOCK, HOLDLOCK
ROWLOCK, XLOCK, HOLDLOCK
ROWLOCK, HOLDLOCK
TABLOCK, HOLDLOCK
TABLOCK, XLOCK, HOLDLOCK
TABLOCKX, HOLDLOCK

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:
转换 REF CURSOR OUT 参数的 OPEN-FOR 语句 在 Oracle 中,可以使用 OPEN .. FOR 语句将结果集返回到类型为 REF CURSOR 的子程序的 OUT 参数。 在 SQL Server 中,存储过程直接返回 SELECT 语句的结果。

SSMA 可以将很多 OPEN .. FOR 语句转换为 SELECT 语句。

如果选择“是”,SSMA 会将 OPEN .. FOR 语句转换为一个 SELECT 语句,该语句会将结果集返回给客户端。

如果选择“否”,SSMA 将在转换后的代码以及“输出”窗格中生成一条错误消息。

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:
转换事务处理语句 SSMA 可以转换 Oracle 事务处理语句:

如果选择“是”,SSMA 会将 Oracle 事务处理语句转换为 SQL Server 语句。

如果选择“否”,SSMA 会将事务处理语句标记为转换错误。

注意:Oracle 以隐式方式打开事务。 要在 SQL Server 上模拟此行为,必须手动添加要在其中启动事务的 BEGIN TRANSACTION 语句。 此外,也可以在会话开始时执行 SET IMPLICIT_TRANSACTIONS ON 命令。 使用自治事务转换子例程时,SSMA 会自动添加 SET IMPLICIT_TRANSACTIONS ON

在“模式”框中选择转换模式后,SSMA 会应用以下设置:

默认/乐观/完整模式:

另请参阅

用户界面参考 (OracleToSQL)