2016-07-15 3 views
0

Ich habe eine Tabelle wie folgt, initiale Einfügung wird einen Wert hinzufügen "Cur_cost_unit" Feld, wo "Pre_cost_unit" standardmäßig einen Wert von 0 haben wird. Wenn ich "Cur_cost_unit" auf einen neuen Wert aktualisiere, muss "Pre_cost_unit" mit dem alten Wert von "Cur_cost_unit" aktualisiert werden und im Wesentlichen zum historischen Wert von "Cur_cost_unit" werden. Ich muss wissen, ob meine Trigger beide Felder gleichzeitig aktualisieren wird "Cur_cost_unit" immer neuen Wert und Pre_cost_unit“getting historischen Wert "Cur_cost_unit"Sql Trigger, um einen Feldwert in ein anderes Feld in der gleichen Tabelle zu "verschieben"

My Table:

create table [Prod_Cost] 

(
[Ent_id]  int    not null IDENTITY, 
[Prod_name]  nvarchar(50)  not null, 
[Prod_code]  nvarchar(50)  not null UNIQUE, 
[Prod_id]  int    not null CONSTRAINT [PK_PRODUCT_ID] PRIMARY KEY, 
[Cur_cost_unit] money   not null DEFAULT(0), 
[Pre_cost_unit] money   not null DEFAULT(0), 
[Dte_Captured] datetime   not null, 
[Captured_by] char(50)   not null 
); 

Meine Trigger:

CREATE TRIGGER Update_Cur_CostUNIT_2PreV 
ON [Prod_Cost] 

    AFTER UPDATE 
AS 
DECLARE @Cur_cost_unit MONEY; 
DECLARE @Prod_code NVARCHAR(50); 

SELECT @Cur_cost_unit=i.[Cur_cost_unit] FROM inserted i; 
SELECT @Prod_code = i.[Prod_code] from inserted i; 

BEGIN 

SET NOCOUNT ON; 

    BEGIN 
    UPDATE [Prod_Cost] 
    SET [Pre_cost_unit] = (SELECT [Cur_cost_unit] FROM [Prod_Cost] where [Prod_code] = @Prod_code), 
     [Cur_cost_unit] = @Cur_cost_unit 
    END 

END 
GO 

Vielen dank im Voraus

+0

FYI möchten - Trigger sollten die Situation behandeln, in denen mehrere Zeilen auf einmal ändern sind. Es könnte also mehrere Zeilen in den eingefügten und gelöschten Tabellen geben und Ihr Trigger sollte das korrekt behandeln. –

+0

Sie müssen diesen Trigger so anpassen, dass er auf der Basis gesetzt wird und keine skalaren Variablen wie diese verwendet. –

+0

in einem Update-Trigger .. 'deleted' wird die vorherigen Werte haben – JamieD77

Antwort

0

Ich glaube, Sie etwas entlang der Linien von (nicht getestet)

CREATE TRIGGER Update_Cur_CostUNIT_2PreV 
ON [Prod_Cost] 
    AFTER UPDATE 
AS 
    UPDATE Prod_Cost 
    SET Prod_Cost.Pre_cost_unit = deleted.Cur_cost_unit 
    FROM Prod_Cost 
    JOIN deleted 
    ON Prod_Cost.Ent_id = deleted.Ent_id 
+1

Brilliant @IanKenney. Ich habe es genau so wie du es jetzt hast. abgesehen von der ON-Klausel ..., die ich als: ON Prod_Cost.Prod_code = deleted.Prod_code – Christopher

0

Sie nach einem Update suchen können ähnlich wie diese

UPDATE pc 
SET  pc.Pre_cost_unit = d.Cur_cost_unit 
FROM [Prod_Cost] pc 
     JOIN INSERTED i ON i.Ent_id = pc.Ent_id -- new values 
     JOIN DELETED d ON d.Ent_id = i.Ent_id -- previous values 
+0

an JamieD77 danke für den gelöschten Vorschlag, habe nicht darüber nachgedacht. – Christopher

+0

an Sean Lange, sorry, das war ein Tippfehler meinerseits. – Christopher

+0

Nicht sicher, dass Sie wirklich die Verbindung zu INSERTED benötigen, da Sie keine Daten von dort in diesem Beispiel verwenden –

Verwandte Themen