本文介绍 SSMA for Oracle 无法转换BINARY_FLOAT
具有检查NAN
(非数字)条件约束的列的原因。
背景
在 Oracle 中 BINARY_FLOAT
,数据类型允许应用程序存储数字下溢或溢出值。 SQL Server 在计算数字溢出或下溢后立即生成错误,因此无法将值存储在数据类型中 FLOAT
。 尝试转换具有约束条件的表的架构 检查NAN
时,SSMA 会生成错误,因为 SQL Server 不支持浮点条件,例如NAN
。
示例
在以下示例中,你将创建一个表,并通过添加类型的约束 NAN
对其进行更改:
CREATE TABLE NANTEST
(
COL1 BINARY_FLOAT
);
/
ALTER TABLE NANTEST ADD CONSTRAINT NANCHECK1 CHECK (COL1 IS NOT NAN);
尝试转换 SSMA 中上表的架构时,会生成以下错误消息:
O2SS0007:检查未分析的约束条件
可能的补救措施
上一示例的解决方案可以分为两个步骤:
步骤 1:在没有检查约束的情况下在 SQL Server 中创建新表:
CREATE TABLE NANTEST
(
COL1 FLOAT(53)
);
在 SQL Server 中,等效项 BINARY_FLOAT
为 FLOAT(53)
.
步骤 2: 修改应用程序代码以插入此表中的值。 创建阻止TRY ... CATCH
用户插入不受支持的值并生成类似于从检查约束生成的错误的错误消息:
DECLARE
@VAL FLOAT(53)
BEGIN TRY
SET @VAL = 1 / 0
INSERT INTO NANTEST VALUES (@VAL)
END TRY
BEGIN CATCH
PRINT(
'SQL error is ' + CONVERT(varchar(20), ERROR_NUMBER())
+ ' : ' + CONVERT(varchar(100), ERROR_MESSAGE()))
END CATCH;
重要
尝试ISNUMERIC()
在此方案的检查约束中使用函数不是可行的解决方案,因为ISNUMERIC()
旨在为可能表示数值的字符串检查,而不是数值下溢和溢出条件。