SQL Server 2000: 저장 프로시저를 종료하는 방법은 무엇입니까?
저장 프로시저를 중간에 종료하려면 어떻게 해야 합니까?
(디버깅을 시도하는 동안) 일찍 구제하고 싶은 저장 프로시저가 있습니다.전화해 봤어요RETURN
그리고.RAISERROR
SP는 계속 작동합니다.
CREATE PROCEDURE dbo.Archive_Session @SessionGUID uniqueidentifier AS
print 'before raiserror'
raiserror('this is a raised error', 18, 1)
print 'before return'
return -1
print 'after return'
[snip]
아래쪽에서 오류가 발생하기 때문에 계속 실행되는 것을 알고 있습니다.지문이 하나도 안 보이네요저장 프로시저의 대부분을 설명하면 다음과 같습니다.
CREATE PROCEDURE dbo.Archive_Session @SessionGUID uniqueidentifier AS
print 'before raiserror'
raiserror('this is a raised error', 18, 1)
print 'before return'
return -1
print 'after return'
/*
[snip]
*/
그러면 오류가 발생하지 않고 다음과 같은 결과가 표시됩니다.
before raiserror
Server: Msg 50000, Level 18, State 1, Procedure Archive_Session, Line 5
this is a raised error
before return
문제는 SQL Server의 저장 프로시저를 어떻게 활용할 수 있느냐는 것입니다.
사용할 수 있습니다.RETURN
저장 프로시저 실행을 즉시 중지합니다.온라인 북스에서 인용한 인용문:
쿼리 또는 프로시저에서 무조건 종료합니다.RETURN은 즉시 완료되며, 프로시저, 배치 또는 문 블록을 종료하기 위해 언제든지 사용할 수 있습니다.RETURN 뒤에 오는 문은 실행되지 않습니다.
편집증에서, 저는 당신의 예를 시도했고 그것은 PRINTs를 출력하고 실행을 즉시 중지합니다.
20 이상의 심각도를 지정하지 않는 한,raiserror
실행을 중지하지 않습니다.MSDN 설명서를 참조하십시오.
일반적인 해결 방법은 다음을 포함하는 것입니다.return
나중에raiserror
:
if @whoops = 1
begin
raiserror('Whoops!', 18, 1)
return -1
end
집어넣어요TRY/CATCH
.
RAISEROR가 TRY 블록에서 심각도 11 이상으로 실행되면 관련 CATCH 블록으로 제어 권한을 전송합니다.
참조: MSDN.
편집: 이것은 MSSQL 2005+에 대해 작동하지만, 이제 MSSQL 2000에서 작업 중이라는 것을 명확히 했습니다.참고할 수 있도록 이것을 여기에 두겠습니다.
나는 그 이유를 알아냈습니다.RETURN
저장 프로시저에서 무조건 반환되는 것은 아닙니다.오류는 저장 프로시저가 컴파일되는 동안이지 실행되는 동안이 아닙니다.
가상 저장 프로시저를 고려합니다.
CREATE PROCEDURE dbo.foo AS
INSERT INTO ExistingTable
EXECUTE LinkedServer.Database.dbo.SomeProcedure
이 stord 프로시저에 오류(개체의 순열 수가 다르거나 테이블에 타임스탬프 열이 있거나 저장 프로시저가 없을 수 있음)가 있더라도 저장할 수 있습니다.연결된 서버를 참조하고 있으므로 저장할 수 있습니다.
그러나 실제로 저장 프로시저를 실행하면 SQL 서버가 이를 컴파일하고 쿼리 계획을 생성합니다.
제 오류가 114행에서 발생한 것이 아니라 114행에서 발생한 것입니다. SQL Server가 저장 프로시저를 컴파일할 수 없기 때문에 오류가 발생하고 있습니다.
그리고 그것이 이유입니다.RETURN
아직 시작하지도 않았기 때문에 돌아오지 않습니다.
여기서 할 수 있어요.
ALTER PROCEDURE dbo.Archive_Session
@SessionGUID int
AS
BEGIN
SET NOCOUNT ON
PRINT 'before raiserror'
RAISERROR('this is a raised error', 18, 1)
IF @@Error != 0
RETURN
PRINT 'before return'
RETURN -1
PRINT 'after return'
END
go
EXECUTE dbo.Archive_Session @SessionGUID = 1
돌아온다
before raiserror
Msg 50000, Level 18, State 1, Procedure Archive_Session, Line 7
this is a raised error
이것은 많은 코드처럼 보이지만 제가 찾은 최선의 방법입니다.
ALTER PROCEDURE Procedure
AS
BEGIN TRY
EXEC AnotherProcedure
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
RETURN --this forces it out
END CATCH
--Stuff here that you do not want to execute if the above failed.
END --end procedure
에게 없때기문니다입이 입니다.BEGIN
그리고.END
진술들.이 문을 실행하는 중인 인쇄물이나 오류가 표시되어서는 안 됩니다.Statement Completed
(또는 그와 비슷한 것).
언급URL : https://stackoverflow.com/questions/1862871/sql-server-2000-how-to-exit-a-stored-procedure
'source' 카테고리의 다른 글
IIS7 - 요청 필터링 모듈이 요청 내용 길이를 초과하는 요청을 거부하도록 구성되었습니다. (0) | 2023.07.06 |
---|---|
SharePoint 사이트에서 Excel 파일 열기 (0) | 2023.07.06 |
Python Pandas에서 데이터 프레임에서 두 값 사이의 행을 선택하는 방법은 무엇입니까? (0) | 2023.07.06 |
"이 작업을 수행하려면 IIS 통합 파이프라인 모드가 필요합니다." (0) | 2023.07.06 |
그룹화 기능(적용, 기준, 집계) 및 *적용 제품군 (0) | 2023.07.06 |