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 또는 @Neg
매개 변수가 비 제로의 경우 1
, 나는 [email protected]
값의 부호가되는 경우 SP가 실패 할 updated가 @Neg
매개 변수의 부호와 일치하지 않습니다.
예를 들어 @Neg
이 1이면 Balance
은 항상 양수 여야하며 모든 행에서 음수가되면 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'로 바꾸어 관리했습니다. 이 경우 varchar 변환 오류가 발생하고 업데이트 문이 실패합니다. 나는 커스텀 에러를 원했기 때문에 나는 이것에 대해별로 행복하지 않다. 어쨌든, 지금해야 할 일은 ... – navigator