新人求助: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
可以保存,但是在运行输入的时候,出现错误查询返回的值不止一个当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

初学者,现学现卖,遇到问题很多,,求教大神,使用触发器是否是实现此计算功能较好的方法?还有啥方法?我做触发器问题出在哪?
新人分数不多,还请各位大神不吝赐教,,,,,拜谢
...全文
218 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
本课程根据讲师十多年在世界500强外企的生产环境中的SQL Serer数据库管理和项目实施经验倾心打造。课程系统性强,知识体系完整,覆盖90%以上的企业环境下SQL Server高可用场景,课程中不仅演示详细的操作步骤,更加突最常见的故障和问题,让学员少走“弯路”,不只是让学员学会“操作”更能让学员“操作”的规范,满满的干货分享,一些课程资料(架构图、部署规划表格等)不仅可以帮助学员掌握技能,也可以作为学员在企业生产环境中实施SQL Server高可用的配置文档、操作手册等。课程的实验环境介绍:1)全部基于微软域环境和企业版SQL Server AOAG - 95%以上的企业环境都是在域环境中,不介绍非域环境和标准版的SQL Server高可用性组,这的配置在企业中较罕见,没有实践意义,不浪费学员时间。2)相应域环境已提前部署和配置好 - 学员导入虚拟机即可开始实验,无需从零开始搭建域环境,所有实验中SQL Server均已加域,直入主题,节省大量时间。3)最新的Windows Server故障转移集群(WS2016、WS2019)和最新版本的SQL ServerSQL2017、SQL2019) -  WS2016-SQL2017与WS2019-SQL2019是目前大多数企业SQL Server高可用的主要平台,基于微软产品生命周期现在一些企业也在讲早期的AOAG向这两个版本迁移,掌握这两种组合不仅让学员学会,更能学有所用。本课程为后续SQL Server进阶课程铺垫,是通向SQL Server DBA 专家的必经之路,讲师每周答疑两次。所有课程资料包括:课程PPT、架构图、部署规划表格、各类脚本学员均可下载。     

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧