1

我重新设计了基于 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 实用程序的正式版本之后。所以现在我有两个版本的数据库在流通——一个是单精度浮点数,第二个是双精度浮点数。

我正在搜索可以检查表 HARMONICS 中列的实际数据类型的 SQL 脚本。如果这是双精度,那么脚本将什么也不做。如果这是单精度,脚本会将数据类型为“浮点”的列转换为“双精度”,同时保留所有现有数据。关键是脚本在任何一种情况下都不会返回错误。这可能吗?如果是,那怎么办?

4

1 回答 1

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,双精度为 27。

于 2012-02-15T10:21:03.013 回答