복붙노트

[SQL] SQL 서버 - SQL 스크립트의 정지 또는 휴식 실행

SQL

SQL 서버 - SQL 스크립트의 정지 또는 휴식 실행

방법은 "휴식"또는 "종료"명령과 같은 SQL 서버에서 SQL 스크립트의 즉시 정지 실행에 있습니까?

나는 그것이 삽입을하고 시작하기 전에 몇 가지 확인 및 검색을 수행하는 스크립트를 가지고 있고, 검증 또는 조회가 실패하면 나는 정지를 할 수 있습니다.

해결법

  1. ==============================

    1.RAISERROR 방법

    RAISERROR 방법

    raiserror('Oh no a fatal error', 20, -1) with log
    

    이것에 의해 실행되는 스크립트의 나머지 부분을 정지, 접속을 종료합니다.

    가이 방식으로 작동하는 심각도 레벨 20 이상과 WITH LOG 옵션이 모두 필요합니다.

    이 경우에도 예를 들어, GO 문, 함께 작동합니다.

    print 'hi'
    go
    raiserror('Oh no a fatal error', 20, -1) with log
    go
    print 'ho'
    

    당신에게 출력을 제공합니다 :

    hi
    Msg 2745, Level 16, State 2, Line 1
    Process ID 51 has raised user error 50000, severity 20. SQL Server is terminating this process.
    Msg 50000, Level 20, State 1, Line 1
    Oh no a fatal error
    Msg 0, Level 20, State 0, Line 0
    A severe error occurred on the current command.  The results, if any, should be discarded.
    

    '호'는 인쇄되지 않습니다 것을 알 수 있습니다.

    주의 사항 :

    참조 : http://www.mydatabasesupport.com/forums/ms-sqlserver/174037-sql-server-2000-abort-whole-script.html#post761334

    NOEXEC 방법

    GO 문으로 작품에 NOEXEC 설정되어 있는지 또 다른 방법. 이 스크립트의 나머지 부분은 스킵되도록합니다. 이 연결을 종료하지 않습니다,하지만 당신은 실행할 모든 명령 전에 다시 NOEXEC를 끄고해야합니다.

    예:

    print 'hi'
    go
    
    print 'Fatal error, script will not continue!'
    set noexec on
    
    print 'ho'
    go
    
    -- last line of the script
    set noexec off -- Turn execution back on; only needed in SSMS, so as to be able 
                   -- to run this script again in the same session.
    
  2. ==============================

    2.그냥 RETURN을 사용하여 (이것은 내부와 외부 저장 프로 시저를 모두 작동합니다).

    그냥 RETURN을 사용하여 (이것은 내부와 외부 저장 프로 시저를 모두 작동합니다).

  3. ==============================

    3.당신이 SQLCMD 모드를 사용할 수있는 경우, 주문

    당신이 SQLCMD 모드를 사용할 수있는 경우, 주문

    :on error exit
    

    실제로 스크립트를 중지 RAISERROR의 원인이됩니다 (콜론 포함). 예를 들면,

    :on error exit
    
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SOMETABLE]') AND type in (N'U')) 
        RaisError ('This is not a Valid Instance Database', 15, 10)
    GO
    
    print 'Keep Working'
    

    의지 출력 :

    Msg 50000, Level 15, State 10, Line 3
    This is not a Valid Instance Database
    ** An error was encountered during execution of batch. Exiting.
    

    및 배치가 중지됩니다. SQLCMD 모드가 켜져 있지 않은 경우 콜론에 대한 구문 분석 오류가 발생합니다. Unfortuantely,이 스크립트가 SQLCMD 모드없이 실행되는 것처럼 방탄 완전히 아니라, SQL Managment를 스튜디오 바로 과거를도 구문 분석 시간 오류를 바람! 당신이 명령 줄에서 실행하는 경우 그러나,이 괜찮습니다.

  4. ==============================

    4.나는 RAISERROR- SQL은이 목적을 위해 사용할 수있는 IF 문이 사용하지 않을 것입니다. 당신의 검증 및 조회 및 설정 지역 변수를 수행 한 후 문이 삽입 조건부 만드는 경우의 변수의 값을 사용합니다.

    나는 RAISERROR- SQL은이 목적을 위해 사용할 수있는 IF 문이 사용하지 않을 것입니다. 당신의 검증 및 조회 및 설정 지역 변수를 수행 한 후 문이 삽입 조건부 만드는 경우의 변수의 값을 사용합니다.

    당신은 모든 검증 테스트의 변수의 결과를 점검 할 필요가 없다. 당신은 일반적으로 전달 된 모든 조건을 확인하는 하나의 플래그 변수를 사용하여이 작업을 수행 할 수 있습니다 :

    declare @valid bit
    
    set @valid = 1
    
    if -- Condition(s)
    begin
      print 'Condition(s) failed.'
      set @valid = 0
    end
    
    -- Additional validation with similar structure
    
    -- Final check that validation passed
    if @valid = 1
    begin
      print 'Validation succeeded.'
    
      -- Do work
    end
    

    유효성 검사가 더 복잡하더라도, 당신은 단지 최종 검사 (들)에 포함 할 몇 가지 플래그 변수를 필요로한다.

  5. ==============================

    5.SQL 2012+에서는 THROW를 사용할 수 있습니다.

    SQL 2012+에서는 THROW를 사용할 수 있습니다.

    THROW 51000, 'Stopping execution because validation failed.', 0;
    PRINT 'Still Executing'; -- This doesn't execute with THROW
    

    MSDN에서 :

  6. ==============================

    6.나는 모 아니면도 방식으로 스크립트를 실행 트랜잭션 성공적으로 솔루션을 온 / 오프에 NOEXEC을 확장했다.

    나는 모 아니면도 방식으로 스크립트를 실행 트랜잭션 성공적으로 솔루션을 온 / 오프에 NOEXEC을 확장했다.

    set noexec off
    
    begin transaction
    go
    
    <First batch, do something here>
    go
    if @@error != 0 set noexec on;
    
    <Second batch, do something here>
    go
    if @@error != 0 set noexec on;
    
    <... etc>
    
    declare @finished bit;
    set @finished = 1;
    
    SET noexec off;
    
    IF @finished = 1
    BEGIN
        PRINT 'Committing changes'
        COMMIT TRANSACTION
    END
    ELSE
    BEGIN
        PRINT 'Errors occured. Rolling back changes'
        ROLLBACK TRANSACTION
    END
    

    분명히 컴파일러가 오류이고 실행이 중지 된 경우에도 IF에서 @finished 변수를 "이해". 그러나,이 값은 실행이 중지되지 않은 경우에만 1로 설정된다. 따라서 나는 잘 커밋하거나 그에 따라 트랜잭션을 롤백.

  7. ==============================

    7.필요한 경우는 WHILE 루프 및 사용 BREAK에 SQL 문을 래핑 수

    필요한 경우는 WHILE 루프 및 사용 BREAK에 SQL 문을 래핑 수

    WHILE 1 = 1
    BEGIN
       -- Do work here
       -- If you need to stop execution then use a BREAK
    
    
        BREAK; --Make sure to have this break at the end to prevent infinite loop
    END
    
  8. ==============================

    8.당신은 실행하여 GOTO 문의 흐름을 변경할 수 있습니다 :

    당신은 실행하여 GOTO 문의 흐름을 변경할 수 있습니다 :

    IF @ValidationResult = 0
    BEGIN
        PRINT 'Validation fault.'
        GOTO EndScript
    END
    
    /* our code */
    
    EndScript:
    
  9. ==============================

    9.이 저장 프로 시저인가? 그렇다면, 당신이 바로 그러한 "반환 NULL"로 반품을 할 수 있다고 생각;

    이 저장 프로 시저인가? 그렇다면, 당신이 바로 그러한 "반환 NULL"로 반품을 할 수 있다고 생각;

  10. ==============================

    10.또한 refinig Sglasses 방법은, 상기 라인 SQLCMD 모드의 사용을 강요하며 어느 treminates scirpt SQLCMD 모드 사용 또는 사용하지 않는 경우 : 에러에 에러 종료에 출구를 CONTEXT_INFO는 상태를 추적하는 데 사용됩니다.

    또한 refinig Sglasses 방법은, 상기 라인 SQLCMD 모드의 사용을 강요하며 어느 treminates scirpt SQLCMD 모드 사용 또는 사용하지 않는 경우 : 에러에 에러 종료에 출구를 CONTEXT_INFO는 상태를 추적하는 데 사용됩니다.

    SET CONTEXT_INFO  0x1 --Just to make sure everything's ok
    GO 
    --treminate the script on any error. (Requires SQLCMD mode)
    :on error exit 
    --If not in SQLCMD mode the above line will generate an error, so the next line won't hit
    SET CONTEXT_INFO 0x2
    GO
    --make sure to use SQLCMD mode ( :on error needs that)
    IF CONTEXT_INFO()<>0x2 
    BEGIN
        SELECT CONTEXT_INFO()
        SELECT 'This script must be run in SQLCMD mode! (To enable it go to (Management Studio) Query->SQLCMD mode)\nPlease abort the script!'
        RAISERROR('This script must be run in SQLCMD mode! (To enable it go to (Management Studio) Query->SQLCMD mode)\nPlease abort the script!',16,1) WITH NOWAIT 
        WAITFOR DELAY '02:00'; --wait for the user to read the message, and terminate the script manually
    END
    GO
    
    ----------------------------------------------------------------------------------
    ----THE ACTUAL SCRIPT BEGINS HERE-------------
    
  11. ==============================

    11.난 당신이 시도의 catch 블록에 적절한 코드 블록을 포장하는 것이 좋습니다 것입니다. 그런 다음 원하는 경우 catch 블록에 침입하기 위해 (11)의 심각도로 RAISERROR 이벤트를 사용할 수 있습니다. 그냥 raiserrors를 원하지만 try 블록 내에서 실행을 계속 경우 낮은 심각도를 사용합니다.

    난 당신이 시도의 catch 블록에 적절한 코드 블록을 포장하는 것이 좋습니다 것입니다. 그런 다음 원하는 경우 catch 블록에 침입하기 위해 (11)의 심각도로 RAISERROR 이벤트를 사용할 수 있습니다. 그냥 raiserrors를 원하지만 try 블록 내에서 실행을 계속 경우 낮은 심각도를 사용합니다.

    이해가?

    건배, 남자

    [편집은 BOL 참조를 포함한다]

    http://msdn.microsoft.com/en-us/library/ms175976(SQL.90).aspx

  12. ==============================

    12.당신은 RAISERROR를 사용할 수 있습니다.

    당신은 RAISERROR를 사용할 수 있습니다.

  13. ==============================

    13.'GO'문에이 작품의 없음. 이 코드에 관계없이 심각도가 10 또는 11인지, 당신은 최종 PRINT 문을 얻는다.

    'GO'문에이 작품의 없음. 이 코드에 관계없이 심각도가 10 또는 11인지, 당신은 최종 PRINT 문을 얻는다.

    테스트 스크립트 :

    -- =================================
    PRINT 'Start Test 1 - RAISERROR'
    
    IF 1 = 1 BEGIN
        RAISERROR('Error 1, level 11', 11, 1)
        RETURN
    END
    
    IF 1 = 1 BEGIN
        RAISERROR('Error 2, level 11', 11, 1)
        RETURN
    END
    GO
    
    PRINT 'Test 1 - After GO'
    GO
    
    -- =================================
    PRINT 'Start Test 2 - Try/Catch'
    
    BEGIN TRY
        SELECT (1 / 0) AS CauseError
    END TRY
    BEGIN CATCH
        SELECT ERROR_MESSAGE() AS ErrorMessage
        RAISERROR('Error in TRY, level 11', 11, 1)
        RETURN
    END CATCH
    GO
    
    PRINT 'Test 2 - After GO'
    GO
    

    결과 :

    Start Test 1 - RAISERROR
    Msg 50000, Level 11, State 1, Line 5
    Error 1, level 11
    Test 1 - After GO
    Start Test 2 - Try/Catch
     CauseError
    -----------
    
    ErrorMessage
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Divide by zero error encountered.
    
    Msg 50000, Level 11, State 1, Line 10
    Error in TRY, level 11
    Test 2 - After GO
    

    이 일을하는 유일한 방법은 GO 문없이 스크립트를 작성하는 것입니다. 때때로 그것은 간단합니다. 때로는 매우 어렵습니다. (@error <> 0 BEGIN IF와 같은 사용 뭔가 ....)

  14. ==============================

    14.여기 RETURN 모든 시간, 절차 스크립트 또는 저장 작업을 사용하여

    여기 RETURN 모든 시간, 절차 스크립트 또는 저장 작업을 사용하여

    그렇지 않으면 오픈 커밋되지 않은 트랜잭션이 발생합니다 즉시 반환, 당신이 하나 있다면 당신이 트랜잭션을 롤백 확인

  15. ==============================

    15.이것은 내 솔루션했다 :

    이것은 내 솔루션했다 :

    ...

    BEGIN
        raiserror('Invalid database', 15, 10)
        rollback transaction
        return
    END
    
  16. ==============================

    16.당신은 GOTO 문을 사용할 수 있습니다. 이 시도. 이것은 당신을 위해 전체를 사용합니다.

    당신은 GOTO 문을 사용할 수 있습니다. 이 시도. 이것은 당신을 위해 전체를 사용합니다.

    WHILE(@N <= @Count)
    BEGIN
        GOTO FinalStateMent;
    END
    
    FinalStatement:
         Select @CoumnName from TableName
    
  17. ==============================

    17.답에 대한 들으!

    답에 대한 들으!

    RAISERROR는 () 잘 작동하지만, 그렇지 않으면 스크립트가 오류없이 계속 return 문을 잊지 말아야! 필요한 경우 물론 롤백을 수행 (hense RAISERROR는 "인 throwError";-)되지 않습니다)!

    RAISERROR () 뭔가 잘못 갔다 스크립트를 실행하는 사람에게 좋다.

  18. ==============================

    18.당신은 단순히 관리 Studio에서 스크립트를 실행하고, 첫 번째 오류에 정지 실행 또는 롤백 거래 (사용 된 경우)을하려는 경우 가장 좋은 방법 I의 이해 할수는 시도의 catch 블록을 사용 (SQL 2005 이후)입니다. 스크립트 파일을 실행하는 경우이 관리 스튜디오에서 잘 작동합니다. 저장된 프로 시저 항상 잘으로 사용할 수 있습니다.

    당신은 단순히 관리 Studio에서 스크립트를 실행하고, 첫 번째 오류에 정지 실행 또는 롤백 거래 (사용 된 경우)을하려는 경우 가장 좋은 방법 I의 이해 할수는 시도의 catch 블록을 사용 (SQL 2005 이후)입니다. 스크립트 파일을 실행하는 경우이 관리 스튜디오에서 잘 작동합니다. 저장된 프로 시저 항상 잘으로 사용할 수 있습니다.

  19. ==============================

    19.위로 하루에 우리가 최고 일 ... 다음을 사용 :

    위로 하루에 우리가 최고 일 ... 다음을 사용 :

    RAISERROR ('Error! Connection dead', 20, 127) WITH LOG
    
  20. from https://stackoverflow.com/questions/659188/sql-server-stop-or-break-execution-of-a-sql-script by cc-by-sa and MIT license