我有一个包含这些列的表:
每当更新paid
列时,我都需要使用以下计算重新计算remained
debt
减去paid
有人可以帮助我实现这个目标吗?
答案 0 :(得分:4)
您可以考虑使用computed column。
此article具有从头开始创建或添加到现有架构的语法,
ALTER TABLE yourtable ADD remainder AS debt - paid
答案 1 :(得分:4)
给出表
CREATE TABLE [MyTable]
(
MyTablePK int,
debt numeric(10,2),
paid numeric(10,2),
remainder numeric(10,2)
)
以下触发器将重新计算字段剩余
CREATE TRIGGER tMyTable ON [MyTable] FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
UPDATE mt
Set mt.Remainder = mt.Debt - mt.Paid
FROM [MyTable] mt INNER JOIN Inserted i
on mt.MyTablePK = i.MyTablePK
END
你也可以将Remainder定义为Computed persisted列,它具有类似的效果而没有触发器的副作用
答案 2 :(得分:3)
为什么SQL可以为您执行触发器中的计算,并且您不必担心触发器被禁用等等:
CREATE TABLE T (
/* Other columns */
Debt decimal (18,4) not null,
Paid decimal (18,4) not null,
Remained as Debt-Paid
)
这称为计算列
答案 3 :(得分:2)
create trigger DebtPaid
on DebtTable
after insert, update
as if update(paid)
begin
update DebtTable
set remained = inserted.debt - inserted.paid
where customerId = inserted.customerId
end
http://msdn.microsoft.com/en-us/library/ms189799.aspx
http://benreichelt.net/blog/2005/12/13/making-a-trigger-fire-on-column-change/
答案 4 :(得分:1)
计算列可以很好但是它们是在运行中计算的并且不会存储在任何地方,因为执行长计算的大型查询具有物理的非重复值,其中Remained由触发控制可以比计算列更好。
在您的触发器中,记住只更新已更新的行,您可以通过虚拟表访问那些已插入已删除的触发器。