项目设置 (转换) (Db2ToSQL)

“项目设置”对话框的“转换”页包含用于自定义 SQL Server 迁移助手 (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 默认映射到 dbo SQL Server 数据库中 sch1的 SQL Server 架构。

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

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

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

MERGE 语句的转换方式

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

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

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

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

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

SQL Server 函数不支持函数调用中参数的遗漏。 此外,SQL Server 函数和过程不支持表达式作为默认参数值。

  • 如果选择 “是 ”,函数调用省略参数,SSMA 会将关键字 默认值 插入函数,并在正确的位置调用。 然后,它会用警告标记调用。

  • 如果选择“ ”,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 允许创建外键约束,因为引用列中不允许使用 NUL,因此无法执行 SET 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 子字符串 函数调用。 如果 SSMA 无法转换 SUBSTR 函数调用,或不支持参数数,SSMA 会将 SUBSTR 函数调用转换为自定义 SSMA 函数调用。

  • 如果选择“是”,SSMA 会将使用三个参数的 SUBSTR 函数调用转换为 SQL Server 子字符串 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 行为

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

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

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

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

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生成错误。解析。

  • 如果选择“警告,SSMA 会在转换DBMS_SQL生成警告。解析。

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

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

生成 ROWID 列

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

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

  • 如果选择“ ”,则不会向表添加 ROWID 列。

  • 为包含触发器 的表添加 ROWID 列,为包含触发器的表添加 ROWID(默认值)。

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

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

完整模式:

在 ROWID 列上生成唯一索引

指定 SSMA 是否在所生成的 ROWID 列上生成唯一索引列。 如果该选项设置为 YES,则会生成唯一索引。 如果设置为 NO该索引,则不会在 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

REPLACE 函数调用中使用 ISNULL 语句来模拟 Db2 行为。 此设置具有以下选项:

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

默认/乐观模式:

完整模式:

在 CONCAT 函数调用中使用 ISNULL

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

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

默认/乐观模式:

完整模式:

尽可能使用本机转换函数

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

  • 如果选择“ ”,SSMA 会将TO_CHAR(日期、格式)转换为TO_CHAR_DATE或TO_CHAR_DATE_LS(由“转换TO_CHAR(日期,格式)”选项定义)。

在“模式”框中选择转换模式后,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 序列生成器。

  • 使用 SSMA 序列生成器。

  • 使用列标识。

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

SSMA 还提供将 Db2 序列转换为 SSMA 序列模拟器的选项。

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

转换 CURRVAL 外部触发器

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

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

  • 如果选择“ ”,SSMA 将标记对转换后的序列 CURRVAL 上所有触发器的引用,并显示错误。