“项目设置”对话框的“转换”页包含用于自定义 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 。 其他 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)”,SSMA 将使用会话语言将 TO_CHAR(date, format) 转换为TO_CHAR_DATE_LS 函数。在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置: 默认/乐观模式: 使用 TO_CHAR_DATE 函数 完整模式: 使用 TO_CHAR_DATE_LS 函数 (NLS 注意) |
为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_DATE 或TO_CHAR_DATE_LS (具体由TO_CHAR(日期、格式)转换选项定义)。在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置: 默认/乐观模式: 是的 完整模式: 不 |
转换消息
术语 | 定义 |
---|---|
生成有关问题的消息 | 指定 SSMA 在转换期间是否生成信息性消息,在“输出”窗格中显示它们,并将其添加到转换后的代码。 在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置: 默认/乐观模式: 不 完整模式: 不 |
其他选项
术语 | 定义 |
---|---|
将 ROWNUM 表达式转换为整数 | 当 SSMA 转换ROWNUM 表达式时,它会将该表达式转换为一个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 默认映射到 dbo SQL Server 数据库中 sch1 的 SQL Server 架构。架构到架构: 在此模式下,Oracle 架构 sch1 将默认映射到连接对话框中提供的默认 SQL Server 数据库内的 sch1 SQL Server 架构。在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置: 默认/乐观/完整模式: 架构到数据库 |
模拟 ORDER BY 子句中的 Oracle 空值行为 |
NULL 值在 SQL Server 和 Oracle 中以不同的方式排序:在 SQL Server 中, NULL 值是有序列表中的最小值。 在升序列表中, NULL 值将首先显示。在 Oracle 中, NULL 值是有序列表中的最高值。 默认情况下,NULL 值在升序排列的列表中显示为最后。Oracle 具有 NULLS FIRST 和 NULLS LAST 子句,可用于更改 Oracle 对 NUL 排序的方式。SSMA 可以通过检查 ORDER BY 值来模拟 Oracle NULL 行为。 然后,它首先按 NULL 指定顺序按值排序,然后按其他值排序。如果选择 “是”,SSMA 将以模拟 Oracle 行为的方式转换 Oracle ORDER BY 语句。如果选择 “否”,SSMA 将忽略 Oracle 规则,并在遇到 NULLS FIRST 和 NULLS LAST 子句时生成错误消息。在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置: 默认/乐观模式: 不 完整模式: 是的 |
在 SELECT 中模拟行计数异常 | 如果具有 INTO 子句的SELECT 语句不返回任何行,Oracle 会引发NO_DATA_FOUND 异常。 如果语句返回了两行或更多行,则会引发 TOO_MANY_ROWS 异常。 SQL Server 中的转换语句如果行数不同于一,则不会引发任何异常。如果选择“是”,则 SSMA 会在每个 db_error_exact_one_row_check 语句后添加对特殊SELECT 过程的调用。 此过程模拟 NO_DATA_FOUND 和 TOO_MANY_ROWS 异常。 这是默认设置,它允许尽可能接近 Oracle 行为。 如果源代码具有处理这些错误的异常处理程序,应始终选择 “是 ”。 请注意,如果 SELECT 语句发生在用户定义的函数内,此模块将转换为存储过程,因为执行存储过程并引发异常与 SQL Server 函数上下文不兼容。如果选择 “否”,则不会生成异常。 当 SSMA 转换用户定义的函数时,如果希望它在 SQL Server 中仍作为函数存在,这可能非常有用。 在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置: 默认/乐观/完整模式: 是的 |
启用修复顾问 | 启用后,SSMA 将尝试从您在目标 T-SQL 代码中所做的修改中学习,并建议在其他位置应用类似模式的潜在代码修复。 在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置: 默认/乐观/完整模式: 是的 |
生成常量表达式列别名 | 如果列表中的表达式 SELECT 缺少别名,则 SSMA 可以生成常量别名(如 expr1 , expr2 等),或使用表达式本身作为别名。 由于表达式可能变得非常长且列名长度有限,因此使用固定的基础名称作为此类别名更安全。 尽管这是一个更安全的选项,但有时不可能,因为可能会对生成的数据集存在外部依赖关系。 在这些情况下,你可能希望根据列的值表达式命名列,类似于 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 将应用以下设置: 默认/乐观/完整模式: 是的 |
对象转换
术语 | 定义 |
---|---|
将带有 SET NULL 引用动作的外键转换为不可为 NULL 的列 | Oracle 允许创建外键约束,但由于引用列中不允许使用 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...INTO 用于记录变量转换为 XML 时使用 SELECT...FOR XML | 指定在选择记录变量时是否生成 XML 结果集。 如果选择 “是”,SELECT 语句将返回 XML。 如果选择 “否”,SELECT 语句将返回结果集。 在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置: 默认/乐观/完整模式: 不 |
RETURNING 子句转换
术语 | 定义 |
---|---|
将 DELETE 语句中的 RETURNING 子句转换为 OUTPUT | Oracle 提供一个 RETURNING 子句作为一种立即获取已删除值的方法。 SQL Server 使用OUTPUT 子句提供该功能。如果选择“是”,SSMA 会将语句中的 RETURNING 子句转换为DELETE OUTPUT 子句。 由于表上的触发器可以更改值,因此返回的值在 SQL Server 中可能与 Oracle 中的值不同。如果选择“否”,SSMA 将在 SELECT 语句之前生成DELETE 语句以检索返回的值。在“ 模式”框中 选择转换模式时,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 会将语句中的 RETURNING 子句转换为UPDATE OUTPUT 子句。 由于表上的触发器可以更改值,因此返回的值在 SQL Server 中可能与 Oracle 中的值不同。如果选择 “否”,SSMA 将在语句后 UPDATE 生成 SELECT 语句以检索返回值。在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置: 默认/乐观/完整模式: 是的 |
ROWID 生成
术语 | 定义 |
---|---|
生成 ROWID 列 | 当 SSMA 在 SQL Server 中创建表时,它可以创建 ROWID 列。 迁移数据后,每行获取函数UNIQUEIDENTIFIER 生成的新newid() 值。如果选择 是, ROWID 列会在所有表上创建,SQL Server 生成 GUID 作为插入值。 如果计划使用 SSMA 测试器,请始终选择 “是 ”。如果选择 “否”,则不会向表添加 ROWID 列。 为包含触发器的表添加 ROWID 列 ROWID 。在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置: 默认/乐观模式: 为具有触发器的表添加 ROWID 列 完整模式: 是的 |
在 ROWID 列上生成唯一索引 | 指定 SSMA 是否在 ROWID 生成列上生成唯一索引列。 如果选项设置为“YES”,则会生成唯一索引;如果将其设置为“NO”,则不会在列上 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 语句转换为 INSERT 、UPDATE 、DELETE 。如果选择 “使用 MERGE 语句”,SSMA 会将 MERGE 语句转换为 MERGE SQL Server 中的语句。在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置: 默认/乐观/完整模式: 使用 MERGE 语句 |
将调用转换为使用默认参数的子程序 | SQL Server 函数不支持在函数调用中遗漏参数。 此外,SQL Server 函数和过程不支持表达式作为默认参数值。 如果选择 “是 ”和函数调用省略参数,SSMA 会将关键字 默认值 插入函数中,并在正确的位置调用。 然后,它会在通话上标记一个警告。 如果选择 “否”,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 无法转换任何包含LOCK TABLE 、PARTITION 、SUBPARTITION 和@dblink 子句的NOWAIT 语句,并将此类语句标记为转换错误消息。如果选择 “是”,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 将应用以下设置: 默认/乐观/完整模式: 是的 |
将OPEN-FOR语句转换为REF CURSOR OUT参数 | 在 Oracle 中,OPEN .. FOR 语句可用于将结果集返回到一个子程序的OUT 参数,该参数具有REF CURSOR 类型。 在 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 将应用以下设置: 默认/乐观/完整模式: 是的 |