项目设置(转换)(DB2ToSQL)

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

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

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

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

转换消息

生成有关相应问题的消息

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

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

默认/乐观模式:

完整模式:否

“杂项”选项

将 ROWNUM 表达式强制转换为整数

当转换 ROWNUM 表达式时,SSMA 会将表达式转换为一个 TOP 子句,后跟表达式。 如下示例显示了 DB2 DELETE 语句中的 ROWNUM:

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 会应用以下设置:

默认/完整模式:

乐观模式:是

默认架构映射

此设置指定如何将 DB2 架构映射到 SQL Server 架构。 此设置提供了两个选项:

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

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

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

默认/乐观/完整模式:架构到数据库

MERGE 语句的转换方式

  • 如果选择“使用 INSERT、UPDATE、DELETE 语句”,SSMA 会将 MERGER 语句转换为 INSERT、UPDATE、DELETE 语句。

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

警告

此项目设置选项仅在 SQL Server 2008、SQL Server 2012、SQL Server 2014 中可用。

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

默认/乐观/完整模式:使用 MERGE 语句

将调用转换为使用默认参数的子程序

SQL Server 函数不支持在函数调用中省略参数。 此外,SQL Server 函数和过程不支持将表达式用作默认参数值。

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

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

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

默认/乐观/完整模式:

将 COUNT 函数转换为 COUNT_BIG

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

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

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

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

默认/完整模式:

乐观模式:否

将 FORALL 语句转换为 WHILE 语句

定义 SSMA 如何处理 PL/SQL 集合元素上的 FORALL 循环。

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

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

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

默认/乐观模式:

完整模式:

在 NOT NULL 的列上,使用 SET NULL 引用操作来转换外键

DB2 允许创建外键约束,但无法在其中执行 SET NULL 操作,因为引用的列中不允许 NULL。 SQL Server 不允许此类外键配置。

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

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

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

默认/乐观/完整模式:

将函数调用转换为过程调用

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

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

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

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

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

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

默认/乐观/完整模式:如果可能

转换 LOCK TABLE 语句

SSMA 可以将很多 LOCK TABLE 语句转换为表提示。 SSMA 无法转换任何包含 PARTITION、SUBPARTITION、@dblink 和 NOWAIT 子句的 LOCK TABLE 语句,还会将此类语句标记为转换错误消息。

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

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

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

DB2 锁定模式 SQL Server 表提示
ROW SHARE ROWLOCK、HOLDLOCK
ROW EXCLUSIVE ROWLOCK、XLOCK、HOLDLOCK
SHARE UPDATE = ROW SHARE ROWLOCK、HOLDLOCK
共享 TABLOCK、HOLDLOCK
SHARE ROW EXCLUSIVE TABLOCK、XLOCK、HOLDLOCK
EXCLUSIVE TABLOCKX、HOLDLOCK

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

默认/乐观/完整模式:

转换 REF CURSOR OUT 参数的 OPEN-FOR 语句

在 DB2 中,可以使用 OPEN-FOR 语句将结果集返回到子程序类型为 REF CURSOR 的 OUT 参数。 在 SQL Server 中,存储过程直接返回 SELECT 语句的结果。

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

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

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

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

默认/乐观/完整模式:

将记录转换为单独变量的列表

SSMA 可以将 DB2 记录转换为单独的变量和具有特定结构的 XML 变量。

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

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

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

默认/乐观/完整模式:

将 SUBSTR 函数调用转换为 SUBSTRING 函数调用

SSMA 可以根据参数数量将 DB2 SUBSTR 函数调用转换为 SQL Server substring 函数调用。 如果 SSMA 无法转换 SUBSTR 函数调用,或者不支持参数数量,SSMA 会将 SUBSTR 函数调用转换为自定义 SSMA 函数调用。

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

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

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

默认/乐观模式:

完整模式:否

转换子类型

SSMA 可以通过两种方式转换 PL/SQL 子类型:

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

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

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

默认/乐观/完整模式:

转换同义词

可以将以下 DB2 对象的同义词迁移到 SQL Server:

  • 表和对象表

  • 视图和对象视图

  • 存储过程和函数

  • 具体化视图

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

  • 序列

  • Java 类架构对象

  • 用户定义的对象类型

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

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

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

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

默认/乐观/完整模式:

转换 TO_CHAR(date, format)

SSMA 可以将 DB2 TO_CHAR(date, format) 转换为 sysdb 数据库中的过程。

  • 如果选择“使用 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)

转换事务处理语句

SSMA 可以转换 DB2 事务处理语句:

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

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

注意

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

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

默认/乐观/完整模式:

模拟 ORDER BY 子句中的 DB2 null 行为

在 SQL Server 和 DB2 中,NULL 值以不同的方式排序:

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

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

  • DB2 具有 NULLS FIRST 和 NULLS LAST 子句,可用于更改 DB2 对 NULL 的排序方式。

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

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

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

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

默认/乐观模式:

完整模式:

在 SELECT 中模拟行计数异常

如果一个具有 INTO 子句的 SELECT 语句未返回任何行,DB2 将引发一个 NO_DATA_FOUND 异常。 如果此语句返回两个或更多的行,将会引发 TOO_MANY_ROWS 异常。 如果行计数不等于 1,SQL Server 中的转换语句不会引发任何异常。

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

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

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

默认/乐观/完整模式:

为 DBMS_SQL.PARSE 生成错误

  • 如果选择“错误”,SSMA 将在转换 DBMS_SQL.PARSE 时生成错误。

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

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

默认/乐观/完整模式:错误

生成 ROWID 列

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

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

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

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

警告

SQL Server 2005、SQL Server 2008 和 SQL Server 2012 和 2014 的默认设置是为具有触发器的表添加 ROWID 列

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

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

完整模式:

在 ROWID 列上生成唯一索引

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

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

默认/乐观/完整模式:

本地模块转换

定义(在独立存储过程或函数中声明的)DB2 嵌套子程序转换的类型。

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

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

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

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

在字符串串联中使用 ISNULL

当字符串串联包括 NULL 值时,DB2 和 SQL Server 会返回不同的结果。 DB2 将 NULL 值视为空字符集。 SQL Server 返回 NULL。

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

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

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

在 REPLACE 函数调用中使用 ISNULL

ISNULL 语句用于 REPLACE 函数调用,以模拟 DB2 行为。 此设置具有以下选项:

  • NO

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

默认/乐观模式:

完整模式:

在 CONCAT 函数调用中使用 ISNULL

ISNULL 语句用于 CONCAT 函数调用,以模拟 DB2 行为。 此设置具有以下选项:

  • NO

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

默认/乐观模式:

完整模式:

尽可能使用本机转换函数

  • 如果选择“是”,SSMA 会尽可能将 TO_CHAR(date, format) 转换为本机转换函数。

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

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

默认/乐观模式:

完整模式:否

使用 SELECT...FOR XML 为记录变量转换 SELECT...INTO

指定在选择进入一个记录变量时是否生成一个 XML 结果集。

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

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

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

默认/乐观/完整模式:

RETURNING 子句转换

将 DELETE 语句中的 RETURNING 子句转换为 OUTPUT

DB2 提供了一个 RETURNING 子句,用来立即获取删除的值。 SQL Server 将此功能与 OUTPUT 子句一同提供。

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

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

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

默认/乐观/完整模式:

将 INSERT 语句中的 RETURNING 子句转换为 OUTPUT

DB2 提供了一个 RETURNING 子句,用来立即获取所插入的值。 SQL Server 将此功能与 OUTPUT 子句一同提供。

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

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

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

默认/乐观/完整模式:

将 UPDATE 语句中的 RETURNING 子句转换为 OUTPUT

DB2 提供了一个 RETURNING 子句,用来立即获取更新后的值。 SQL Server 将此功能与 OUTPUT 子句一同提供。

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

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

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

默认/乐观/完整模式:

序列转换

转换序列生成器

在 DB2 中,可以使用序列生成唯一标识符。

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

  • 使用 SQL Server 序列生成器(此选项仅在转换到 SQL Server 2012 和 SQL Server 2014 时可用)。

  • 使用 SSMA 序列生成器。

  • 使用列标识。

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

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

最后,还可以将分配给表中的一个列的序列转换为 SQL Server 标识值。 必须在 DB2“表”选项卡上指定序列与标识列之间的映射。

转换 CURRVAL 外部触发器

只在“转换序列生成器”设置为“使用列标识”时可见。 DB2 序列是独立于表的对象,因此很多使用序列的表都使用一个触发器来生成和插入新的序列值。 SSMA 将为这些语句添加注释,或者在注释产生错误时将它们标记为错误。

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

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

另请参阅

用户界面参考 (DB2ToSQL)