2017-12-29 3 views
0

Im Folgenden sind Spalten in meiner Tabelle Table1:Wie aktualisiert man eine Spalte in einer Tabelle im UPDATE-Trigger derselben Tabelle?

Id(identity), Field1(VARCHAR), Field2(VARCHAR), Field3(CHAR) 

Ich habe Trigger auf UPDATE von Field1 dieser Tabelle:

CREATE TRIGGER [dbo].[My_TRG] ON [dbo].[Table1] 
FOR UPDATE 
NOT FOR REPLICATION 
AS 
DECLARE @Id INT... 
..... 
..... 
BEGIN 
..... 
SELECT @Id = Id FROM Inserted 
UPDATE [Table1] SET [Field3] = 'NEW' WHERE [Field3] IS NULL AND [email protected] 
..... 
..... 
END 

So bin Aktualisierung ich andere Spalte derselben Tabelle für denselben Datensatz, der ist in UPDATE-Trigger aktualisiert werden. @Id im obigen Trigger ist der Bezeichner des Datensatzes, der gerade aktualisiert wird.

Die UPDATE-Anweisung war früher nicht da und Trigger funktionierte gut. Jetzt muss ich diese UPDATE-Anweisung im Trigger hinzufügen.

Es wirft folgende Ausnahme:

Zeile kann nicht für die Aktualisierung gefunden werden. Einige Werte wurden seit dem letzten Lesen geändert.

Ich kann den Standardwert für Field3 nicht festlegen. Field3 sollte NUR WENN Field1 gesetzt sein. Andernfalls sollte es null sein.

Wie soll ich das machen?

+0

Möchten Sie nur einen Standard hinzufügen? dann benutze einen Standard! https://www.w3schools.com/sql/sql_default.asp –

+1

Beachten Sie, dass ausgelöst wird * einmal pro Anweisung *, nicht * einmal pro Zeile *. Dies bedeutet, dass Sie Code schreiben müssen, der mit 0, 1 oder * multiple * Zeilen umgehen kann, die aktualisiert wurden. (Bezieht sich vielleicht nicht auf Ihr aktuelles Problem, aber es lohnt sich, daran zu denken) –

+0

Das ist nicht, was Ihr Auslöser tut. Wie auch immer ... warum benutzt du keine berechnete Spalte? –

Antwort

1

Ihre Trigger sollten alle Zeilen aktualisieren, während Sie Ihren Code (wenn Sie es funktioniert) nur 1 Zeile aktualisieren, so dass Sie Ihren Tisch mit INSERTED Tabelle müssen sich registrieren, und CASE expressin verwenden zu überprüfen, ob die Column3 IS NOT NULL und NULL ersetzen Wert mit 'NEW':

UPDATE Tbl 
SET Column1 = I.Column1, 
    Column2 = I.Column2, 
    Column3 = (CASE WHEN I.Column3 IS NOT NULL THEN 'NEW' END) 
FROM Table1 Tbl INNER JOIN INSERTED I ON Tbl.ID = I.ID; 
Verwandte Themen