2016-10-28 5 views
0

wie kann ich diesen Code ändern, um mit mehrreihige Update zu arbeiten. @ Id int und order_id ist Primärschlüssel, aber ich möchte jede Zeile überprüfen, die STATUS_B hat = ‚verpackt‘mehrreihige Update Update-Trigger

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 

Antwort

2

sehen nicht den Zweck (Bus. Regel) Ihren Trigger in erster Linie zu verstehen.

wenn conntion mit großen Abfrage nicht erforderlich ist.Sie ​​können den gleichen Beitritt und Bedingung in direkten Update Staement binden, auf diese Weise können mehrere orderid executed und Leistung wird in Ordnung sein> diese Abfrage möglicherweise Bug, den Sie hv zu beheben Es ist aber etwas ähnliches.

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

sollten Sie' C.STATUS_B = 'BAGGED'' in der 'WHERE' Klausel – MtwStark

+0

' auf a.id = hinzufügen c.oid 'not' b.oid', links sinkend beitritt als b 3 Zeile später und 'c.status_b = 'sacked' in where Klausel @KumarHarsh –

0

Probieren Sie all Auftrags-ID aus inserted nehmen und in temporärer Tabelle einfügen und tun Sie Ihre Operationen

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

das wird nicht funktionieren, '(SELECT STATUS_B FROM INSERTED-) = 'BAGGED'' wird mehr als eine Zeile zurückgeben, und es wird eine Ausnahme – MtwStark

+0

@MtwStark Benutzer ausgelöst wurde sofort für die Verarbeitung aller angeforderten Zeilen so war ich Der gesamte Code des Benutzers wurde nicht überprüft. Ja, wie Sie sagten, es wird eine Ausnahme auslösen. Der Benutzer muss das mit der Klausel If Exists behandeln. Ich werde diese Änderung machen – Buddi

+0

@MtwStark Upadted mein Beitrag. – Buddi

Verwandte Themen