首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 触发器 影响多行时无效 [无满意答案结贴]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzyyc
    • 等级:
    发表于:2008-05-20 09:31:11 楼主
    SQL的触发器是表级触发器,DML影响一行或无数行触发动作只触发一次。
    触发器定义:
    CREATE TRIGGER Barn_Branch_IU
    ON dbo.Barn_Branch
    FOR INSERT
    AS
    begin
        begin tran
        DECLARE @find integer
        DECLARE @rowcount integer
        set @rowcount=(select count(*) from inserted)
        if @rowcount=1
        begin
            set @find=(select count(*)  from Barn_Branch where rtrim(ltrim(ProBarcode))=(select cast(ProBarcode as varchar(50)) as ProBarcode from inserted) AND ltrim(rtrim(pihao))=(select cast(pihao as varchar(50)) as pihao from inserted) AND ltrim(rtrim(BranchCode))=(select cast(BranchCode as varchar(50)) as BranchCode from inserted))
            print @find
    if @find>1
      begin
                    delete Barn_Branch where id in (select id from inserted)
      UPDATE Barn_Branch SET  Sum_Num=Sum_Num+(select Sum_Num from inserted),Pei_Price=(select Pei_Price from inserted) WHERE  ProBarcode=(select cast(ProBarcode as varchar(50)) as ProBarcode from inserted)  AND rtrim(pihao)=(select cast(pihao as varchar(50)) as pihao from inserted) AND rtrim(BranchCode)=(select cast(BranchCode as varchar(50)) as BranchCode from inserted)
                    end
      commit tran
      end
      else
          commit tran
      end
    return

    作用就是判断是否有此批号的商品,如果有则直接增加其数量,没有则新增一条记录。
    问题是现在有一批量插入语句:
    INSERT INTO Barn_Branch(......)select ....... from tab
    执行时触发器无效。查帮助上面讲:在写触发器代码时需要考虑的一个重要问题就是,引发触发器的语句可以是一个影响多行的单一语句,而不仅是影响一行。这在 UPDATE 和 DELETE 触发器中很常见,因为这些语句经常作用于多行。而这在 INSERT 触发器中就比较少见,因为基本的 INSERT 语句只添加一行。然而,由于 INSERT 触发器可由 INSERT INTO (table_name) SELECT 语句激发,所以插入许多行可能导致单个的触发器调用。
    求一解决方案。
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 09:40:111楼 得分:0
    SQL code
    --try: CREATE TRIGGER Barn_Branch_IU ON dbo.Barn_Branch instead of INSERT,update AS begin delete Barn_Branch from Barn_Branch a,deleted b where rtrim(ltrim(a.ProBarcode))=b.ProBarcode AND ltrim(rtrim(a.pihao))=b.piao AND ltrim(rtrim(a.BranchCode))=b.BranchCode insert into Barn_Branch select * from inserted end
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 09:43:032楼 得分:0
    哦。理解错楼主的意思了。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 09:43:463楼 得分:0
    影响多行时无效?不可能的,,,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzyyc
    • 等级:
    发表于:2008-05-20 09:47:244楼 得分:0
    不能这样弄啊,原来商品有库存的。删除掉原来库存都没有了。
    它的作用就是有库存则增加数量,没有增加记录。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 09:54:105楼 得分:0
    SQL code
    --这样? CREATE TRIGGER Barn_Branch_IU ON dbo.Barn_Branch instead of INSERT,update AS begin if exists(select 1 from Barn_Branch a where exists(select 1 from inserted where rtrim(ltrim(a.ProBarcode))=ProBarcode AND ltrim(rtrim(a.pihao))=piao AND ltrim(rtrim(a.BranchCode))=BranchCode)) begin update Barn_Branch set Sum_Num=Sum_Num+b.Sum_Num,Pei_Price=Pei_Price+b.Pei_Price from Barn_Branch a,inserted b where rtrim(ltrim(a.ProBarcode))=b.ProBarcode AND ltrim(rtrim(a.pihao))=b.piao AND ltrim(rtrim(a.BranchCode))=b.BranchCode end else insert into Barn_Branch select * from inserted end
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 10:05:496楼 得分:0
    UPDATE Barn_Branch
    SET  Sum_Num=Sum_Num+i.Sum_Num,
    Pei_Price=i.Pei_Price
    FROM inserted i
    WHERE Barn_Branch.ProBarcode=i.ProBarcode and Barn_Branch.pihao=i.pihao and Barn_Branch.BranchCode=i.BranchCode

    这样试下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzyyc
    • 等级:
    发表于:2008-05-20 10:18:327楼 得分:0
    引用 5 楼 pt1314917 的回复:
    SQL code
    --这样?
    CREATE TRIGGER Barn_Branch_IU ON dbo.Barn_Branch instead of INSERT,update
    AS
    begin
        if exists(select 1 from Barn_Branch a where exists(select 1 from inserted where rtrim(ltrim(a.ProBarcode))=ProBarcode
            AND ltrim(rtrim(a.pihao))=piao AND ltrim(rtrim(a.BranchCode))=BranchCode))
        begin
            update Barn_Branch set Sum_Num=Sum_Num+b.Sum_Num,Pei_Price=Pei_P…

    这个和原来那个的效果是一样的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzyyc
    • 等级:
    发表于:2008-05-20 10:36:308楼 得分:0
    引用 6 楼 gahade 的回复:
    UPDATE Barn_Branch 
    SET  Sum_Num=Sum_Num+i.Sum_Num,
    Pei_Price=i.Pei_Price
    FROM inserted i
    WHERE Barn_Branch.ProBarcode=i.ProBarcode and Barn_Branch.pihao=i.pihao and Barn_Branch.BranchCode=i.BranchCode

    这样试下

    也不行,一次插入多条时还是有重复的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzyyc
    • 等级:
    发表于:2008-05-20 10:37:309楼 得分:0
    看来只有用游标生成多个单条insert 语句了
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved