2016-10-28 19 views
0

どのように私は、複数行の更新で動作するようにこのコードを変更することができます。@ idはint型であるとORDER_IDが主キーであるが、私は= status_bたすべての行を確認したいが更新トリガーでマルチ行の更新

select @id=inserted.order_id from inserted; 
if update(status_b) 
    begin 
    if (select status_b from inserted)='bagged' 
    begin 
     if (select o.id 
       from [order] o 
       left join [print] p on o.id=p.order_id 
       left join [laminate] l on l.order_id=o.id 
       left join [slitting] s on s.order_id=o.id 
       left join [bagging] b on b.order_id=o.id 
       where       
          1=(case when (o.printing='دارد' and status_p='printed') or o.printing='ندارد' then 1 end) 
         and 1=(case when (o.lamination='دارد' and status_l1='laminated') or o.lamination='ندارد' then 1 end) 
         and 1=(case when (o.lamination='دارد' and l.layer2<>'' and status_l2='laminated2') or o.lamination='ندارد' then 1 end) 
         and 1=(case when (o.coldseal='دارد' and status_c='coldsealed') or o.coldseal='ندارد' then 1 end) 
         and 1=(case when (o.slitting='دارد' and status_s='slitted') or o.slitting='ندارد' then 1 end) 
         and 1=(case when (o.bagging='دارد' and status_b='bagged') or o.bagging='ندارد' then 1 end) 
         and [email protected]) is not null 
     begin 
     update [order] set [status]='finished' where [email protected] 
     end 
    end 
    end 
「を袋詰め」

答えて

2

あなたの操作を行います以下は試してみてください最初の場所であなたのトリガの目的(バス。ルールを)理解されていない参照してください。

大きなクエリを持つconndtionが必要でない場合は、同じ結合と条件を直接更新ステートメントにバインドすることができます。このように複数のorderidを実行してもパフォーマンスは正常です>このクエリにはバグがあり、しかし、このようなものを試してみてください。

UPDATE A SET [STATUS]='FINISHED' FROM [ORDER] A 
INNER JOIN INSERTED C 
ON A.ID=B.OID 
LEFT JOIN [PRINT] P ON O.ID=P.ORDER_ID 
LEFT JOIN [LAMINATE] L ON L.ORDER_ID=O.ID 
LEFT JOIN [SLITTING] S ON S.ORDER_ID=O.ID 
LEFT JOIN [BAGGING] B ON B.ORDER_ID=O.ID 
WHERE       
1=(CASE WHEN (O.PRINTING='دارد' AND STATUS_P='PRINTED') OR O.PRINTING='ندارد' THEN 1 END) 
AND 1=(CASE WHEN (O.LAMINATION='دارد' AND STATUS_L1='LAMINATED') OR O.LAMINATION='ندارد' THEN 1 END) 
AND 1=(CASE WHEN (O.LAMINATION='دارد' AND L.LAYER2<>'' AND STATUS_L2='LAMINATED2') OR O.LAMINATION='ندارد' THEN 1 END) 
AND 1=(CASE WHEN (O.COLDSEAL='دارد' AND STATUS_C='COLDSEALED') OR O.COLDSEAL='ندارد' THEN 1 END) 
AND 1=(CASE WHEN (O.SLITTING='دارد' AND STATUS_S='SLITTED') OR O.SLITTING='ندارد' THEN 1 END) 
AND 1=(CASE WHEN (O.BAGGING='دارد' AND STATUS_B='BAGGED') OR O.BAGGING='ندارد' THEN 1 END) 
+1

' WHERE'節に 'C.STATUS_B = 'BAGGED''を追加してください。 – MtwStark

+0

' a.id = c.oid'は 'b.oid'ではなく、最後の行をb行目としてバギングし、' c.status_b = 'bagged'' where句で@KumarHarsh –

0

insertedからすべての注文IDを取り、一時テーブルに挿入し、

SELECT INSERTED.ORDER_ID AS OID INTO #TEMP1 FROM INSERTED WHERE STATUS_B='bagged'; 
IF UPDATE(STATUS_B) 
    BEGIN 

     IF (SELECT O.ID 
       FROM [ORDER] O 
       join #temp1 t 
       on t.OID=o.id 
       LEFT JOIN [PRINT] P ON O.ID=P.ORDER_ID 
       LEFT JOIN [LAMINATE] L ON L.ORDER_ID=O.ID 
       LEFT JOIN [SLITTING] S ON S.ORDER_ID=O.ID 
       LEFT JOIN [BAGGING] B ON B.ORDER_ID=O.ID 

       WHERE       
          1=(CASE WHEN (O.PRINTING='دارد' AND STATUS_P='PRINTED') OR O.PRINTING='ندارد' THEN 1 END) 
         AND 1=(CASE WHEN (O.LAMINATION='دارد' AND STATUS_L1='LAMINATED') OR O.LAMINATION='ندارد' THEN 1 END) 
         AND 1=(CASE WHEN (O.LAMINATION='دارد' AND L.LAYER2<>'' AND STATUS_L2='LAMINATED2') OR O.LAMINATION='ندارد' THEN 1 END) 
         AND 1=(CASE WHEN (O.COLDSEAL='دارد' AND STATUS_C='COLDSEALED') OR O.COLDSEAL='ندارد' THEN 1 END) 
         AND 1=(CASE WHEN (O.SLITTING='دارد' AND STATUS_S='SLITTED') OR O.SLITTING='ندارد' THEN 1 END) 
         AND 1=(CASE WHEN (O.BAGGING='دارد' AND STATUS_B='BAGGED') OR O.BAGGING='ندارد' THEN 1 END) 
         ) IS NOT NULL 
     BEGIN 
     UPDATE A SET [STATUS]='FINISHED' FROM [ORDER] A JOIN #TEMP1 C ON A.ID=B.OID 
     END 
    END 
+0

これが動作しなくなり、 '(INSERTED FROM STATUS_Bを選択)= 'BAGGED''は、複数の行が返され、それは例外 – MtwStark

+0

@MtwStarkユーザは一度私があった時にすべての行を処理するために要求した起動しますチェックされていないユーザー全コード。はい、あなたが例外をスローすると言ったように。 If Exists節でそれを処理する必要があります。私はその変更を行います – Buddi

+0

@MtwStark私のポストをUpadted。 – Buddi