关于触发器的一点问题 大家来帮帮忙吧!!(100)

Y

Yang.SZ

Unregistered / Unconfirmed
GUEST, unregistred user!
  兄弟是搞医疗软件的  今天我作药库的时候发现个问题  我在入库记录表里加了个触发器作用是:在入库表里有新记录加入时同步更新库存表里的药品库存数量。 然后又加了个入库临时表 把入库信息临时保存在这里 当用户填完入库单点保存后 再用INSERT ...SELECT 命令把临时表里的数据一次性写入入库表里 结果测试时发现 如果临时表里只有一条记录的话没问题 可如果临时表里有两条或两条以上记录时 只有最后一条记录的库存数量同步更新而其它的库存信息没动。    想了好久也无法确定 是我没有用明白呢 还是用触发器同步更新时只能一次性插入一条记录。 有没有什么解决方法  敬候各位的指点。。 望各位能多多指教
 
  晕啊。。 怎么没人鸟我啊??
 
1、 库存表: 药品编号, 数量, 进价, 售价2、 入库表: 入库单号, 药品编号, 数量, 进价, 售价3、 临时表: 入库单号, 药品编号, 数量, 进价, 售价在入库表里加的触发器 : 同步INSERT 到库存表里。 当用户点保存按钮后 INSERT INTO 入库表 SELECT * FROM 临时表 如果这时临时表里只有一条记录则没问题 但如果超过一条以上 则 入库表的触发器就只把最后一条临时表的记录 INSERT到库存表里。。 这样总算说明白了吧 这是怎么回事 请大家帮帮忙吧。。
 
什么数据库?你的触发器是怎么写的?
 
应该是你的触发器写的不对select * from inserted
 
触发器写的语句是什么呢?写错了吧,微软还不致于犯这个低级错误.
 
临时表:NUMBER,PH,NUM,PRICE,SALES,PRODATE,USEDATE,PROVIDER;入库表:BILLNO,NUMBER,PH,NUM,PRICE,SALES,PRODATE,USEDATE,PROVIDER;库存表:NUMBER,PH,NUM,PRICE,SALES,PRODATE,USEDATE,PROVIDER;***********************************************************************入库表的触发器: AFTER INSERT DECLARE @NUMBER CHAR(7), DECLARE @PH VARCHAR(20), DECLARE @NUM INT, DECLARE @PRICE MONEY, DECLARE @SALES MONEY, DECLARE @PRODATE CHAR(10), DECLARE @USEDATE CHAR(10), DECLARE @PROVIDER VARCHAR(30) **** SELECT @NUMBER = NUMBER,@PH = PH,@NUM = NUM,@PRICE = PRICE,@SALES = SALES,@PRODATE = PRODATE,@USEDATE = USEDATE,@PROVIDER = PROVIDER FROM INSERTED SELECT * FROM 库存表 WHERE NUMBER = @NUMBER AND PH = @PH IF @@ROWCOUNT = 0 THEN INSERT INTO 库存表(.....) VALUES (...) ELSE UPDATE 库存表 SET NUM = NUM + @NUM WHERE NUMBER = @NUMBER AND PH = @PH*******************************************************************存储过程是: DECLARE @BILLNO CHAR(15), DECLARE @PROVIDER VARCHAR(30)AS INSERT INTO 入库表(BILLNO, NUMBER, PH, NUM, PRICE, SALES, PRODATE, USEDATE, PROVIDER) SELECT @BILLNO, NUMBER, PH, NUM, PRICE, SALES, PRODATE, USEDATE, @PROVIDER FROM 临时表 WHERE BILLNO = @BILLNO 我是刚开始接触触发器 看了半天感觉代码没问题 在临时表里入了一条记录测试也好使 。 但后来再测试时发现如果临时表里有两条或以上的记录时 前面几条记录并没有触发 只有最后一条记录的库存值变化了。。 是我的写法有问题吗?? 如果是我写的不对的话 那就太谢天谢地了 不然就费事了 还是烦劳各位大侠多多指教了 小弟不盛感激
 
我用的是SQLSERVER2000的数据库
 
触发器只支持一条一条数据更新, 你用insert into select * from ,这里可能是批量更新,问题就在这里,
 
呃。。。 不会吧。。。。 那要真这样的话 触发器对我来说就没什么用了啊。。
 
呃。。。 我记得以前大富翁都是很强悍的啊 提个问题都是N多人来评论的说 怎么现在都这样了吗??? 我这个问题都没法解决了吗??? 就只能这样了?? 真的就是SQLSERVER本身的问题??? 微软会出现这种很明显的问题吗???
 
其实触发器有两种(针对你这种情况),一种是象你这种“insert into select * from”语句只触发一次,另一种是象你这种“insert into select * from”语句会对每一条记录都触发。第一种的目的是用来生成类似日志的,记录什么时候运行过这种语句。第二种的目的就是你想的,类似更新库存用的。好象系统默认的是第一种(oracle是这样,sql erver不记得了),如果使用第二种,要多写几句的,你可以在网上查一查,或是看看帮助。
 
多人接受答案了。
 
顶部