如果公式发生变化,我可以阻止计算列更改它的值吗?

时间:2011-11-21 16:04:12

标签: sql-server

我在MS SQL 2005中有一个计算列,可以进行一些增值税计算。该网站使用的发票只能生成一次,并依赖计算列中的值来计算增值税。

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

tldr; 如何在不重新计算已计算的值的情况下更改计算列的计算?

2 个答案:

答案 0 :(得分:5)

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

计算一次增值税会更简单,更安全,将其存储在一列中,然后不更新该值。您可以使用权限,触发器和/或审核来确保在输入后不会更改该值。

因此,我将添加一个新的非计算列,从计算列复制值并删除计算列(请参阅this question)。当然,除了首先要实际计算值所需的应用程序开发之外。这是一些额外的工作,但既然你发现了一个bug,你还是要修复它。

答案 1 :(得分: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