Triggereinsatz funktioniert nicht mit insert..select from statement

Wie pro Thema, ist die Trigger-Insert-Operation nicht funktioniert, wenn ich bestimmte datasätze in mcard_list auf der Grundlage unten,

SQL server Trigger-function:

 create trigger cmpnupdatemcard on MP.dbo.mcard_list For Insert AS declare @est_no varchar(100); select @est_no = ins.est_no from inserted ins; if NOt exists ( select * from mcard where est_no = @est_no ) Begin insert into mcard select * from mcard_list where est_no = @est_no delete from mcard_list where est_no=@est_no End Else Begin delete from mcard where est_no = @est_no insert into mcard select * from mcard_list where est_no = @est_no delete from mcard_list where est_no=@est_no End Go Iocmd.execute("insert into mcard_list select '" + m.sample1 + "',sample2 from Table1) -not work. Iocmd.execute("insert into mcard_list select '" + m.sample1 + "','" + sample2 + "') - work. 

Ich habe festgestellt, ob ich die Variable ("sample2") trennen, um von einer anderen Abfrage-Ausführung gespeichert zu werden und wieder zurück zu über Zeile ohne von der Aussage-statement, es wird gut gearbeitet.

Schatz jemand könnte mir helfen, diese zu beheben, wenn ich wieder mit "from" -statement join will. Vielen Dank.

Der Insert-Trigger wird einmal pro statement nicht einmal pro eingefügter Zeile ausgeführt. Sie müssen den Auslöser umschreiben, damit es den Fall behandelt, wo der inserted Pseudotisch mehr als eine Zeile hat.

Häufige SQL server-Fehler – Multi Row DML Trigger

Ihr fundamentaler Fehler ist, dass Sie scheinen zu erwarten, dass der Auslöser einmal pro Zeile gefeuert wird – das ist nicht der Fall in SQL server. Stattdessen schießt der Auslöser einmal pro statement , und die Pseudo-Tabelle Inserted könnte mehrere Zeilen enthalten.

Angesichts der Tatsache, dass diese Tabelle mehrere Zeilen enthalten könnte – welche erwartest du hier?

 select @est_no = ins.est_no from inserted ins; 

Es ist undefiniert – man bekommt den Wert aus einer, beliebigen Zeile in Inserted – und alle anderen Zeilen werden ignoriert.

Sie müssen Ihren gesamten Auslöser mit dem Wissen umschreiben, das Deleted um mehrere Zeilen zu enthalten. Sie müssen mit set-based Operationen arbeiten – erwarten Sie nicht nur eine einzelne Zeile in Inserted !