5

特殊なクエリ アナライザー バッチ区切りキーワードで区切られた一連の T-SQL ステートメントがあります。

GO

1 つのバッチが失敗した場合、クエリ アナライザーで後続のバッチを試行しないようにする必要があります。一連のバッチの処理を停止する必要があります。

例えば:

PRINT 'This runs'
go

SELECT 0/0, 'This causes an error'
go

PRINT 'This should not run'
go

出力:

This runs
Server: Msg 8134, Level 16, State 1, Line 2
Divide by zero error encountered.
This should not run

可能?


アップデート

実際の使用例は次のとおりです。

 sp_rename 'Shelby', 'Kirsten'
 go

 DROP VIEW PeekAView
 go

 CREATE VIEW PeekAViewAS 
 SELECT * FROM Kirsten
 go
4

6 に答える 6

8

これが私がそれを行う方法です:

PRINT 'This runs'
go

SELECT 0/0, 'This causes an error'
go
if (@@error <> 0)
    Begin
    set nocount on
    set noexec on
    End
GO

PRINT 'This should not run'
go

set noexec off
set nocount off
GO

「noexec」モードでは、SSMS は T-SQL をコンパイルするだけで、実際には実行しない状態になります。これは、[実行] (F5) ではなく [解析] ツールバー ボタン (Ctrl+F5) を誤って押した場合と似ています。

スクリプトの最後で noexec をオフにすることを忘れないでください。そうしないと、ユーザーは永続的な「コマンドが正常に完了しました」と混乱することになります。メッセージ。

TRY CATCH ブロックを使用する代わりに、後続のバッチで @@error に対するチェックを使用します。次のバッチで @@error を使用すると、「テーブルが存在しません」などのコンパイル エラーがキャッチされます。

noexec モードに加えて、nocount モードもトグルします。noexec モードがオンで nocount がオフの場合でも、クエリは「(0 行が影響を受けています)」というメッセージを報告します。noexec モードであるため、メッセージは常にゼロ行を報告します。ただし、nocount をオンにすると、これらのメッセージが抑制されます。

また、SQL Server 2005 を実行している場合、スキップするコマンドが存在しないテーブルを参照している場合、コマンドがバッチ内の最初のコマンドである場合、エラー メッセージが表示される可能性があることに注意してください。偽の Print ステートメントを使用してコマンドをバッチの 2 番目のコマンドに強制すると、これを抑制することができます。詳細については、 MS Bug #569263を参照してください。

于 2012-05-23T06:46:52.757 に答える
4

[クエリ、SQLCMD モード] メニュー オプションを有効にして、スクリプトの先頭に以下を配置できます。

:on error exit

これにより、後続のバッチがある場合でも、エラーが発生すると実行が停止します。

エラーが無視される典型的な動作が得られるため、SQLCMD モードをオンにせずに誤ってスクリプトを実行しないように注意してください。

于 2009-10-13T02:41:39.913 に答える
2

これを行う必要がある場合は、重大度 20 の RAISERROR を発行します。これ以上の場合、現在の接続が切断され、後続の「GO バッチ」の実行が妨げられます。はい、気まずいかもしれませんが、うまくいきます。

于 2009-10-13T02:52:45.430 に答える
1

@ u07chのアイデアに基づいていますが、失敗した場合にのみ挿入してください...

create table #test (failure  int)

if not exists (select * from #test)
BEGIN
    print 'one' --sql here
END
go

if not exists (select * from #test)
BEGIN
    print 'two'--sql here
END
go

if not exists (select * from #test)
BEGIN
    print 'three' ---SQL SERVER 2000 version
    --error--
    SELECT 0/0, 'This causes an error'
    IF @@ERROR!=0
    BEGIN
        insert into #test values (1)
        PRINT 'ERROR'
    END
end 
go

if not exists (select * from #test)
BEGIN
    print 'three'  ---SQL SERVER 2005/2008 version
    BEGIN TRY
    --error--
        SELECT 0/0, 'This causes an error'
    END TRY
    BEGIN CATCH
        insert into #test values (1)
        PRINT 'ERROR'
    END CATCH
END
go

if not exists (select * from #test)
BEGIN
    --sql here
    print 'four'
END
go

出力2000:

one
two
three

----------- --------------------
Msg 8134, Level 16, State 1, Line 7
Divide by zero error encountered.

(1 row(s) affected)

ERROR

出力2005/2008:

one
two
three

----------- --------------------

(0 row(s) affected)

(1 row(s) affected)

ERROR
于 2009-05-29T17:32:08.040 に答える
1

一時テーブルを作成します。各ステップの後に更新します(成功した場合)。次に、テーブルに対して検証することにより、前のステップの成功を確認します。

create table #ScriptChecker (SuccessfullStep int)

-- Do Step One
Insert into #ScriptChecker
Select 1

-- Step 2
If exists (select * from #ScriptChecker where SuccessfullStep = 1)
-- Do Step 2 ...
于 2009-05-29T17:15:53.800 に答える