source

SQL Server 2000: 저장 프로시저를 종료하는 방법은 무엇입니까?

lovecheck 2023. 7. 6. 22:20
반응형

SQL Server 2000: 저장 프로시저를 종료하는 방법은 무엇입니까?

저장 프로시저를 중간에 종료하려면 어떻게 해야 합니까?

(디버깅을 시도하는 동안) 일찍 구제하고 싶은 저장 프로시저가 있습니다.전화해 봤어요RETURN그리고.RAISERRORSP는 계속 작동합니다.

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

반응형