2016-07-15 68 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,因为你在这个例子中没有使用任何数据 –

相关问题