存储过程中sql命令的不同行为

时间:2012-11-15 14:16:11

标签: sql stored-procedures firebird2.5

源表TEST(摘录)。括号中的值确定日期类型:

ID (integer)  |   SAMPLES (double precision)   | NSAMPLES (double precision)
------------------------------------------------------------------------------
575            10.000000                        10.000000

有问题的SQL命令是这样的:

insert into TEST
select * from TEST where ID=575;

如果我从开源工具FlameRobin的命令行执行此命令

enter image description here

更新的表格如下所示

ID (integer)  |   SAMPLES (double precision)   |  NSAMPLES (double precision)
------------------------------------------------------------------------------
575            10.000000                          10.000000
810            10.000000                          10.000000

如果我从存储过程运行相同的命令(来自FlameRobin或我自己的应用程序使用BDE(Borland数据库引擎)组件)结果就是这个

ID (integer)  |   SAMPLES (double precision)   | NSAMPLES (double precision)
------------------------------------------------------------------------------
575            10.000000                         10.000000
810            10.000000                         10.000000
811            10.000000                         NULL

有趣的是,SAMPLES和NSAMPLES两个列具有相同的日期类型,相同的源值(= 10.000000),并且两者都可以为空。为什么复制从存储过程调用的命令不要复制NSAMPLES列的值?而不是它,它将NULL值插入新记录。

已添加16.11.2012

也许在db管理工具FlameRobin的以下屏幕截图中可以找到一些提示。它们包含存储过程INSERT_TEST和表TEST的完整定义。

enter image description here

enter image description here

为什么字段列表中缺少NSAMPLES列???

enter image description here

1 个答案:

答案 0 :(得分:0)

问题在于两种环境对IDENTITY列的不同处理。

相反,这样做:

 Insert into TEST(SAMPLES, NSAMPLES)
 Select SAMPLES, NSAMPLES 
 from TEST where ID = 575

即。如果您明确命名所有列,问题就会消失。无论如何,这通常是一个好主意。