Development Tip

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

yourdevel 2020. 12. 3. 20:43
반응형

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

반응형