--TRY CREATE TRIGGER TRI_INSERT ON importbill FOR INSERT AS DELETE storenum FROM INSERTED I WHERE storenum.merchID=I.merchID INSERT storenum SELECT merchID,COUNT(*)CNT FROM importbill IM,INSERTED I WHERE IM.merchID=I.merchID
--storenum这个表主要是为了统计importbill表中 merchID 对应的num(int) 的数目 --是求和还是求个数 --如果是求和 则 --修改 INSERT storenum SELECT merchID,sum(num)CNT FROM importbill IM,INSERTED I WHERE IM.merchID=I.merchID
哥呀 你这个 INSERTED I 是什么东东?????? 我 照你 代码 写成 这样 ALTER TRIGGER [kcpd] ON [dbo].[ImportBill] for INSERT ASDELETE StoreBill FROM INSERTED I WHERE storenum.merchID=I.merchID INSERT into StoreBill values(I.merchID,(select SUM(quantity) from ImportBill where merchID=I.merchID )) 可能 我写触发器不是特别成熟 但是 我有点看不懂 你写的 INSERT 的意思 INSERT 的语法 不是 INSERT INTO TABLE VALUES()吗
哥 小弟 又 根据 您的 思想自己设计了一个 虽然 没通过 但是 我觉得应该可以 您指点下 ALTER TRIGGER [kcpd] ON [dbo].[ImportBill] for INSERT AS DECLARE @mid=(SELECT merchID from ImportBill where ImID=(select MAX(ImID) from ImportBill) ) DELETE FROM StoreBill WHERE merchID=@mid INSERT into StoreBill values(@mid,(select SUM(quantity) from ImportBill where merchID=@mid )) 我是这么想的 他不插进一列 然后 触发 触发器吗 那么我就找 mid(最大的因为他是自动增长的)对应 的merchID 有了 这个 merchID 一切都好说了 后面你说要删除 要插入的 都可以根据这儿 @mid 去搞定 但是 我这只是思路写的不对 不知道可行吗 我觉得 现在问题不是别的 主要是 能够找到 我插入这列的 merchID 的 值是多少
DELETE storenum FROM INSERTED I WHERE storenum.merchID=I.merchID 为什么还delete?
DECLARE @mid=(SELECT merchID from ImportBill where ImID=(select MAX(ImID) from ImportBill) ) --> 先定义才能使用 DECLARE @mid int select @mid =merchid from ImportBill order by ImID desc
哥 触发器 到时通过了 但是通过测试 效果不佳 内个 专门统计 数量的 表 的 merchID 怎么插入的时候 只剩下 1位 而且 数量是NULL 费解ALTER TRIGGER [kcpd] ON [dbo].[ImportBill] for INSERT AS DECLARE @mid varchar,@num int set @mid=(SELECT merchID from ImportBill where ImID=(select MAX(ImID) from ImportBill) ) set @num=(select SUM(quantity) from ImportBill where merchID=@mid ) DELETE FROM StoreBill WHERE merchID=@mid INSERT into StoreBill values(@mid,@num) 我也不知道错在哪了 帮我看下吧 楼上 那位 哥 理解的 十分贴切
--try ALTER TRIGGER [kcpd] ON [dbo].[ImportBill] for INSERT AS DECLARE @mid varchar(30),@num int --定义字符要指定长度,如不指定默认为1 set @mid=(SELECT merchID from ImportBill where ImID=(select MAX(ImID) from ImportBill) ) set @num=(select SUM(quantity)quantity from ImportBill where merchID=@mid ) DELETE FROM StoreBill WHERE merchID=@mid INSERT into StoreBill values(@mid,@num)
哥 我 知道 问题出哪了 就出在 @num int 上了 但是 int 怎么指定长度啊 不能是int(10) 应该怎么写呀
--TRY ALTER TRIGGER [kcpd] ON [dbo].[ImportBill] for INSERT AS DELETE FROM StoreBill FROM INSERTED I WHERE StoreBill.merchID=I.merchID INSERT StoreBill SELECT merchID,SUM(quantity)CNT FROM importbill IM,INSERTED I WHERE IM.merchID=I.merchID GROUP BY merchID
其实你这个要考虑三种情况了 1,删除了 for delete 2,插入了 for insert 3,更新了 for update 分别写对应触发器, 或者写成一个触发器,在里面判断,是插入了,还是删除了,还是更新了
CREATE TRIGGER TRI_INSERT ON importbill instead of INSERT AS if exists(select 1 from inserted i,storenum a where i.merchID = a.merchID ) raiserror(....) else begin insert importbill(merchID,num) select merchID,snum from inserted INSERT storenum SELECT merchID,snum FROM INSERTED --主键自己生成 end go
CREATE TRIGGER TRI_INSERT ON importbill
FOR INSERT
AS
DELETE storenum FROM INSERTED I WHERE storenum.merchID=I.merchID
INSERT storenum SELECT merchID,COUNT(*)CNT FROM importbill IM,INSERTED I
WHERE IM.merchID=I.merchID
--是求和还是求个数
--如果是求和 则
--修改
INSERT storenum SELECT merchID,sum(num)CNT FROM importbill IM,INSERTED I
WHERE IM.merchID=I.merchID
ALTER TRIGGER [kcpd]
ON [dbo].[ImportBill]
for INSERT
ASDELETE StoreBill FROM INSERTED I WHERE storenum.merchID=I.merchID
INSERT into StoreBill values(I.merchID,(select SUM(quantity) from ImportBill where merchID=I.merchID ))
可能 我写触发器不是特别成熟 但是 我有点看不懂 你写的 INSERT 的意思 INSERT 的语法 不是 INSERT INTO TABLE VALUES()吗
--等价
INSERT TB(ID ,[NAME]) SELECT 'A','B'
您指点下
ALTER TRIGGER [kcpd]
ON [dbo].[ImportBill]
for INSERT
AS
DECLARE @mid=(SELECT merchID from ImportBill where ImID=(select MAX(ImID) from ImportBill) )
DELETE FROM StoreBill WHERE merchID=@mid
INSERT into StoreBill values(@mid,(select SUM(quantity) from ImportBill where merchID=@mid ))
我是这么想的 他不插进一列 然后 触发 触发器吗 那么我就找 mid(最大的因为他是自动增长的)对应 的merchID
有了 这个 merchID 一切都好说了
后面你说要删除 要插入的 都可以根据这儿 @mid 去搞定 但是 我这只是思路写的不对 不知道可行吗 我觉得 现在问题不是别的 主要是 能够找到 我插入这列的 merchID 的 值是多少
--> 先定义才能使用
DECLARE @mid int
select @mid =merchid from ImportBill order by ImID desc
importbill 只要增加 storenum 中的数据就会改变,所以先删除,然后重新统计插入
ON [dbo].[ImportBill]
for INSERT
AS
DECLARE @mid varchar,@num int
set @mid=(SELECT merchID from ImportBill where ImID=(select MAX(ImID) from ImportBill) )
set @num=(select SUM(quantity) from ImportBill where merchID=@mid )
DELETE FROM StoreBill WHERE merchID=@mid
INSERT into StoreBill values(@mid,@num)
我也不知道错在哪了 帮我看下吧
楼上 那位 哥 理解的 十分贴切
ALTER TRIGGER [kcpd]
ON [dbo].[ImportBill]
for INSERT
AS
DECLARE @mid varchar(30),@num int --定义字符要指定长度,如不指定默认为1
set @mid=(SELECT merchID from ImportBill where ImID=(select MAX(ImID) from ImportBill) )
set @num=(select SUM(quantity)quantity from ImportBill where merchID=@mid )
DELETE FROM StoreBill WHERE merchID=@mid
INSERT into StoreBill values(@mid,@num)
ALTER TRIGGER [kcpd]
ON [dbo].[ImportBill]
for INSERT
AS
DELETE FROM StoreBill FROM INSERTED I WHERE StoreBill.merchID=I.merchID
INSERT StoreBill SELECT merchID,SUM(quantity)CNT FROM importbill IM,INSERTED I
WHERE IM.merchID=I.merchID GROUP BY merchID
如果 improtbill 被更新了 也就是说原来的quantity 被另一个触发器 触发 修改了 那么我也要相应的去 修改
我的StoreBill的 信息
INSERT 我是用 了 查询 mid 最大的方式获得的 merchID
如果 是表被更新了 我该怎么去找 这个
merchID 呢?????我现在很没有头绪,这相当于 另一种解决思路 哥 你有办法吗??
1,删除了 for delete
2,插入了 for insert
3,更新了 for update
分别写对应触发器,
或者写成一个触发器,在里面判断,是插入了,还是删除了,还是更新了
instead of INSERT
AS
if exists(select 1 from inserted i,storenum a where i.merchID = a.merchID )
raiserror(....)
else
begin
insert importbill(merchID,num) select merchID,snum from inserted
INSERT storenum SELECT merchID,snum FROM INSERTED --主键自己生成
end
go
是这样一个流程 salebill 销售了多少东西一保存 就自动的触发 进货信息 中的 quantity 让他的数量 变成 (quantity-销售的数量)
这样呢 我可以再写个触发器在 salebill 如果 插入新纪录 那么 StoreBill 的merchID 对应的 snum 也去 减去 这个销售的数量 这样就达到的更新的目的了 哥 真是太谢谢你了 谢谢你花这么长 时间 给我解决 这个问题,我现在思路清楚了, 我没有什么可以回报的 这 100分全送给你 你人真是太好了 太谢谢你了