表A有列1,2,3,4
列2是1+3得到的(表A中的列1和列2)
而列3又是通过列4除以列2得到的
但是mssql数据库明显不让计算列引用另一个计算列
请问下各位前辈,这个问题能否在数据库里就解决,或者其他方法,谢谢了~!
17 个解决方案
#1
触发器可以实现,考虑吗?
#2
是在更新表A的时候进行再计算吗?
#3
用视图,或是将另一个计算列的公式复制过来。
#4
列2是1+3得到的(表A中的列1和列2)
而列3又是通过列4除以列2得到的
-- 逻辑上怎么解释?
列2 引用了 列3,列 3 又引用了 列2 ,互相引用了;
而列3又是通过列4除以列2得到的
-- 逻辑上怎么解释?
列2 引用了 列3,列 3 又引用了 列2 ,互相引用了;
#5
这个逻辑怎么来的,先有列2还是列3?
#6
我实际情况大概就是这个意思了,问题就是刚才我用了触发器,还是一样的不让我再引用计算列了
#7
是先有的列2
#8
遇到这种问题是不是只能通过前台计算之后再写入数据库了?
#9
不会的,你的触发器是怎么写的,表又是怎么定义的?
#10
不会的,你的触发器是怎么写的,表又是怎么定义的?
这个是我写的触发器
LD_YD_JXZL是计算列,而BM_LD_YD_JXZL又是要通过LD_YD_JXZL计算得来
#11
create table test(id int identity, c1 int, c2 int, c3 as c1 + c2, c4 int)
go
create trigger tri_test_ins
on test after insert, update
as
begin
update test set c4 = c3 / 2 where id in (select id from inserted)
end
go
insert into test(c1, c2) values(100,200)
go
update test set c4 = c3 + 100
go
select * from test
go
drop table test
go
(1 行受影响)
id c1 c2 c3 c4
----------- ----------- ----------- ----------- -----------
1 100 200 300 150
(1 行受影响)
#12
这个是我写的触发器
LD_YD_JXZL是计算列,而BM_LD_YD_JXZL又是要通过LD_YD_JXZL计算得来
你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;
#13
你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;
对了,原来是我写的代码,有问题,我也是网上复制过来,没好好研究,非常感谢
另外请教下,对于两张表的更新和插入触发器能写到一起吗?
#14
你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;
对了,原来是我写的代码,有问题,我也是网上复制过来,没好好研究,非常感谢
另外请教下,对于两张表的更新和插入触发器能写到一起吗?
不可以,触发发器的主体是表,两个表的触发器,在逻辑上分开的;
#15
你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;
对了,原来是我写的代码,有问题,我也是网上复制过来,没好好研究,非常感谢
另外请教下,对于两张表的更新和插入触发器能写到一起吗?
不可以,触发发器的主体是表,两个表的触发器,在逻辑上分开的;
知道了,最后请教一下,对于我这个贴的这种问题,触发器解决是否是最优或者最有效的呢?如果不是其他方法是什么?
#16
知道了,最后请教一下,对于我这个贴的这种问题,触发器解决是否是最优或者最有效的呢?如果不是其他方法是什么?
可以说是比较优的,但不是最有效的;
可以放在程序中,只是当这个逻辑发生变化时,要修改程序 ;
#17
知道了,最后请教一下,对于我这个贴的这种问题,触发器解决是否是最优或者最有效的呢?如果不是其他方法是什么?
可以说是比较优的,但不是最有效的;
可以放在程序中,只是当这个逻辑发生变化时,要修改程序 ;
学习了,非常感谢!
#1
触发器可以实现,考虑吗?
#2
触发器可以实现,考虑吗?
是在更新表A的时候进行再计算吗?
#3
用视图,或是将另一个计算列的公式复制过来。
#4
列2是1+3得到的(表A中的列1和列2)
而列3又是通过列4除以列2得到的
-- 逻辑上怎么解释?
列2 引用了 列3,列 3 又引用了 列2 ,互相引用了;
而列3又是通过列4除以列2得到的
-- 逻辑上怎么解释?
列2 引用了 列3,列 3 又引用了 列2 ,互相引用了;
#5
这个逻辑怎么来的,先有列2还是列3?
#6
列2是1+3得到的(表A中的列1和列2)
而列3又是通过列4除以列2得到的
-- 逻辑上怎么解释?
列2 引用了 列3,列 3 又引用了 列2 ,互相引用了;
我实际情况大概就是这个意思了,问题就是刚才我用了触发器,还是一样的不让我再引用计算列了
#7
这个逻辑怎么来的,先有列2还是列3?
是先有的列2
#8
遇到这种问题是不是只能通过前台计算之后再写入数据库了?
#9
列2是1+3得到的(表A中的列1和列2)
而列3又是通过列4除以列2得到的
-- 逻辑上怎么解释?
列2 引用了 列3,列 3 又引用了 列2 ,互相引用了;
我实际情况大概就是这个意思了,问题就是刚才我用了触发器,还是一样的不让我再引用计算列了
不会的,你的触发器是怎么写的,表又是怎么定义的?
#10
不会的,你的触发器是怎么写的,表又是怎么定义的?
这个是我写的触发器
LD_YD_JXZL是计算列,而BM_LD_YD_JXZL又是要通过LD_YD_JXZL计算得来
#11
create table test(id int identity, c1 int, c2 int, c3 as c1 + c2, c4 int)
go
create trigger tri_test_ins
on test after insert, update
as
begin
update test set c4 = c3 / 2 where id in (select id from inserted)
end
go
insert into test(c1, c2) values(100,200)
go
update test set c4 = c3 + 100
go
select * from test
go
drop table test
go
(1 行受影响)
id c1 c2 c3 c4
----------- ----------- ----------- ----------- -----------
1 100 200 300 150
(1 行受影响)
#12
这个是我写的触发器
LD_YD_JXZL是计算列,而BM_LD_YD_JXZL又是要通过LD_YD_JXZL计算得来
你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;
#13
你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;
对了,原来是我写的代码,有问题,我也是网上复制过来,没好好研究,非常感谢
另外请教下,对于两张表的更新和插入触发器能写到一起吗?
#14
你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;
对了,原来是我写的代码,有问题,我也是网上复制过来,没好好研究,非常感谢
另外请教下,对于两张表的更新和插入触发器能写到一起吗?
不可以,触发发器的主体是表,两个表的触发器,在逻辑上分开的;
#15
你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;
对了,原来是我写的代码,有问题,我也是网上复制过来,没好好研究,非常感谢
另外请教下,对于两张表的更新和插入触发器能写到一起吗?
不可以,触发发器的主体是表,两个表的触发器,在逻辑上分开的;
知道了,最后请教一下,对于我这个贴的这种问题,触发器解决是否是最优或者最有效的呢?如果不是其他方法是什么?
#16
知道了,最后请教一下,对于我这个贴的这种问题,触发器解决是否是最优或者最有效的呢?如果不是其他方法是什么?
可以说是比较优的,但不是最有效的;
可以放在程序中,只是当这个逻辑发生变化时,要修改程序 ;
#17
知道了,最后请教一下,对于我这个贴的这种问题,触发器解决是否是最优或者最有效的呢?如果不是其他方法是什么?
可以说是比较优的,但不是最有效的;
可以放在程序中,只是当这个逻辑发生变化时,要修改程序 ;
学习了,非常感谢!