SQL Server의 배치 중단 오류 목록


9

SQL Server에서 XACT_ABORT가 해제되어 있으면 일부 오류가 현재 명령문을 종료하고 (예 : 일부 매개 변수를 사용하는 저장 프로 시저에 잘못된 수의 매개 변수를 제공) 일부 오류는 전체 배치를 중단합니다 (예 : 저장된 매개 변수를 제공하는 매개 변수) 매개 변수를 사용하지 않는 절차). [참조] : http://www.sommarskog.se/error-handling-I.html#scope-abortion .

내가 알고 싶은 것은 배치 중단 중 어떤 오류가 중단되고 문이 종결되는지에 대한 결정적인 목록이 있는지 여부입니다.

답변:


6

몇 가지 예외가 있다고 생각하지만 MSDN (Database Engine Error Severities)의 경우는 다음과 같습니다.

심각도가 19 이상인 오류 메시지는 현재 배치 실행을 중지합니다.

연결이 종료되면 실행이 중단되므로 일반적으로 심각도가 20에서 25 사이 인 데이터베이스 연결을 종료하는 오류는 CATCH 블록에서 처리되지 않습니다.

따라서 다음 쿼리에서 결정적인 목록을 얻을 수있는 것 같습니다 (물론 사용자 T-SQL로 인해 발생할 수있는 목록을 필터링 할 수는 없습니다).

SELECT message_id, severity, [text]
FROM sys.messages
WHERE language_id = 1033 
AND severity >= 19
ORDER BY severity, message_id;

SQL Server 2012에서는 210 개의 행이 생성됩니다.

SQL Server 2016에서는 256 개의 행이 생성됩니다.

그런데 질문에 설명하는 두 가지 시나리오가 적어도 최신 버전의 SQL Server에서는 생각하지 않은 방식으로 작동한다고 생각하지 않습니다. 나는 2012 년과 2016 년에 이것을 시도했다 (Erland의 기사는 SQL Server 2000 동작에 대해 설명한다고 생각합니다.

USE tempdb;
GO

CREATE PROCEDURE dbo.pA -- no parameters
AS PRINT 1
GO
CREATE PROCEDURE dbo.pB -- two parameters
@x INT, @y INT
AS PRINT 1
GO

SET XACT_ABORT OFF;
GO

EXEC dbo.pA @foo = 1; 
PRINT '### Calling procedure that doesn''t take parameters with a parameter';
GO

EXEC dbo.pB; 
PRINT '### Calling procedure that takes 2 parameters with no parameters';
GO

EXEC dbo.pB @x = 1; 
PRINT '### Calling procedure that takes 2 parameters with not enough parameters';
GO

EXEC dbo.pB @x = 1, @y = 2, @z = 3; 
PRINT '### Calling procedure that takes 2 parameters with too many parameters';
GO

이들은 모두 심각도 레벨 16의 오류를 생성하며 인쇄 출력에 의해 증명 된대로 일괄 처리로 진행됩니다.

메시지 8146, 수준 16, 상태 2, 절차 pA, 11 행
절차 pA에는 매개 변수가없고 인수가 제공되었습니다.
### 매개 변수
Msg 201, Level 16, State 4, Procedure pB, Line 14
프로 시저 또는 함수 'pB'를 사용하여 매개 변수를 사용하지 않는 호출 프로 시저에는 제공되지 않은 매개 변수 '@x'가 필요합니다.
### 매개 변수없이 2 개의 매개 변수를 사용하는 호출 프로 시저
메시지 201, 수준 16, 상태 4, 프로 시저 pB, 줄 18
프로 시저 또는 함수 'pB'에는 제공되지 않은 매개 변수 '@y'가 필요합니다.
### 매개 변수가 충분하지 않은 2 개의 매개 변수를 사용하는 호출 프로 시저
메시지 8144, 수준 16, 상태 2, 프로 시저 pB, 22 행
프로 시저 또는 함수 pB에 너무 많은 인수가 지정되었습니다.
### 매개 변수가 너무 많은 2 개의 매개 변수를 사용하는 호출 프로 시저

내가 의심했듯이, 코멘트에 언급 된 바와 같이 물론 예외가 있습니다. 변환 실패는 심각도 16이지만 배치를 중단합니다.

SET XACT_ABORT OFF;
SELECT CONVERT (INT, 'foo');
PRINT 'Made it.'; -- no print happens

이번에는 인쇄 결과가 포함되지 않습니다.

메시지 245, 수준 16, 상태 1
varchar 값 'foo'를 데이터 형식 int로 변환 할 때 변환에 실패했습니다.


대단히 감사합니다! 이전의 불일치로 인해 심각도 수준을 지표로 사용할 수 없다고 생각했습니다. 그렇지 않다는 것을 매우 기쁘게 생각합니다.
Jamie Alford

아아! 배치를 중단시키는 심각도 레벨 16 오류가 여전히 있습니다. 내가 선택하고 실행하면 begin tran print @@ TRANCOUNT print convert (int, 'abc') 다음에옵니다 : print @@ TRANCOUNT 레벨 16 오류가 발생하지만 배치가 중단됩니다.
Jamie Alford

BTW, 선언 된 것과 다른 심각도로 예외가 발생한 경우를 발견하면 connect를 통해보고하십시오.
Remus Rusanu

2

@Aaron이 지적한 오류 유형 (예 : 심각도> = 19 및 변환 실패) 외에도 MSDN 페이지에서 TRY ... CATCH에 표시된 다음 유형의 오류 도 일괄 처리를 중단합니다.

다음 유형의 오류는 TRY… CATCH 구문과 동일한 실행 수준에서 발생할 때 CATCH 블록에서 처리되지 않습니다.

  • 배치 실행을 방해하는 구문 오류와 같은 오류를 컴파일하십시오.

  • 지연된 이름 확인으로 인해 컴파일 후 발생하는 오브젝트 이름 확인 오류와 같은 명령문 레벨 재 컴파일 중에 발생하는 오류.

이러한 오류는 일괄 처리, 저장 프로 시저 또는 트리거를 실행 한 수준으로 반환됩니다.

아래 예에서 그 중 세 개는 심각도 레벨 15입니다.

실시 예 1

SET XACT_ABORT OFF;
SELECT @NotDeclared; -- parse error
PRINT 'Do you see me?';

보고:

메시지 137, 수준 15, 상태 2, 줄 2
스칼라 변수 "@NotDeclared"를 선언해야합니다.

실시 예 2

SET XACT_ABORT OFF;
InvalidSQL; -- parse error
PRINT 'Do you see me?';

보고:

메시지 102, 수준 15, 상태 1, 줄 2
'InvalidSQL'근처의 구문이 잘못되었습니다.

실시 예 3

SET XACT_ABORT OFF;
SELECT 1 -- statement preceding THROW not terminated by semicolon
THROW 50505, N'Error, yo', 1; -- parse error
PRINT 'Do you see me?';

보고:

메시지 102, 수준 15, 상태 1, 줄 3
'50505'근처의 구문이 잘못되었습니다.

실시 예 4

SET XACT_ABORT OFF;
SELECT NoSuchColumn FROM sys.objects; -- compilation error
PRINT 'Do you see me?';

보고:

메시지 207, 수준 16, 상태 1, 줄 3
잘못된 열 이름 'NoSuchColumn'입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.