我正在運行SP來更新帳戶中的餘額。下面是SP代碼:更新聲明中的升級錯誤
CREATE procedure UpdateBalance(@LedgerID as int,@TransDate as DateTime,@Neg as smallint) as
Begin
Declare @OpenBal as decimal(12,2)
Select Top 1 @OpenBal=Balance From Trans Inner Join TransGroup On Trans.TGID=TransGroup.TGID And TransDate<@TransDate Where [email protected] Order By TransDate,TransGroup.TGID;
With CTE as
(Select TransGroup.TGID,LedgerID,Amount,Balance,Sum(Amount) Over(Order By TransDate,TransGroup.TGID) as 'Total' From Trans Inner Join TransGroup On Trans.TGID=TransGroup.TGID And TransDate>[email protected] Where [email protected])
Update CTE Set [email protected]
End
的SP運行正常,並從@TransDate
開始更新帳戶的餘額。
的@Neg
參數是當前未用並且將具有的任值爲0,-1或1
如果@Neg
參數爲非零,我想和SP如果[email protected]
值的符號爲失敗已更新與@Neg
參數的符號不匹配。
例如,如果@Neg
爲1,則Balance
應始終爲正值,如果SP在任何行變爲負值,則SP應該失敗。
當然,一個簡單的解決方案是將Update語句放入事務中,運行Select語句來檢查負餘額,然後相應地提交或回滾事務。但我想知道是否有辦法在Update CTE Set [email protected]
聲明中引發錯誤,以便它自動回滾所有內容。
我嘗試了這樣的事情 - 但得知Throw
無法在Case
聲明中調用。
Update CTE Set Balance=Case @Neg When 0 Then [email protected] When 1 Then Case When [email protected]<0 Then Throw Else [email protected] End When -1 Then Case When [email protected]<0 Then Throw Else [email protected] End End
任何想法?
另一種選擇是通過更新觸發器處理餘額 – Jayvee
觸發器只會針對更新語句運行一次,而不是針對每一行 - 即使您正在更新整個表...其次,觸發器將在所有行已更新。第三,觸發器不能執行回滾。 – navigator
好的。我用'ABCD'代替了Throw。這將導致varchar轉換錯誤,並且更新語句將失敗。我對此並不滿意,因爲我想要一個自定義錯誤。無論如何,它將不得不現在做... – navigator