项目设置(转换)(SybaseToSQL)
“项目设置”对话框的“转换”页面包含的设置,用于自定义 SSMA 如何将 SAP Adaptive Server Enterprise (ASE) 语法转换为 SQL Server 或 Azure SQL 语法。
“项目设置”和“默认项目设置”对话框中提供了“转换”窗格:
如果要为所有 SSMA 项目指定设置,请在“工具”菜单上选择“默认项目设置”,单击左侧窗格底部的“常规”,然后单击“转换”。
若要指定用于当前项目的设置,请在“工具”菜单上选择“项目设置”,单击左侧窗格底部的“常规”,然后单击“转换”。
其他部分
@@ERROR
SQL Server/Azure SQL 和 ASE 使用不同的错误代码。
使用此设置可指定 SSMA 在 ASE 代码中遇到对 @@ERROR
的引用时,在“输出”或“错误列表”窗格中显示的消息类型(警告或错误)。
- 如果选择“转换并标记为警告”,SSMA 会转换语句,并用警告注释标记这些语句。
- 如果选择“标记为错误”,SSMA 会跳过转换,并用错误注释标记这些语句。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 转换并标记为警告 |
乐观 | 转换并标记为警告 |
完整 | 标记为错误 |
LIKE 运算符转换
指定是否转换 LIKE
操作数来匹配 SAP ASE 行为。 关键在于 ASE 会剪裁类似模式中的尾随空白。 解决方法是将右表达式强制转换为具有最大精度的固定长度数据类型。
- 选择“简单转换”,在无任何更正的情况下转换表达式。
- 若要使用 ASE 行为,请选择“强制转换为固定长度”。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 简单转换 |
乐观 | 简单转换 |
完整 | 强制转换为固定长度 |
将空字符串转换或强制转换为数值类型
指定如何处理 CONVERT
或 CAST
表达式中以数字类型作为数据类型参数的空或空白字符串。 此设置可以使用以下选项:
- 选择“简单转换”,在无任何更正的情况下转换表达式。
- 如果选择了“空字符串作为零数值”,则字符串参数
{s}
将替换为CASE ltrim(rtrim({s})) WHEN "" THEN 0 else {s} END
表达式。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 简单转换 |
乐观 | 简单转换 |
完整 | 空字符串作为零数值 |
NULL 串联
此设置指定如何转换字符串与 NULL
的串联。 可以为此特定设置设定以下选项:
- 如果选择了“使用 ISNULL 函数包装”选项,则串联中的每个非常数
string_expression
都将采用ISNULL(string_expression)
包装,NULL
将被替换为空字符串。 - “保留当前语法”将保持原始语法。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 保留当前语法 |
乐观 | 保留当前语法 |
完整 | 使用 ISNULL 函数包装 |
空字符串转换
此设置指定如何转换空字符串。 可以为此特定设置设定以下选项:
- 将所有字符串表达式替换为空格
- 将空字符串常数替换为空格
若要使用 SQL Server/Azure SQL 行为,请选择“保留当前语法”。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 保留当前语法 |
乐观 | 保留当前语法 |
完整 | 将所有字符串表达式替换为空格 |
CONVERT 和 CAST 二进制字符串转换
将二进制值转换为数字会在不同的平台上返回不同的值。 例如,在 x86 处理器上,CONVERT(integer, 0x00000100)
在 ASE 中返回 65536
,但在 SQL Server 中返回 256
。 ASE 还会根据字节顺序返回不同的值。
使用此设置控制 SSMA 如何转换包含二进制值的 CONVERT
和 CAST
表达式:
- 选择“简单转换”,在无任何警告或更正的情况下转换表达式。 如果知道 ASE 服务器具有不需要对二进制值进行任何更改的字节顺序,请使用此设置。
- 选择“转换并更正”,让 SSMA 转换并更正表达式,以便在 SQL Server 上使用。 文本常数中的字节顺序将反转。 其他二进制值(如二进制变量和列)都将标记为错误。 如果知道 ASE 服务器具有需要更改二进制值的字节顺序,请使用此值。
选择“转换并标记为警告”,让 SSMA 转换并更正表达式,并用警告注释标记所有已转换的表达式。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 转换并标记为警告 |
乐观 | 简单转换 |
完整 | 转换并更正 |
动态 SQL
使用此设置可指定 SSMA 在 ASE 代码中遇到动态 SQL 时,在“输出”或“错误列表”窗格中显示的消息类型(警告或错误)。
- 如果选择“转换并标记为警告”,SSMA 会转换动态 SQL,并用警告注释标记这些语句。
- 如果选择“标记为错误”,SSMA 会跳过转换,并用错误注释标记这些语句。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 转换并标记为警告 |
乐观 | 转换并标记为警告 |
完整 | 标记为错误 |
相等性检查转换
在 SQL Server/Azure SQL 中,如果 ANSI_NULLS
设置处于开启状态,则当任何相等性比较包含 NULL
值时,SQL Server/Azure SQL 将返回 UNKNOWN
。 如果 ANSI_NULLS
处于关闭状态,则当比较列和表达式或两个表达式均为两个表达式都为 NULL
时,包含 NULL
值的相等性比较将返回 True。 默认情况下 (ANSINULL OFF
),SAP ASE 相等性比较的行为类似于 ANSI_NULLS OFF
的 SQL Server/Azure SQL 。
- 如果选择“简单转换”,SSMA 会将 ASE 代码转换为 SQL Server/Azure SQL 语法,不会额外检查
NULL
值。 如果ANSI_NULLS
在 SQL Server/Azure SQL 中处于OFF
状态,或者想根据具体情况修改相等性比较,则可使用此设置。 - 如果选择“考虑 NULL 值”,SSMA 将使用
IS NULL
和IS NOT NULL
子句添加对NULL
值的检查。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 简单转换 |
乐观 | 简单转换 |
完整 | 考虑 NULL 值 |
格式字符串
SQL Server/Azure SQL 不再支持 PRINT
和 RAISERROR
语句中的 format_string
参数。 format_string
参数允许将可替换参数直接放入字符串中的参数,然后在运行时替换参数。 但,SQL Server 需要使用变量生成的字符串字面量或字符串的完整字符串。 有关详细信息,请参阅 PRINT (Transact-SQL) 主题。
当 SSMA 遇到 format_string
参数时,可以使用变量生成字符串字面量,也可以使用该变量创建新变量并生成字符串。
若要将字符串文字用于
PRINT
和RAISERROR
函数,请选择“新建字符串”。在此模式下,如果 PRINT 或 RAISERROR 语句不使用占位符和局部变量,则语句保持不变。 双百分号 (%%) 更改为 PRINT 字符串字面量中的单百分号 (%)。
如果 PRINT 或 RAISERROR 语句使用占位符和一个或多个局部变量,如以下示例所示:
PRINT 'Total: %1!%%', @percent
SSMA 会将其转换为以下语法:
PRINT 'Total: '+ CAST(@percent AS varchar(max)) + '%'
如果
format_string
是变量,如以下语句中所示:PRINT @fmt, @arg1, @arg2
SSMA 无法执行简单的字符串转换,必须创建新变量:
DECLARE @print_format_1 varchar(max) SET @print_format_1 = REPLACE (@fmt, '%%', '%') SET @print_format_1 = REPLACE (@print_format_1, '%1!', CAST (@arg1 AS varchar(max))) SET @print_format_1 = REPLACE (@print_format_1, '%2!', CAST (@arg2 AS varchar(max))) PRINT @print_format_1
使用“新建字符串”模式时,SSMA 假定 SQL Server 选项
CONCAT_NULL_YIELDS_NULL
处于OFF
状态。 因此,SSMA 不会检查 NULL 参数。若要让 SSMA 为每个
PRINT
和RAISERROR
语句生成新变量,然后将该变量用于字符串值,请选择“新建变量”。在此模式下,如果
PRINT
或RAISERROR
语句不使用占位符和局部变量,SSMA 会将所有双百分号 (%%
) 替换为单百分号,以符合 SQL Server/Azure SQL 语法。如果
PRINT
或RAISERROR
语句使用占位符和一个或多个局部变量,如以下示例所示:PRINT 'Total: %1!%%', @percent
SSMA 会将其转换为以下语法:
DECLARE @print_format_1 varchar(max) SET @print_format_1 = 'Total: %1!%' SET @print_format_1 = REPLACE (@print_format_1, '%1!', ISNULL(CAST (@percent AS VARCHAR(max)), '')) PRINT @print_format_1
如果
format_string
是变量,如以下语句中所示:PRINT @fmt, @arg1, @arg2
SSMA 会创建下述新变量,检查每个参数中的 NULL 值:
DECLARE @print_format_1 varchar(max) SET @print_format_1 = REPLACE (@fmt, '%%', '%') SET @print_format_1 = REPLACE (@print_format_1, '%1!', ISNULL(CAST (@arg1 AS varchar(max)),'')) SET @print_format_1 = REPLACE (@print_format_1, '%2!', ISNULL(CAST (@arg2 AS varchar(max)),'')) PRINT @print_format_1
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 新建字符串 |
乐观 | 新建字符串 |
完整 | 新建变量 |
将显式值插入时间戳列
SQL Server/Azure SQL 不支持将显式值插入时间戳列。
- 若要从
INSERT
语句中排除时间戳列,请选择“排除列”。 - 若要在时间戳列每次出现在语句中
INSERT
时打印错误消息,请选择“标记为错误”。 在此模式下,INSERT
语句不会被转换,并且将被标记为错误注释。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 排除列 |
乐观 | 排除列 |
完整 | 标记为错误 |
存储过程中定义的临时对象
此设置指定转换期间出现在过程中的临时对象定义是否应存储在源元数据中。
- 选择“是”存储到元数据中。
- 如果不需要存储对象,则选择“否”。
模式 | 值 |
---|---|
默认 | 是 |
乐观 | 是 |
完整 | 否 |
代理表转换
指定 ASE 代理表是转换还是不转换为 SQL Server/Azure SQL 表,并用错误注释标记代码。
- 选择“转换”可将代理表转换为常规表。
- 选择“标记为错误”,可以只用错误注释标记代理表代码。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 标记为错误 |
乐观 | 标记为错误 |
完整 | 标记为错误 |
RAISERROR 基本消息号
ASE 用户消息存储在每个数据库中。 SQL Server 用户消息通过 sys.messages
目录视图集中存储和提供。 此外,ASE 用户消息从 20000
开始,但 SQL Server 错误消息从 50001
开始。
此设置指定要添加到 ASE 用户消息号的数字,以便将其转换为 SQL Server 用户消息。 如果 SQL Server 在 sys.messages
目录视图中有用户消息,则可能需要将此数字更改为更高的值。 因此,转换后的消息号与现有的消息号不冲突。
注意以下事项:
17000
-19999
范围内的 ASE 消息来自sysmessages
系统表,不会进行转换。- 如果
RAISERROR
语句中引用的消息号是常数,SSMA 会将基本消息号添加到常数,以便确定新的用户消息号。 - 如果引用的消息号是变量或表达式,SSMA 会创建中间局部变量。
- 在“乐观模式”下,SSMA 假定 SQL Server 选项
CONCAT_NULL_YIELDS_NULL
处于OFF
状态,不会检查NULL
参数。 - 在“完整模式”下,SSMA 会检查参数
NULL
。 - 不会转换带
arg-list
参数的RAISERROR
函数。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 30001 |
乐观 | 30001 |
完整 | 30001 |
系统对象
使用此设置可指定 SSMA 在遇到使用 ASE 系统对象时,在“输出”或“错误列表”窗格中显示的消息类型(警告或错误)。
- 如果选择“转换并标记为警告”,SSMA 会转换对系统对象的引用,并会用警告注释标记语句。
- 如果选择“标记为错误”,SSMA 不会转换对系统对象的引用,但会用错误注释标记语句。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 转换并标记为警告 |
乐观 | 转换并标记为警告 |
完整 | 标记为错误 |
未解析标识符
使用此设置可指定 SSMA 在无法解析标识符时,在“输出”或“错误列表”窗格中显示的消息类型(警告或错误)。
- 如果选择“转换并标记为警告”,SSMA 会转换对未解析标识符的引用,并会用警告注释标记语句。
- 如果选择“标记为错误”,SSMA 不会转换对未解析标识符的引用,但会用错误注释标记语句。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 转换并标记为警告 |
乐观 | 转换并标记为警告 |
完整 | 标记为错误 |
系统函数部分
CHARINDEX 函数
在 ASE 中,仅当所有输入表达式均为 NULL
时,CHARINDEX
才会返回 NULL
。 如果有任何输入表达式为 NULL
,SQL Server/Azure SQL 会返回 NULL
。
- 若要使用 ASE 行为,请选择“REPLACE 函数”。 对
CHARINDEX
函数的所有调用都将替换为对CHARINDEX_VARCHAR
或CHARINDEX_NVARCHAR
用户定义函数的调用,具体取决于为仿真 SAP ASE 行为而传递的参数类型(在用户数据库中以架构名称s2ss
创建)。 - 若要使用 SQL Server/Azure SQL 行为,请选择“保留当前语法”。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 保留当前语法 |
乐观 | 保留当前语法 |
完整 | REPLACE 函数 |
DATALENGTH 函数
当值是一个空格时,SQL Server/Azure SQL 和 ASE 的 DATALENGTH
函数会返回不同值。 在本例中,SQL Server/Azure SQL 返回 0
,ASE 返回 1
。
- 若要使用 ASE 行为,请选择“REPLACE 函数”。 对
DATALENGTH
函数的所有调用都替换为会仿真 SAP ASE 行为的CASE
表达式。 - 若要使用默认 SQL Server/Azure SQL 行为,请选择“保留当前语法”。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 保留当前语法 |
乐观 | 保留当前语法 |
完整 | REPLACE 函数 |
INDEX_COL 函数
ASE 支持 INDEX_COL
函数的可选 user_id
参数;不过,SQL Server/Azure SQL 不支持此参数。 如果使用 user_id
参数,则无法将此函数转换为 SQL Server/Azure SQL 语法。
- 若要使用 ASE 行为,请选择“CONVERT 函数”。 如果代码包含
user_id
参数,SSMA 会显示错误。 - 若要在每次遇到
INDEX_COL
时显示错误消息,请选择“标记为错误”。 SSMA 不会转换对函数的引用,但会用错误注释标记语句。
模式 | 值 |
---|---|
默认 | 标记为错误 |
乐观 | 标记为错误 |
完整 | 标记为错误 |
INDEX_COLORDER 函数
SQL Server/Azure SQL 没有 INDEX_COLORDER
系统函数。
- 若要使用 ASE 行为,请选择“CONVERT 函数”。 对
INDEX_COLORDER
函数的所有调用都替换为对同名INDEX_COLORDER
函数(在用户数据库中以架构名称s2ss
创建)的调用,该函数会仿真 SAP ASE 行为。 - 若要在每次遇到时
INDEX_COLORDER
打印错误消息,请选择“标记为错误”。 SSMA 不会转换对函数的引用,但会用错误注释标记语句。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 标记为错误 |
乐观 | 标记为错误 |
完整 | 标记为错误 |
LEFT 和 RIGHT 函数
ASE 中的 LEFT
和 RIGHT
函数对负长度参数展现的行为有所不同。
- 若要使用 ASE 行为,请选择“REPLACE 函数”。 然后,将长度参数替换为
CASE
表达式,该表达式将为负值返回NULL
。 - 若要使用 SQL Server 行为,请选择“保留当前语法”。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 保留当前语法 |
乐观 | 保留当前语法 |
完整 | REPLACE 函数 |
注意
如果长度参数是文本值而非复杂表达式,则无论项目设置如何,长度值始终都替换为 NULL
。
NEXT_IDENTITY 函数
SQL Server/Azure SQL 没有 NEXT_IDENTITY
系统函数。
- 若要使用 ASE 行为,请选择“CONVERT 函数”。 对
NEXT_IDENTITY
函数的所有调用都替换为会仿真 SAP ASE 行为的(IDENT_CURRENT(parameter Value) + IDENT_INCR(parameter Value)
表达式。 - 若要在每次遇到时
NEXT_IDENTITY
打印错误消息,请选择“标记为错误”。 SSMA 不会转换对函数的引用,但会用错误注释标记语句。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 标记为错误 |
乐观 | 标记为错误 |
完整 | 标记为错误 |
默认/乐观/完整模式:标记为错误
PATINDEX 函数
指定是否转换 PATINDEX
函数来匹配 SAP ASE 行为。 关键在于 ASE 会剪裁搜索模式中的尾随空白。 解决方法是将值表达式强制转换为具有最大精度的固定长度数据类型,并将 rtrim
函数应用于搜索模式。
- 若要使用 ASE 行为,请选择“使用”。
- 若要使用默认 SQL Server/Azure SQL 行为,请选择“不使用”。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 请勿使用 |
乐观 | 请勿使用 |
完整 | 使用 |
REPLICATE 函数
REPLICATE
函数会按指定次数重复字符串。 在 ASE 中,如果指定重复字符串零次,则结果为 NULL
。 在 SQL Server/Azure SQL 中,结果为空字符串。
- 若要使用 ASE 行为,请选择“REPLACE 函数”。 对
REPLICATE
函数的所有调用都将替换为对REPLICATE_VARCHAR
或REPLICATE_NVARCHAR
用户定义函数的调用,具体取决于为仿真 SAP ASE 行为而传递的参数类型(在用户数据库中以架构名称s2ss
创建)。 - 若要使用默认 SQL Server/Azure SQL 行为,请选择“REPLACE 函数”。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | REPLACE 函数 |
乐观 | REPLACE 函数 |
完整 | REPLACE 函数 |
TRIM(LTRIM、RTRIM)函数
此设置指定是使用 SAP ASE 等效语法函数替换对 TRIM
、LTRIM
和 RTRIM
函数的调用,还是保留当前语法。 此特定设置具有以下选项:
- REPLACE 函数
- 保留当前语法
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | REPLACE 函数 |
乐观 | REPLACE 函数 |
完整 | REPLACE 函数 |
SUBSTRING 函数
在 ASE 中,如果指定的起始值大于表达式中的字符数,或者长度等于零,则函数 SUBSTRING(expression, start, length)
返回 NULL
。 在 SQL Server/Azure SQL 中,等效表达式会返回空字符串。
- 若要使用 ASE 行为,请选择“REPLACE 函数”。 对
SUBSTRING
函数的所有调用都将替换为对SUBSTRING_VARCHAR
、SUBSTRING_NVARCHAR
或SUBSTRING_VARBINARY
用户定义函数的调用,具体取决于为仿真 SAP ASE 行为而传递的参数类型(在用户数据库中以架构名称s2ss
创建)。 - 若要使用 SQL Server/Azure SQL 行为,请选择“保留当前语法”。
在“模式”框中选择转换模式后,SSMA 会应用以下设置:
模式 | 值 |
---|---|
默认 | 保留当前语法 |
乐观 | 保留当前语法 |
完整 | REPLACE 函数 |
表部分
添加主键
如果 SAP ASE 表没有主键或唯一索引,则在 SQL Server 或 Azure SQL 表中创建新主键。
模式 | 值 |
---|---|
默认 | 否 |
乐观 | 否 |
完整 | 是 |
注意
连接到 Azure SQL 时,默认值为“是”。