2016-07-15 26 views
0

我有一個表如下,初始插入將向「Cur_cost_unit」字段添加一個值,其中「Pre_cost_unit」默認值爲0。當我將「Cur_cost_unit」更新爲新值時,需要用「Cur_cost_unit」的舊值更新「Pre_cost_unit」,本質上成爲「Cur_cost_unit」的歷史值。我需要知道,如果我的觸發器將在同一時間,「Cur_cost_unit」獲得新的價值和Pre_cost_unit」獲得的歷史價值‘Cur_cost_unit’更新這兩個領域Sql觸發器將字段值「移動」到同一個表上的另一個字段

我的表:

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 
); 

我的觸發方式:

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 

提前感謝

+0

僅供參考 - 觸發器應該處理的情況下多行是一次改變。所以在插入和刪除的表中可能有多行,你的觸發器應該正確處理。 –

+0

您需要重新設置此觸發器以設置爲基礎,而不是使用像這樣的標量變量。 –

+0

在更新觸發器中。'deleted'將具有以前的值 – JamieD77

回答

0

我想你可能想沿着線(未測試)的東西

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

輝煌@IanKenney。我擁有它,就像你現在一樣。除了ON子句..我有:ON Prod_Cost.Prod_code = deleted.Prod_code – Christopher

0

你可能會尋找類似這樣

更新
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

,沒有想過這個。給肖恩蘭格的 – Christopher

+0

,對不起,這是我的一個錯字。 – Christopher

+0

不確定你真的需要加入INSERTED,因爲你在這個例子中沒有使用任何數據 –

相關問題