2009-06-05 7 views
2

"GO"が指定されていてもif文が真である場合、スクリプトが実行を阻止されますか?SQL Server:実行中のSQLを終了する

私は次のような何かをしたい例えば

insert into table1 (col1, col2) value ('1', '2') 
GO 
if exists(select * from table1 where col1 = '1') 
    BEGIN 
    --Cause Script to fail 
    END 
GO 
insert into table1 (col1, col2) value ('1', '2') --Wont run 

これを行う実際の目的は、スクリプト/挿入を作成し、テーブルを防ぐために/削除された/我々がドロップすると、複数回実行しているから更新をDBAのためのパッケージを実行します。

+2

'mssql'ではなく 'sqlserver'タグを使用してください。あなたの質問にタグを付ける際の提案を見てください:名前の後に10より小さい数字のタグはおそらく間違っています。他の質問でも 'mssql'は使用されません。 –

+1

SQLの例でGO文が必要な理由がわかりません。 – Jeremy

+0

@Jeremy:このシナリオでは必要ではない例を挙げておきますが、もしそれをやりたいのであれば、どうやって止めるのでしょうか...基本的に私は何を得ようとしています。 – Nic

答えて

1

ドキュメントによると、重大度がRAISEERROR()に渡される特定の値は、さまざまなレベルの終了を引き起こす可能性があります。

最も興味のあるもの(あなたは、SQL Management Studioのまたは類似を通じてスクリプトを実行し、ファイル内の任意の後続のコマンドを実行しようとする試みを防ぐために必要されている場合)であってもよい:

重大度レベル20から25までは致死的とみなされます。致命的な重大度に遭遇した場合、クライアント接続はメッセージの受信後に終了し、エラーはエラーログとアプリケーションログに記録されます。

+0

あなたは本当にそれをしたくありません。エンジンによってオフラインになったデータベースで終わるかもしれません。なぜならあなたはcol1に値 '1'を持っているからです! –

+0

@Jason:これは私が探していたものです。ありがとうございます! – Nic

+0

@残念:何かを実行する理由があります。常に実用的ではないかもしれませんが、解決策が実行可能な場合もあります。私の状況では、これは完璧でした。 – Nic

4

GOはtransact-sqlキーワードではありません。実際には一般的なSQL Serverツールで理解されているバッチターミネータです。あなたのアプリケーションでそれを使用する場合、あなたのアプリは失敗します。

なぜこのようなことはしませんか?

IF NOT EXISTS (select * from table1 where col1 = '1') 
BEGIN 
    --Do Some Stuff 
END 

よりもむしろ条件であれば、スクリプトを中止するには、条件が満たされない場合にのみ、スクリプトを実行し、会いました。

また、コードをprocにラップし、RETURNを使用してprocを終了することもできます。

+1

良い答えの完璧な例: - ユーザーの解が間違っている理由の説明。 - 便利なコード - 与えられた説明が - 追加/代替の解決策 – JeffO

+0

@Guiness:しかし、実際にはユーザーが尋ねたことはありません。私は実際にニックが尋ねたことが可能であるかどうかを知りたいと熱望しています。 – Sung

+0

@Aaron:答えてくれてありがとうございます。しかし、私が探していたものは答えませんでした。一度に50個のスクリプトを一括してバッチ処理し、スクリプトの開始時に終了し、すでに送信されているため、すべてが実行されないようにしたいと考えています。スクリプトが複数回実行されるのを防ぐのに役立ちます。デプロイの練習に入るだけです。もし私が完璧であるが、私のニーズに合っていないコラムを追加しようとしているのであれば、ありがとうございました。 – Nic

0

上記のスクリプトの実行に使用するツールは指定していません。 sqlcmd and osql tools have the -b parameter 'On error batch abort'は、あなたが求めているものとまったく同じです。単に '原因スクリプトt失敗'をRAISERROR("failure", 16, 1)に置き換えてください。

@Jasonスクリプトで16を超えるエラーレベルを使用しないことを強くお勧めします。 1つのレベルでは、18以上のレベルではsysadmin権限が必要です。第2に、、さらにはエンジンであっても、フェールオーバーの開始やデータベースのオフライン化などの劇的な対策を含む管理上の監視からの自動応答をすべて起動することがあります。そして、最後には、実際の事件を調査している人は、「クラッシュの1時間前にハードウェアの障害が起きるのを見てみましょう。

-1

gotoを使用してください。それは醜いと思うが、これには完璧に働く。

編集 - nm、これは機能しません。私はそれが動作すると思ったときには夢だったに違いない

+0

@hainstech:ラベルは2番目のバッチ(IF文付き)から表示されず(2番目のバッチはまだ実行されます)、GOTOは動作しません。GOTOは私が考えて試した最初のものでしたが、仕事はありません。 – Sung

関連する問題