使用触发器使用两个表中的列计算列值

时间:2014-03-12 12:33:18

标签: sql sql-server

我想创建一个触发器来计算下表中的'totalPrice'列

 create table materialPriceAndStandard (
 id int identity(700,3),
 materialName nvarchar(100) not null default (0),
 unitPrice decimal(19,2) not null default (0),
 carbohydrate tinyint not null default (0),
 protein tinyint not null default (0),
 fat tinyint not null default (0),
 humidity tinyint not null default (0) ,
 minerals tinyint not null default (0),
 totalPrice decimal(19,2) default(0),
 constraint PK_id_materialPriceAndStandard primary key (id),
 constraint UQ_materialName_materialPriceAndStandard unique (materialName), 
 constraint CHECK_totlaMineralAmount check
 (carbohydrate + protein + fat + humidity + minerals  =100 ))   

这是触发器:

create trigger totalPrice 
ON materialPriceAndStandard
AFTER insert
as 
begin 
MaterialPriceAndStandard.totalPrice =
((select _weight from ingredients where
ingredients.material = 
materialPriceAndStandard.materialName * materialPriceAndStandard.unitPrice))
end

但是我得到了syntax error,我应该如何使用totalPrice表中的“_weight”列编写触发器以计算“ingredients”的值。 / p>

totalPrice = _weight * unitPrice。  _weight属于成分表 unitPrice属于materialPriceAndStandard

1 个答案:

答案 0 :(得分:1)

您需要使用适当的T-SQL来处理更新。尝试这样的事情:

CREATE TRIGGER totalPrice 
ON materialPriceAndStandard
AFTER insert
AS BEGIN
    UPDATE mp
    SET mp.totalPrice = SUM(ing._weight) * mp.unitPrice
    FROM dbo.MaterialPriceAndStandard mp
    INNER JOIN Inserted i ON mp.ID = i.ID   -- make sure to update *only* those new rows!
    INNER JOIN dbo.Ingredients ing ON mp.ID = ing.ID
END 

另外:您当前的代码(对我来说)非常不清楚如何加入两个表格,如何计算TotalPrice价格是你的 _weight 的总和?!?!?!?看起来很奇怪.....) - 你可能需要适应这个。

另外:我可能不会在触发器中执行此操作 - 如果某些内容更新会发生什么? _weight dbo.IngredientsTotalPrice更改后会发生什么?您是否也必须更新TotalPrice列?为什么不在你真正需要的时候计算{{1}} - 例如在视图中或在报告工具上。