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 뒤에 오는 문은 실행되지 않습니다.
편집증에서 나는 예를 들어 보았고 PRINT를 출력하고 즉시 실행을 중지합니다.
심각도를 20 이상으로 지정하지 않으면 raiserror
실행이 중지되지 않습니다. MSDN 설명서를 참조하십시오 .
일반적인 해결 방법은 return
다음마다 raiserror
다음 을 포함하는 것입니다 .
if @whoops = 1
begin
raiserror('Whoops!', 18, 1)
return -1
end
에 넣어 TRY/CATCH
.
RAISERROR가 TRY 블록에서 심각도 11 이상으로 실행되면 제어가 관련 CATCH 블록으로 전달됩니다.
참조 : MSDN .
편집 : 이것은 MSSQL 2005+에서 작동하지만 이제 MSSQL 2000에서 작업하고 있음을 명확히했습니다. 참고 용으로 여기에 남겨 두겠습니다.
RETURN
저장 프로 시저에서 무조건 반환되지 않는 이유를 알아 냈습니다 . 내가 보는 오류는 저장 프로 시저가 실행될 때가 아니라 컴파일 되는 동안 입니다.
가상의 저장 프로 시저를 고려하십시오.
CREATE PROCEDURE dbo.foo AS
INSERT INTO ExistingTable
EXECUTE LinkedServer.Database.dbo.SomeProcedure
이 표준 절차에 오류가 포함되어 있어도 (객체에 열 수가 다르거 나 테이블에 타임 스탬프 열이 있거나 저장 프로 시저가 존재하지 않기 때문일 수 있음) 여전히 저장할 수 있습니다. 연결된 서버를 참조하므로 저장할 수 있습니다.
But when you actually execute the stored procedure, SQL Server then compiles it, and generates a query plan.
My error is not happening on line 114, it is on line 114. SQL Server cannot compile the stored procedure, that's why it's failing.
And that's why RETURN
does not return, because it hasn't even started yet.
This works over here.
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
Returns
before raiserror
Msg 50000, Level 18, State 1, Procedure Archive_Session, Line 7
this is a raised error
This seems like a lot of code but the best way i've found to do it.
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
Its because you have no BEGIN
and END
statements. You shouldn't be seeing the prints, or errors running this statement, only Statement Completed
(or something like that).
참고URL : https://stackoverflow.com/questions/1862871/sql-server-2000-how-to-exit-a-stored-procedure
'Development Tip' 카테고리의 다른 글
서비스 내에서 $ watch? (0) | 2020.12.03 |
---|---|
파이썬 문자열의 첫 번째와 마지막 문자 확인 (0) | 2020.12.03 |
if 문에 상수를 먼저 넣는 이유는 무엇입니까? (0) | 2020.12.03 |
KnockoutJS의 숫자 서식 규칙 (0) | 2020.12.03 |
연결 호출을위한 모의 또는 스텁 (0) | 2020.12.03 |