项目设置(转换)(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 架构。 此设置提供了两个选项:
架构到数据库:在此模式下,DB2 架构“sch1”默认映射到 SQL Server 数据库“sch1”中的“dbo”SQL Server 架构。
架构到架构:在此模式下,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 上的外部触发器的所有引用标记为错误。