我正在尝试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
它正在发挥作用。 任何想法如何解决它?
答案 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)