CREATE trigger tr_Order
on [Order]
for insert,update,delete as
begin
IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted) AND EXISTS(SELECT 1 FROM Trade t inner join Inserted i on t.TradeNo=i.OrderNo and t.STATE='WAIT_SELLER_SEND_GOODS')BEGIN
  -- 插入触发.
update BuildID set ClassCurID=ClassCurID+1 where Class_Name='LISTSALEDFT';INSERT INTO ListSaleDft(List_ID,Bill_ID,Stor_ID,Prod_ID,Prod_Number,Prod_ProdDw,Prod_Price,Prod_Money,Discount,DisPrice,DisMoney,DisMoney0,Tax,TaxPrice,TaxMoney,TaxMoney0,Prod_Order,pDW_Ratio,pDW_Num,CostPrice,CostMoney,InorOut,Prod_DDID,tmpSyb,TeamNo,DZSign,ZS_Syb,Retail_Price,DiffMoney,JSMoney,JSNumber,WriteJSBill,ZeroSyb,UseVIPSyb,DWRatio,ProdQuantity,BaseIntegralMoney,BaseIntegral,BigNum,MidNum,LetNum,Re4,Re5,Free1,Free2,JSNumber_1,JSMoney_1,THNumber_1,LowMoney,UpIntegral,ArriveNumber,ArriveMoney,MDList_ID
) SELECT b.ClassCurID,m.s_ID,496,p.s_ID,i.DealCount,p.ProdDW,i.DealPrice,i.DealCount*i.DealPrice as Expr1,round((i.DealPrice-i.DiscountFee)/i.DealPrice,2)*100 as Expr2,i.DealPrice-i.DiscountFee as Expr3,i.DealCount*(i.DealPrice-i.DiscountFee) as Expr4,i.DealCount*DiscountFee as Expr4,0,i.DealPrice-i.DiscountFee as Expr5,(i.DealPrice-i.DiscountFee)*i.DealCount as Expr6,0,0,1,i.DealCount,0,0,1,-1,0,-1,0,0,p.PrePrice6,0,(i.DealPrice-i.DiscountFee)*i.DealCount as Expr7,i.DealCount,0,0,1,ltrim(i.DealCount)+'.00'+d.u_Name+'='+ltrim(i.DealCount)+'.00'+d.u_Name as Expr8,ltrim(i.DealCount)+'.00'+d.u_Name as Expr9,0,0,i.DealCount,0,0,0,0,-1,-1,0,0,0,0,0,0,0,-1
FROM ((inserted i inner join MasterBillDft m on i.OrderNo=m.BillSN) left join Product p on i.SellCode=p.u_code) left join CommonInfo d on p.ProdDW = d.s_ID CROSS JOIN BuildID b WHERE b.Class_Name = 'LISTSALEDFT';update MasterBillDft set SumNumber=SumNumber+i.dealcount,SumMoney=SumMoney+(i.DealPrice-i.DiscountFee)*i.Dealcount from Inserted i where BillSN=i.OrderNo; 
END;end当测试插入一条记录, 成功执行上面的触发器, 当插入两条记录, 如下: 
insert into [Order](TradeId,OrderNo,ItemCode,SellCode,StockCode,ItemName,GoodsPicUrl,DealPrice,AdjustPrice,DiscountFee,DealCount,RefundState,OriginalName,Status)
select 72,'122453956090189','12270134701','SP1101094G','SP1101094G','茶具摆件','http://',165,0,0,1,'NO_REFUND','茶具摆件','WAIT_BUYER_CONFIRM_GOODS' union all
select 72,'122453956090189','12270134701','SP1101094G','SP1101094G','茶具摆件','http://',165,0,0,1,'NO_REFUND','茶具摆件','WAIT_BUYER_CONFIRM_GOODS'
go则出现如下错误:
服务器: 消息 2627,级别 14,状态 1,过程 tr_Order,行 23
违反了 PRIMARY KEY 约束 'PK_ListSaleDft'。不能在对象 'ListSaleDft' 中插入重复键。
语句已终止。出现上面的错误原因是没有执行update BuildID set ClassCurID=ClassCurID+1 where Class_Name='LISTSALEDFT';而导致写入相同的主键值当插入多条记录时, 请问应该怎么处理, 如果用游标遍历可以吗? 要怎么修改

解决方案 »

  1.   

    FROM ((inserted i inner join MasterBillDft m on i.OrderNo=m.BillSN) left join Product p on i.SellCode=p.u_code) left join CommonInfo d on p.ProdDW = d.s_ID CROSS JOIN BuildID b WHERE b.Class_Name = 'LISTSALEDFT';在这里无论是join还是left join楼主能保证主表的记录不会重复出现么,指的是主键记录。
      

  2.   

    在触发器里用游标,逐笔处理inserted的记录.
      

  3.   

    主键记录不能重复出现, 就是在同一张单上不能出现相同的编号之类的 这样你可以插入
    insert into [Order](TradeId,OrderNo,ItemCode,SellCode,StockCode,ItemName,GoodsPicUrl,DealPrice,AdjustPrice,DiscountFee,DealCount,RefundState,OriginalName,Status)
    select 72,'122453956090189','12270134701','SP1101094G','SP1101094G','茶具摆件','http://',165,0,0,1,'NO_REFUND','茶具摆件','WAIT_BUYER_CONFIRM_GOODS' union all
    select 72,'122453956090188','12270134701','SP1101094G','SP1101094G','茶具摆件','http://',165,0,0,1,'NO_REFUND','茶具摆件','WAIT_BUYER_CONFIRM_GOODS'
    go
      

  4.   


    主键来自 BuildID, 就是第一句update...CROSS JOIN BuildID b WHERE b.Class_Name = 'L...' 这句如果update成功, 从buildID取得的值当作主键值, 自然也就不会出现重复!
      

  5.   

    try this,CREATE trigger tr_Order
    on [Order]
    for insert,update,delete as
    beginIF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted) AND EXISTS(SELECT 1 FROM Trade t inner join Inserted i on t.TradeNo=i.OrderNo and t.STATE='WAIT_SELLER_SEND_GOODS')
    BEGIN
    -- 插入触发.select * into #tem_Order1 from inserted where 1=2
    select * into #tem_Order2 from insertedwhile exists(select 1 from #tem_Order2)
    begin
      insert into #tem_Order1 select top 1 * from #tem_Order2
      
      delete top (1) from #tem_Order2  update BuildID set ClassCurID=ClassCurID+1 where Class_Name='LISTSALEDFT';  INSERT INTO ListSaleDft(List_ID,Bill_ID,Stor_ID,Prod_ID,Prod_Number,Prod_ProdDw,Prod_Price,Prod_Money,Discount,DisPrice,DisMoney,DisMoney0,Tax,TaxPrice,TaxMoney,TaxMoney0,Prod_Order,pDW_Ratio,pDW_Num,CostPrice,CostMoney,InorOut,Prod_DDID,tmpSyb,TeamNo,DZSign,ZS_Syb,Retail_Price,DiffMoney,JSMoney,JSNumber,WriteJSBill,ZeroSyb,UseVIPSyb,DWRatio,ProdQuantity,BaseIntegralMoney,BaseIntegral,BigNum,MidNum,LetNum,Re4,Re5,Free1,Free2,JSNumber_1,JSMoney_1,THNumber_1,LowMoney,UpIntegral,ArriveNumber,ArriveMoney,MDList_ID
      ) 
      SELECT b.ClassCurID,m.s_ID,496,p.s_ID,i.DealCount,p.ProdDW,i.DealPrice,i.DealCount*i.DealPrice as Expr1,round((i.DealPrice-i.DiscountFee)/i.DealPrice,2)*100 as Expr2,i.DealPrice-i.DiscountFee as Expr3,i.DealCount*(i.DealPrice-i.DiscountFee) as Expr4,i.DealCount*DiscountFee as Expr4,0,i.DealPrice-i.DiscountFee as Expr5,(i.DealPrice-i.DiscountFee)*i.DealCount as Expr6,0,0,1,i.DealCount,0,0,1,-1,0,-1,0,0,p.PrePrice6,0,(i.DealPrice-i.DiscountFee)*i.DealCount as Expr7,i.DealCount,0,0,1,ltrim(i.DealCount)+'.00'+d.u_Name+'='+ltrim(i.DealCount)+'.00'+d.u_Name as Expr8,ltrim(i.DealCount)+'.00'+d.u_Name as Expr9,0,0,i.DealCount,0,0,0,0,-1,-1,0,0,0,0,0,0,0,-1
      FROM ((#tem_Order1 i inner join MasterBillDft m on i.OrderNo=m.BillSN) left join Product p on i.SellCode=p.u_code) left join CommonInfo d on p.ProdDW = d.s_ID CROSS JOIN BuildID b WHERE b.Class_Name = 'LISTSALEDFT';  update MasterBillDft set SumNumber=SumNumber+i.dealcount,SumMoney=SumMoney+(i.DealPrice-i.DiscountFee)*i.Dealcount from #tem_Order1 i where BillSN=i.OrderNo; 
      
      truncate table #tem_Order1
    endEND;end