2011-11-21 72 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