触发器,计算值并将其添加到表中

时间:2013-03-01 06:55:07

标签: sql sql-server-2008 triggers

我正在尝试wright触发器,它将在表中插入缺失值。我正在使用SQL Server Express 我有桌子

create table test 
(suma int ,
summ_year int,
summ_month int 
);

然后我插入一个测试值

INSERT  into test (suma)values (4951)

我创建的触发器应根据表

中的summ值计算值
create trigger updatetest
on test
AFTER update
as update test
set summ_year = round(suma*1.85,0 ),summ_month = round(summ_year/12,0)

其中1.85是固定值,12是几个月

比我更新suma

update test  set suma = 4950

并选择检查它是如何工作的

select * from test

从select返回看起来像4950 9158 NULL 但是我的触发器的第二部分应该计算summ_month = round(summ_year/12,0)返回NULL值。

当我跑这个选择

select summ_month = round(summ_year/12,0) from test

它正在发挥作用。 任何想法如何解决它?

1 个答案:

答案 0 :(得分:1)

为什么不使用计算列:

create table test 
(suma int ,
summ_year as round(suma*1.85,0 ),
summ_month as round(round(suma*1.85,0 )/12,0) 
);

没有触发,没有麻烦,没有大惊小怪。

至于为什么UPDATE无法正常工作? SET语句中的表达式旨在计算,就好像它们是并行计算的一样。他们肯定不会从左到右进行评估。因此,在您计算summ_month = round(summ_year/12,0)时,summ_year尚未更新,仍然是NULL

这种行为的一个好结果是,要交换两列的值,只需要写:

UPDATE tab SET a = b, b = a

它做对了。

如果你确实希望(由于一些奇怪的原因)继续在触发器中执行这些计算,你必须像我在顶部的计算列那样做 - 重复表达式来计算年份计算月份值的价值:

update test
set summ_year = round(suma*1.85,0 ),summ_month = round(round(suma*1.85,0 )/12,0)