新人求助:SQL server 2008中用触发器创建复杂的公式(参数引用其它表中数据),出问题,求指点

aaaa1185164 2015-08-31 02:35:50
[size=18px][b]有两个表,一个是JGDCB,一个是二元形高参数表;表JGDCB中存储:每公顷断面积、胸径、树高、树种、蓄积量;二元形高参数表中存储:树种,a,b,c(abc为不同树种的参数值);
现在创建了一个触发器,希望输入每公顷断面积、胸径、树高和树种后,自动计算得到蓄积量,公式如下
每公顷蓄积=每公顷断面积*a*树高的b次方/胸径的c 次方
a,b,c 存储在二元形高参数表里,,,根据树种不同,a,b,c参数取值不同,
创建的触发器如下
触发器如下
create trigger JGB_tri
on JGDCB
for insert
as
begin transaction
update JGDCB
set 每公顷蓄积 = 每公顷断面积*(selecta from 二元形高参数表)*power(树高,(select b from 二元形高参数表))/power(胸径,(select c from 二元形高参数表))
where EXISTS ( select a,b,c from 二元形高参数表 where JGDCB.树种 = 二元形高参数表.树种名称)
commit transaction
可以保存,但是在运行输入的时候,出现错误查询返回的值不止一个当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

初学者,现学现卖,遇到问题很多,,求教大神,使用触发器是否是实现此计算功能较好的方法?还有啥方法?我做触发器问题出在哪?
新人分数不多,还请各位大神不吝赐教,,,,,拜谢
...全文
173 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
aaaa1185164 2015-09-03
引用 11 楼 Tiger_Zhao 的回复:
EXCEL 中小数都是按浮点双精度运算的,所以你应该统一转换为float运算,结果保存在 numeric(4,1) 字段中没关系。
哈哈,问题终于解决了,还是要转换成float型,一开始是我转换有问题 。。。。。 cast(i.每公顷断面积 as float)*cast(p.a as float)*power(cast(i.树高 as float),cast(p.b as float))/power(cast(i.胸径 as float),cast(p.c as float)) AS 每公顷蓄积 。。。。。 这样就正确了, 感谢,非常感谢
回复
Tiger_Zhao 2015-09-02
EXCEL 中小数都是按浮点双精度运算的,所以你应该统一转换为float运算,结果保存在 numeric(4,1) 字段中没关系。
回复
aaaa1185164 2015-09-02
引用 11 楼 Tiger_Zhao 的回复:
EXCEL 中小数都是按浮点双精度运算的,所以你应该统一转换为float运算,结果保存在 numeric(4,1) 字段中没关系。
........ SELECT i.ID, cast(i.每公顷断面积 as float)*cast(p.a as float)*cast(power(i.树高,p.b) as float)/cast(power(i.胸径,p.c) as float) AS 每公顷蓄积 FROM inserted i JOIN CSB p ON i.树种 = p.树种 ......... 用cast,进行了转换,结果还是不对,跟没转化是一样的,,,,到底哪里出问题了呢?唉,, ps.已经确定不是a,b,c参数的问题,重新建了一个表只输入了一种树一个参数,结果还是没变,,跟excel算的不一样
回复
gw6328 2015-09-02
如果公式一定,可以不必用触发器,用计算列,或者程序用的时候再计算都可以。
回复
aaaa1185164 2015-09-01
求助,,,大神求指点,,,
回复
aaaa1185164 2015-09-01
不全是,参数表中a,b,c几个参数都是小数例如0.763610635,这样的,,,树高设的是保留一位小数numeric(3,1),胸径是整数,然后最后求出的蓄积要求一位小数,根据实际出现的数值大小我设置为numeric(4,1),数据类型是不是挺乱,这样不能直接运算吗,,,,初学者现学现卖,小问题比较多,十分感谢指教,,,,
回复
Neo_whl 2015-09-01
引用
朋友你好,你提供的方法非常有效,运行没有问题,输入也没有问题,但是,相同的公式和参数,在SQL server 2008这个表格里运行算出来的结果,跟我用excel算出来的结果不一样啊,差很大,好奇怪,这可能是啥问题,,,,,,ps.不同树种对应的a,b,c参数不同,已经在二元形高参数表中按照树种名称依次列出,在JGDCB中输入的树种名是二元形高参数表中已经存在的树种名称
差别很大?没有测试数据,不太清楚你存储数据的数据类型,可能是整数取整问题造成的差异。
回复
Tiger_Zhao 2015-09-01
你的数据都是整数?
SQL 中 整数/整数 是整除,前面再乘个1.0变成小数除 1.0*整数/整数
回复
aaaa1185164 2015-09-01
引用 6 楼 Tiger_Zhao 的回复:
p.power 这里去掉。 如果已经有10000条,都是已经算好的。 插入1条后没必要把10001条更新一遍,只要更新新插入的那一条就可以了。
大神你好,给的代码好长时间才看懂,厉害呀,现在更正后可以实现计算,但是遇到了跟四楼一样的问题,,,就是SQL SERVER表中算出来的值跟excel表中相同参数相同公式算出来的值不一样,我已经检查好几遍参数,每个树种对应输入的a,b,c三个参数没有啥问题,,,,这是什么原因,大神是否有解决方法,,,
回复
Tiger_Zhao 2015-09-01
p.power 这里去掉。

如果已经有10000条,都是已经算好的。
插入1条后没必要把10001条更新一遍,只要更新新插入的那一条就可以了。
回复
aaaa1185164 2015-09-01
引用 3 楼 Tiger_Zhao 的回复:
...
UPDATE JGDCB
SET JGDCB.每公顷蓄积 = t.每公顷蓄积
FROM JGDCB,
(
SELECT i.ID,
i.每公顷断面积*p.power(i.树高,p.b)/power(i.胸径,p.c) AS 每公顷蓄积
FROM inserted i
JOIN 二元形高参数表 p
ON i.树种 = p.树种名称
) t
WHERE JGDCB.ID = t.ID
...

只更新插入相关的,不要全表更新。

出现一个问题,如下图
朋友你的意思是输入一条记录更新一下蓄积,不能其它参数输入后一次更新所有蓄积
回复
aaaa1185164 2015-09-01
引用 2 楼 u011015550 的回复:

--试试这样
create trigger JGB_tri
on JGDCB
for insert
as
begin transaction
update JGDCB
set 每公顷蓄积 = 每公顷断面积*tb2.a*power(树高,tb2.b)/power(胸径,tb2.c)
from 二元形高参数表 as tb2 join JGDCB on JGDCB.树种=tb2.树种
commit transaction
朋友你好,你提供的方法非常有效,运行没有问题,输入也没有问题,但是,相同的公式和参数,在SQL server 2008这个表格里运行算出来的结果,跟我用excel算出来的结果不一样啊,差很大,好奇怪,这可能是啥问题,,,,,,ps.不同树种对应的a,b,c参数不同,已经在二元形高参数表中按照树种名称依次列出,在JGDCB中输入的树种名是二元形高参数表中已经存在的树种名称
回复
Tiger_Zhao 2015-09-01
...
UPDATE JGDCB
SET JGDCB.每公顷蓄积 = t.每公顷蓄积
FROM JGDCB,
(
SELECT i.ID,
i.每公顷断面积*p.power(i.树高,p.b)/power(i.胸径,p.c) AS 每公顷蓄积
FROM inserted i
JOIN 二元形高参数表 p
ON i.树种 = p.树种名称
) t
WHERE JGDCB.ID = t.ID
...

只更新插入相关的,不要全表更新。
回复
Neo_whl 2015-09-01

--试试这样
create trigger JGB_tri
on JGDCB
for insert
as
begin transaction
update JGDCB
set 每公顷蓄积 = 每公顷断面积*tb2.a*power(树高,tb2.b)/power(胸径,tb2.c)
from 二元形高参数表 as tb2 join JGDCB on JGDCB.树种=tb2.树种
commit transaction
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-08-31 02:35
社区公告
暂无公告