다양한 RAISERROR 심각도 수준은 무엇을 의미합니까?
제 최고의 구글 결과는 다음과 같습니다.
- 아래 11은 오류가 아닌 경고입니다.
- 11-16 사용 가능
- 16 이상은 시스템 오류입니다.
- 11-16 사이에는 행동 차이가 없습니다.
그러나 BOL에서 "0에서 18까지의 심각도 수준은 모든 사용자가 지정할 수 있습니다."
나의 특정 저장 프로시저에서, 나는 오류를 a로 되돌리기를 원합니다.11-18 사이의 심각도 수준에 상관없이 네트워크 클라이언트 응용프로그램이 유용할 것으로 보입니다.각 레벨이 의미하는 바와 사용 방법에 대한 권위 있는 정보를 가진 사람이 있습니까?
16을 반환해야 합니다.기본적으로 가장 많이 사용되는 오류 수준입니다.
사용자가 수정할 수 있는 일반 오류를 나타냅니다.
리소스 문제와 같은 더 심각한 오류를 나타내는 17-18을 반환하지 마십시오.
사용자가 수정할 수 없는 소프트웨어 오류를 나타냅니다.시스템 관리자에게 문제를 알립니다.
또한 11-15는 각 수준(14 - 보안 액세스, 15 - 구문 오류, 13 - 교착 상태 등)에 특별한 의미가 첨부되어 있으므로 반환하지 마십시오.
레벨 16은 실행을 종료하지 않습니다.
경고를 기록하지만 실행을 계속하려면 10 미만의 심각도 수준을 사용하십시오.
레벨은 다음과 .16 실행을 종료할 수 있습니다.
RAISEROR()가 발생한 TRY-CATCH 경고:
RAISERROR()심각도가 16이면 위반 라인 아래의 모든 항목에 대한 실행이 종료됩니다.
그러나 이것은 Try-Block 내부에서만 적용됩니다.
--DECLARE @DivideByZero Int = 1/0--Uncommenting this will Skip everything below.
RAISERROR (N'Before Try: Raise-Error 16.', 16, 0)--Works.
SELECT 'Before Try: Select.'[Marker]--Works.
BEGIN TRY
RAISERROR (N'Inside Try: Raise-Error 16.', 16, 0)--Not displayed,but sends to Catch-Block.
SELECT 'Inside Try: Select.'[Marker]--Skipped.
END TRY
BEGIN CATCH
RAISERROR (N'Inside Catch: Raise-Error 16.', 16, 0)--Works.
SELECT 'Inside Catch: Select.'[Marker]--Works.
--RETURN --Adding Return will only skip what is After the Catch-Block for this scope only.
--;THROW--Shows the RAISERROR() from the Try-Block and Halts Execution. Must include ";".
END CATCH
RAISERROR (N'After Try-Catch: Raise-Error 16.', 16, 0)--Works.
SELECT 'After Try-Catch: Select.'[Marker]--Works.
저도 요.나도 그랬어요. .
또한 저를 혼란에 빠뜨린 것은 심각도-16이 모두 같지는 않습니다.
맨 위에 있는 Divide-By-Zero 라인의 주석을 제거하면 아래에는 아무것도 실행되지 않습니다.
0으로 나누기 논리는 심각도-16 예외도 생성합니다.
하지만 그것은 던졌을 때와 달리 완전히 멈추는 방식으로 처리됩니다.RAISERROR().
참고: 사용;THROW적절한 Catch-Block 내의 마지막 줄로 사용합니다.
SQL 외용에 대한 .RAISERROR()Try-Block에 의해 트리거된 이벤트입니다.
이렇게 하면 실행이 완전히 중지됩니다.
그; 블록에 할 때 합니다.;THROW.
논리가 캐치 블록의 오류를 제대로 처리하는 경우(그리고 처리를 계속하려는 경우)
그 뒤의 나머지 논리)를 사용하지 않습니다.;THROW.
결론:
SQL-Server-Engine에서 발생한 심각도-16을 혼동하지 않음
사용하여 자신을 키우는 것과 함께.RAISERROR().
모든 의도와 목적(고의적으로 자신의 오류를 던질 때)에 대해 2개의 심각도만 고려합니다.
0(정보 또는 경고용) 및
16(Try-Block 내에서 예외를 처리한 경우 - 캐치-Block으로 킥 아웃).
지금 바로 정보!
참고: 사용 중인 경우RAISERROR()정보 메시지를 표시합니다.
그렇다면 사용할 것을 제안합니다.WITH NOWAIT:
RAISERROR('Read me right now!', 0, 1) WITH NOWAIT
RAISERROR('Read me whenever.' , 0, 1)
DECLARE @WaitSeconds Int = 10
DECLARE @WaitFor DateTime = DATEADD(SECOND, @WaitSeconds, 0)
WAITFOR DELAY @WaitFor
이 기능은 장기 배치 작업 시 특히 유용합니다.
배치 전체에 걸쳐 특정 이정표에 도달함에 따라 상황이 어떻게 진행되는지에 대해 설명합니다.
사용하지 않음WITH NOWAIT언제 정보 메시지가 나타날지 모를 수 있습니다.
이들은 배치 과정에서 간헐적으로 나타나거나 배치가 완료될 때 한꺼번에 나타날 수 있습니다.
언급URL : https://stackoverflow.com/questions/1122925/what-do-the-different-raiserror-severity-levels-mean
'programing' 카테고리의 다른 글
| Nginx Reverse Proxy 뒤에 MongoDB를 설정하는 방법 (0) | 2023.06.28 |
|---|---|
| 'false'를 0으로, 'true'를 1로 변환하는 방법은 무엇입니까? (0) | 2023.06.28 |
| 자바.java.javaClassCastException: oracle.sql입니다.타임스탬프를 java.sql에 캐스트할 수 없습니다.타임스탬프 (0) | 2023.06.28 |
| 로그인에 대한 SQL 쿼리 (0) | 2023.06.28 |
| Meteor.js는 "example.com " 또는 "www.example.com "에 배포합니까? (0) | 2023.06.28 |