2011-11-21 73 views
0

我有一个计算列在MS SQL 2005中做一些增值税计算。该网站使用的发票只能生成一次,并依靠计算列中的值计算增值税。如果公式更改,我是否可以防止计算列更改其值?

不幸的是,发现了一个错误,这意味着增值税的计算结果是几美分。不是一个大问题,但我们无法更改所有先前计算的值中的值,因为这些值需要在发票上兑现。

tldr; 如何更改计算列的计算而不重新计算已经计算的值?

+0

你如何在列上应用计算/公式? – Nonym

回答

5

长话短说,你不能,因为计算列定义适用于表中的所有行。但是为什么你在这里使用计算列呢?如果(当)增值税税率发生变化时,将其应用于商品和服务的规则发生变化,并且发票数量会随着时间的推移而增加,那么作为解决方案,计算列将变得越来越尴尬。

一旦计算增值税,将其存储在一列中,然后只是不更新​​价值将会简单得多并且更安全。您可以使用权限,触发器和/或审计来确保值在输入后不会更改。

因此,我会添加一个新的非计算列,从计算列复制值并删除计算列(请参阅this question)。除此之外,无论您需要做什么应用开发,都可以首先真正计算出这些值。这是一些额外的工作,但是因为你发现了一个错误,你必须修正它。

+0

完全同意。只是我的答案会说。 – starskythehutch

0

如果行上有日期戳,则公式可以根据该值而变化。请注意,您必须删除计算列并重新添加它。这将需要最低限度的集成,但我认为最终你应该计划加盖这个值而不是使用计算。

CREATE TABLE dbo.mytable (low int, high int, insertdate datetime, myavg AS (low + high)/2) ; 

insert into dbo.mytable values (1,10,'10-10-10') 
insert into dbo.mytable values (1,10,'10-10-10') 
insert into dbo.mytable values (2,20,'11-11-11') 

alter table dbo.mytable add myavgplusone as (case when insertdate < '11-1-11' then (low + high)/2 else ((low + high)/2)+1 end) 


select * from dbo.mytable