我重新设计了基于Firebird的SQL数据库。作为这个过程的一部分,我创建了一个名为HARMONICS的新表。使用基于GUI的管理工具,我创建了以下列:
HARM_LP_ID Integer NOT NULL
HNUMBER Integer NOT NULL
HAMPCHNL0 Double precision
HAMPCHNL1 Double precision
HAMPCHNL2 Double precision
HAMPCHNL3 Double precision
HAMPCHNL4 Double precision
HAMPCHNL5 Double precision
HPHCHNL0 Double precision
HPHCHNL1 Double precision
HPHCHNL2 Double precision
HPHCHNL3 Double precision
HPHCHNL4 Double precision
HPHCHNL5 Double precision
之后我将一些测试数据插入新实体。更改还包括其他表,但这些与我的问题无关,所以我不会在这里列出它们。然后我定制了我的应用程序,以便使用关系数据库的新结构。
当应用程序完全测试时,我增强了名为Upgrader的实用程序。 Upgrader的任务是在各种版本的SQL数据库之间进行转换。为了完成这个任务,我编写了SQL脚本。根据官方Firebird网站(http://firebirdsql.org/manual/migration-mssql-data-types.html)上的错误指南,我写了以下命令来创建上述表格:
CREATE TABLE HARMONICS
(
HARM_LP_ID Integer NOT NULL,
HNUMBER Integer NOT NULL,
HAMPCHNL0 Float,
HAMPCHNL1 Float,
HAMPCHNL2 Float,
HAMPCHNL3 Float,
HAMPCHNL4 Float,
HAMPCHNL5 Float,
HPHCHNL0 Float,
HPHCHNL1 Float,
HPHCHNL2 Float,
HPHCHNL3 Float,
HPHCHNL4 Float,
HPHCHNL5 Float,
CONSTRAINT PKHARMONICS1 PRIMARY KEY (HARM_LP_ID,HNUMBER)
);
我认为Firebird数据类型“Float”是双精度浮点数(与C中的数据类型“double”相同)。我最终发现我错了,但这是在我创建了Upgrader实用程序的正式版本之后。所以现在我有两个版本的数据库在流通 - 一个是单精度浮点数,另一个是双精度浮点数。
我正在搜索SQL脚本,该脚本将检查表HARMONICS中列的实际数据类型。如果这是双精度,则脚本将不执行任何操作。如果这是单精度,则脚本会将数据类型为“Float”的列转换为“Double precision”,同时保留所有现有数据。重点是脚本在任何一种情况下都不会返回错误。这可能吗?如果是,那么如何?
答案 0 :(得分:4)
您可以使用下一个查询
检查列的实际类型SET TERM ^ ;
EXECUTE BLOCK AS BEGIN
if (exists(select
rf.rdb$field_name,
f.rdb$field_type
from
rdb$fields f join rdb$relation_fields rf
on rf.rdb$field_source = f.rdb$field_name
where
rf.rdb$relation_name = 'YOUR_TABLE_NAME'
AND rf.rdb$field_name = 'YOUR_FIELD_NAME'
AND f.RDB$FIELD_TYPE = 10)) then
execute statement 'ALTER TABLE YOUR_TABLE_NAME ALTER YOUR_FIELD_NAME TYPE DOUBLE PRECISION';
END^
SET TERM ; ^
FLOAT的rdb $ field_type为10,DOUBLE PRECISION为27。