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';而导致写入相同的主键值当插入多条记录时, 请问应该怎么处理, 如果用游标遍历可以吗? 要怎么修改
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
主键来自 BuildID, 就是第一句update...CROSS JOIN BuildID b WHERE b.Class_Name = 'L...' 这句如果update成功, 从buildID取得的值当作主键值, 自然也就不会出现重复!
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