2010-03-15 2 views
1

나는 try catch 블록을 사용하여 저장 프로 시저를 작성합니다.수동으로 예외를 포착 할 때 시스템 예외가 발생할 수 있습니까?

이제 테이블에 고유 한 열이 있습니다. 내가 중복 값을 삽입하려고 할 때 그것을 제외하고 예외를 throw I는이

처럼 할 수 원하는 어떤 2627.

없는 경우 ((* COL1 = '값')가 true = tblABC에서를 선택 존재) raiseError (2627) - 난 중복 값을 삽입하는 삽입 쿼리를 사용했을 경우 발생했을 시스템 오류가 발생

편집 : 나는 때문에 예외를 처리 증가로 이어지는에 롤백을 얻는다 트랜잭션을 사용하고

ex를 얻은 @@ Identity 값 이전 쿼리에서 사용됨 b4 예외가 발생했습니다.

실제로 삽입되는 b4가 발생할 수있는 예외를 모두 확인하고 싶습니다. 이렇게하려면 if else과 select 문을 사용하여 수동으로 오류를 발생시킬 수있는 예외를 검사 할 것입니다. 여기에 고유 한 키 위반을 잡을 수 있지만 예외가 의도적으로 여기에 던져 질 것입니다 그래서 예외가 발생하지 않습니다. 그래서 예외는 시스템 예외 예 265

이어야합니다. 그리고 어떤 방법이 더 좋을 것입니다, 쿼리를 삽입하거나 검색어를 사용하여 삽입하기 전에 값을 삽입하여 을 사용하고 계십니까?

IT는 SQL 당신은 시스템 오류를 발생시킬 수 없습니다

답변

2

을 던져 것 SAME 예외를 throw 즉 수동 예외 을 잡기 SYSTEM 예외를 올리려면 어쨌든 가능하다. RAISERROR (2627 ...)는 불법입니다. 당신이 거짓말하고 있다는 사실 외에도 (오류 2627이 발생하지 않았다면), 당신은 메시지 형식에 삽입을 놓치고 있습니다.

응용 프로그램은 IDENTITY 연속성에 의존해서는 안되며, 응용 프로그램에 버그가있는 경우 자동 증가가 증가한다는 불만을 토로합니다. IDENTITY 값은 간격을 포함 할 수 있으며 해당 사양의 일부입니다.

무엇이 더 좋고, 삽입하고, 잡으려고하거나 업데이트를 시도 할 것인지는 귀하의 빈번한 패턴에 달려 있습니다. 값이 존재할 가능성이있는 경우, UPDATE 첫 번째 전략이 더 좋습니다. 값이 존재하지 않을 가능성이있는 경우 또는 확률을 알 수없는 경우 성능 및 더 중요하게는 정확성을 이유로 오류를 삽입하고 catch하는 것이 좋습니다 (동시성에서 SELECT 확인이 올바르지 않음).

+0

@Remus Plz 내 편집 답변. 내 Ques에 대한 설명적인 정보를 얻지 못해서 소리 질러 –

+0

편집 후 내 게시물을 업데이트 할 필요가 없습니다. 모든 것이 중요합니다. –

+0

T-SQL의 TRY/CATCH에는 다시 처리 의미가 없습니다. 사용자 정의 유형 (즉, 50000 이상의 오류 코드) * 예외를 던져야합니다. 지저분하지만, T-SQL 예외 처리의 최첨단 기술입니다. –