sql >> データベース >  >> RDS >> Sqlserver

SQLServer-SQLスクリプトの実行を停止または中断します

    レイザー方式

    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.
    

    'ho'は印刷されないことに注意してください。

    警告:

    • これは、管理者('sysadmin'ロール)としてログインしている場合にのみ機能し、データベース接続もありません。
    • adminとしてログインしていない場合、RAISEERROR()呼び出し自体は失敗し、スクリプトは実行を継続します
    • sqlcmd.exeを使用して呼び出すと、終了コード2745が報告されます。

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

    noexecメソッド

    GOステートメントで機能するもう1つの方法は、set noexec onです。 。これにより、スクリプトの残りの部分がスキップされます。接続は終了しませんが、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.
    


    1. 忘れられた代入演算子=そしてありふれた:=

    2. SQLは値を複数の行に分割します

    3. 文字列を分割し、MySqlプロシージャの値をループします

    4. xp_cmdshellへの実行権限の取得