3

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] 문장 내에 에러를 발생시키는 방법이 있는지 알고 싶다.

나는 이런 식으로 시도했다. 그러나 ThrowCase 문 내에서 호출 할 수 없다는 것을 알았다.

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 

아이디어가 있으십니까?

+1

다른 옵션은 업데이트시 트리거에 의한 잔액을 처리합니다 – Jayvee

+0

전체 테이블을 업데이트하는 경우에도 트리거는 각 행이 아닌 업데이트 명령문에 대해 한 번만 실행됩니다 ... 둘째, 트리거는 모든 행 업데이트되었습니다. 셋째, 트리거는 롤백을 수행 할 수 없습니다. – navigator

+0

나는 던지기를 'ABCD'로 바꾸어 관리했습니다. 이 경우 varchar 변환 오류가 발생하고 업데이트 문이 실패합니다. 나는 커스텀 에러를 원했기 때문에 나는 이것에 대해별로 행복하지 않다. 어쨌든, 지금해야 할 일은 ... – navigator

답변

1

UPDATE 문 내에 사용자 지정 예외를 throw 할 수 없습니다.

  1. 갱신 상에 INSTEAD OF 트리거를 사용하여

    당신은 몇 가지 옵션이 있습니다. 원하는 경우 업데이트가 발생하지 않도록하고, 사용자 지정 오류 등을 throw 할 수 있습니다.
  2. 절차에서 Total + @OpenBal 계산을 수행하고이를 테이블 변수에 삽입합니다. 유효하지 않은 값에 대한 SELECT. 사용자 정의 오류를 던질 수있는 항목이 있으면 찾으십시오. 그렇지 않은 경우 테이블 변수를 필요한 항목으로 결합하여 업데이트하십시오.

잘못된 값을 삽입하는 것은 해킹이며 오류는 저장 프로 시저를 사용하는 모든 사람에게 혼동을 줄 수 있습니다. 코드에 오류가있는 것 같습니다.

나는 조금 궁금해하지만 - 왜 당신은 기호를 별도로 저장하고 다른 값이 동일한 기호를 갖고 있는지 확인하고 싶습니까? 디자인이 비정규 화 된 것처럼 들립니다.

+0

Thanks Eric. 가능한 한 트리거를 피하고 싶었습니다. 하지만 내 유일한 옵션 남아있을 수 있습니다. 테이블 변수는 또 다른 좋은 옵션입니다. 별도로 사인을 보관해야하는 이유 : 회계에서 마이너스 잔액 (예 : 고객의 미수금 계정)을 보유 할 수 있고 마이너스 잔액을 가질 수없는 계정 (예 : 현금 - 손 - 계정).따라서 계정 유형에 따라 결과 잔액이 모두 올바른지 확인해야합니다. – navigator

+0

CHECK 제약 조건을 살펴 보았습니까? CHECK 제한 조건에서 UDF를 사용하면 많은 제약을 가할 수 있습니다. 예를 들어, 여기를보십시오 - http://sqlmag.com/t-sql/using-udf-check-constraint-validate-column – Eric

관련 문제