“项目设置”对话框的“转换”页包含用于自定义 SSMA 如何将 SAP Adaptive Server Enterprise (ASE) 语法转换为 SQL Server 或 Azure SQL 语法的设置。
“项目设置”和“默认项目设置”对话框中提供了“转换”窗格:
如果要为所有 SSMA 项目指定设置,请在 “工具 ”菜单上选择“ 默认项目设置”,单击左窗格底部的“ 常规 ”,然后单击“ 转换”。
若要指定当前项目的设置,请在 “工具 ”菜单上选择“ 项目设置”,单击左窗格底部的“ 常规 ”,然后单击“ 转换”。
杂项部分
@@ERROR
SQL Server/Azure SQL 和 ASE 使用不同的错误代码。
使用此设置可以指定 SSMA 在 ASE 代码中遇到对 ASE 代码的引用 @@ERROR
时,SSMA 在“输出”或“错误列表”窗格中显示的消息类型。
- 如果选择 “转换并标记警告”,SSMA 将转换语句,并用警告注释标记这些语句。
- 如果选择 “标记并出错”,SSMA 将跳过转换,并使用错误注释标记语句。
在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置:
模式 | 价值 |
---|---|
违约 | 转换并标记警告 |
乐观的 | 转换并标记警告 |
完全 | 标记并出现错误 |
LIKE 运算符的转换
指定是否转换 LIKE
作数以匹配 SAP ASE 行为。 要点是 ASE 剪裁类似模式中的尾随空白。 解决方法是将右表达式转换为具有最大精度的固定长度数据类型。
- 选择 “简单转换 ”以转换表达式而不进行任何更正。
- 若要使用 ASE 行为,请选择 强制转换为固定长度。
在“模式”框中选择转换模式时,SSMA 将应用以下设置:
模式 | 价值 |
---|---|
违约 | 简单转换 |
乐观的 | 简单转换 |
完全 | 强制转换为固定长度 |
将空字符串转换为数值类型
指定如何处理包含数值类型的空字符串或CAST
表达式中的CONVERT
空字符串作为数据类型参数。 以下选项可用于此设置:
- 选择 “简单转换 ”以转换表达式而不进行任何更正。
- 如果选择 空字符串作为零数值 ,则字符串参数
{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)
65536
返回 ASE,但在 256
SQL Server 中。 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 相等比较的行为类似于 SQL Server/Azure SQL 与 ANSI_NULLS OFF
。
- 如果选择 “简单转换”,SSMA 会将 ASE 代码转换为 SQL Server/Azure SQL 语法,而无需额外检查
NULL
值。 如果ANSI_NULLS
位于OFF
SQL Server/Azure SQL 中,或者想要逐个修改相等比较,请使用此设置。 - 如果选择“考虑 NULL 值”,SSMA 将使用 and
IS NOT NULL
子句添加值NULL
IS NULL
检查。
在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置:
模式 | 价值 |
---|---|
违约 | 简单转换 |
乐观的 | 简单转换 |
完全 | 考虑 NULL 值 |
设置字符串格式
SQL Server/Azure SQL 不再支持 format_string
参数 PRINT
和 RAISERROR
语句。
format_string
允许将可替换参数直接放入字符串中的参数,然后在运行时替换参数。 相反,SQL Server 需要使用字符串文本或使用变量生成的字符串来完整字符串。 有关详细信息,请参阅 PRINT (Transact-SQL) 主题。
当 SSMA 遇到 format_string
参数时,它可以使用变量生成字符串文本,也可以使用该变量创建新的变量并生成字符串。
若要对字符串文本和
RAISERROR
函数使用字符串文本PRINT
,请选择“创建新字符串”。在此模式下,如果 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
。 -
RAISERROR
witharg-list
参数未转换。
在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置:
模式 | 价值 |
---|---|
违约 | 30001 |
乐观的 | 30001 |
完全 | 30001 |
系统对象
使用此设置可以指定 SSMA 在遇到 ASE 系统对象时在 “输出 ”或 “错误列表 ”窗格中显示的消息类型(警告或错误)。
- 如果选择 “转换并标记警告”,SSMA 将转换对系统对象的引用,并将标记带有警告注释的语句。
- 如果选择 “标记并出错”,SSMA 将不会转换对系统对象的引用,并将标记带有错误注释的语句。
在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置:
模式 | 价值 |
---|---|
违约 | 转换并标记警告 |
乐观的 | 转换并标记警告 |
完全 | 标记并出现错误 |
未解析的标识符
使用此设置可以指定 SSMA 在无法解析标识符时在 “输出 ”或“ 错误列表 ”窗格中显示的消息类型(警告或错误)。
- 如果选择 “转换并标记警告”,SSMA 将尝试将引用转换为未解析的标识符,并将标记带有警告注释的语句。
- 如果选择 “标记有错误”,SSMA 将不会将引用转换为未解析的标识符,并将标记带有错误注释的语句。
在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置:
模式 | 价值 |
---|---|
违约 | 转换并标记警告 |
乐观的 | 转换并标记警告 |
完全 | 标记并出现错误 |
系统函数部分
CHARINDEX 函数
在 ASE 中,CHARINDEX
仅当所有输入表达式均为NULL
时,才返回 NULL
。 如果有任何输入表达式,NULL
SQL Server/Azure SQL 将返回 NULL
。
- 若要使用 ASE 行为,请选择 Replace 函数。 对
CHARINDEX
函数的所有调用都替换为对任CHARINDEX_VARCHAR
一函数或CHARINDEX_NVARCHAR
用户定义函数的调用,具体取决于传递的参数类型(在架构名称s2ss
下在用户数据库中创建)来模拟 SAP ASE 行为。 - 若要使用 SQL Server/Azure SQL 行为,请选择“ 保留当前语法”。
在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置:
模式 | 价值 |
---|---|
违约 | 保留当前语法 |
乐观的 | 保留当前语法 |
完全 | Replace 函数 |
DATALENGTH 函数
当值是单个空间时,SQL Server/Azure SQL 和 ASE 与函数返回 DATALENGTH
的值不同。 在这种情况下,SQL Server/Azure SQL 返回 0
并返回 1
ASE。
- 若要使用 ASE 行为,请选择 Replace 函数。 对
DATALENGTH
函数的所有调用都替换为CASE
表达式来模拟 SAP ASE 行为。 - 若要使用默认 SQL Server/Azure SQL 行为,请选择“ 保留当前语法”。
在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置:
模式 | 价值 |
---|---|
违约 | 保留当前语法 |
乐观的 | 保留当前语法 |
完全 | Replace 函数 |
INDEX_COL函数
ASE 支持函数的INDEX_COL
可选user_id
参数;但是,SQL Server/Azure SQL 不支持此参数。 如果使用 user_id
参数,则无法将此函数转换为 SQL Server/Azure SQL 语法。
- 若要使用 ASE 行为,请选择 “转换函数”。 如果代码包含
user_id
参数,SSMA 将显示错误。 - 若要在每次遇到错误消息时
INDEX_COL
显示错误消息,请选择 “标记并显示错误”。 SSMA 不会转换对函数的引用,并将语句标记为错误注释。
模式 | 价值 |
---|---|
违约 | 标记并出现错误 |
乐观的 | 标记并出现错误 |
完全 | 标记并出现错误 |
INDEX_COLORDER函数
SQL Server/Azure SQL 没有 INDEX_COLORDER
系统函数。
- 若要使用 ASE 行为,请选择 “转换函数”。 对
INDEX_COLORDER
函数的所有调用都替换为对同名INDEX_COLORDER
(在架构名称s2ss
下的用户数据库中创建的)的调用,从而模拟 SAP ASE 行为。 - 若要在每次遇到错误消息时
INDEX_COLORDER
打印错误消息,请选择 “标记并显示错误”。 SSMA 不会转换对函数的引用,并将语句标记为错误注释。
在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置:
模式 | 价值 |
---|---|
违约 | 标记并出现错误 |
乐观的 | 标记并出现错误 |
完全 | 标记并出现错误 |
LEFT 和 RIGHT 函数
LEFT
RIGHT
ASE 中的函数对于负长度参数的行为方式不同。
- 若要使用 ASE 行为,请选择 “替换函数”。 然后,长度参数将
CASE
替换为将返回NULL
负值的表达式。 - 若要使用 SQL Server 行为,请选择“ 保留当前语法”。
在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置:
模式 | 价值 |
---|---|
违约 | 保留当前语法 |
乐观的 | 保留当前语法 |
完全 | Replace 函数 |
注释
如果 length 参数是文本值而不是复杂表达式,则无论项目设置如何,长度值始终都替换为 NULL
。
NEXT_IDENTITY 函数
SQL Server/Azure SQL 没有 NEXT_IDENTITY
系统函数。
- 若要使用 ASE 行为,请选择 “转换函数”。 对
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
用户定义函数的调用,具体取决于传递的参数类型(在架构名称s2ss
下在用户数据库中创建)来模拟 SAP ASE 行为。 - 若要使用默认 SQL Server/Azure SQL 行为,请选择 “替换函数”。
在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置:
模式 | 价值 |
---|---|
违约 | Replace 函数 |
乐观的 | Replace 函数 |
完全 | Replace 函数 |
TRIM (LTRIM, RTRIM) 函数
此设置指定是将调用 TRIM
替换为 SAP ASE 等效语法函数还是 LTRIM
RTRIM
保留当前语法。 此特定设置存在以下选项:
- Replace 函数
- 保留当前语法
在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置:
模式 | 价值 |
---|---|
违约 | Replace 函数 |
乐观的 | Replace 函数 |
完全 | Replace 函数 |
SUBSTRING 函数
在 ASE 中,如果指定大于表达式中的字符数的起始值,或者长度等于零,则函数 SUBSTRING(expression, start, length)
返回 NULL
。 在 SQL Server/Azure SQL 中,等效表达式返回空字符串。
- 若要使用 ASE 行为,请选择 Replace 函数。 对
SUBSTRING
函数的所有调用都替换为对或SUBSTRING_VARBINARY
SUBSTRING_NVARCHAR
用户定义的函数的调用SUBSTRING_VARCHAR
,具体取决于传递的参数类型(在架构名称s2ss
下的用户数据库中创建),以模拟 SAP ASE 行为。 - 若要使用 SQL Server/Azure SQL 行为,请选择“ 保留当前语法”。
在“ 模式”框中 选择转换模式时,SSMA 将应用以下设置:
模式 | 价值 |
---|---|
违约 | 保留当前语法 |
乐观的 | 保留当前语法 |
完全 | Replace 函数 |
“表”部分
添加主键
如果 SAP ASE 表没有主键或唯一索引,请在 SQL Server 或 Azure SQL 表中创建新的主键。
模式 | 价值 |
---|---|
违约 | 否 |
乐观的 | 否 |
完全 | 是的 |
注释
连接到 Azure SQL 时,默认为 “是 ”。