web-dev-qa-db-ja.com

SQL Server Management Studioでエラーの処理を停止するにはどうすればよいですか?

これは非常に馬鹿げた質問のように思えますが、エラーが発生したときにSQL Server Management StudioでSQLスクリプトの処理を停止するにはどうすればよいですか?

私は長いスクリプトを持っていますが、開始時にエラーが発生した場合、SSMSはそれを報告し、盲目的に続行し、事態をさらに台無しにします。スクリプトが複数のデータベースを作成し、それらがトランザクションに参加できないため、トランザクションを使用できません。時々失敗するのはデータベースの作成です。

Toad for SQL Serverは、最初に発生したエラーで一時停止し、停止するか続行するかを尋ねます。これが私が探している行動です。 SSMSに存在しますか?

私はnotに、「エラーで停止するようにスクリプトを作成または変更するにはどうすればよいですか?」と質問しています。これを実現するためにスクリプトを変更することに興味はありません。SSMSにエラーで停止を実行させたいだけです。 Toad for SQL Serverはまさにこれを実行し、それが私が望む動作です。これは、SSMSを停止するようにスクリプトを変更することに関連しているため、 659188 の複製でもありません。

28
TallGuy

簡単な答え:できません。

回避策を提供してくれた人たちに感謝しますが、Toad for SQL Serverと同じように、SSMS自体をエラーで一時停止または停止するように設定することはできないようです。

11
TallGuy

ApexSQLスクリプトは、必要な方法でバッチスクリプトを生成します。例として:

--Script Header
begin transaction
go

{Statement #1}
go
--Standard Post-Statement Block
if @@error <> 0 or @@trancount = 0 begin
    if @@trancount > 0 rollback transaction
    set noexec on
end
go

{Statement #2}
go
--Standard Post-Statement Block
if @@error <> 0 or @@trancount = 0 begin
    if @@trancount > 0 rollback transaction
    set noexec on
end
go

--Script Footer
if @@trancount > 0 commit transaction
go
set noexec off
go
6
yfeldblum

-bおよび-Vオプションを設定して、SQLServerに付属のコマンドラインプログラム「sqlcmd」の使用を検討してください。 -bを指定すると、エラーが発生したときにsqlcmdが終了します。 -Vは、エラーと見なされる重大度レベルを制御します。

6
Phil Dennis

SQLステートメントをトランザクションでラップする必要があります。

BEGIN TRANSACTION
   /* run all your SQL statements */
COMMIT TRANSACTION

開始/終了トランザクション内にエラーがある場合、すべてのステートメントがロールバックされます。

EDIT:begin/endトランザクション内でラップすると、ステートメントがデータベースにコミットされるのを防ぎますが、その時点で停止することはありません。次のように、try/catchブロック内に追加でラップする必要があります。

BEGIN TRY
  BEGIN TRANSACTION
  /* run all your SQL statements */
  COMMIT TRANSACTION
END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION
END CATCH
4
Jose Basilio

ワオ。それはちょっとゴミですね。私はSQL-Workbenchを使用しています。これは、Toad for SQL Serverのように、これを簡単に処理します。ただし、Toad for SQL Serverとは異なり、無料です。

このような基本的な機能が標準ツールの一部ではないことに驚いています。

4
Kerry Sainsbury

ここでtrycatchブロックヘルプを使用します。エラーが発生すると、試行は終了します。キャッチでエラー処理を実装します。

http://msdn.Microsoft.com/en-us/library/ms179296.aspx

2
Stuart

スクリプトをストアドプロシージャに配置できず、returnステートメントを使用してエラーが発生した場合に終了できない場合は、@ Justiceが提供するソリューションが最善の策かもしれません。他の誰もが要点を見逃しています-トランザクションを使用したり、レイザーを使用したりしても、スクリプトから戻ることはできません。 set xact abortがオンの場合でも、SSMSはとにかく次のことを実行します。

スクリプトをストアドプロシージャに変換できる場合は、エラーを検出したときにスクリプトから戻ることができます。

0
Eric Z Beard

ここに記載されている回避策がいくつかあります。

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

そして

SQL Server:クエリアナライザで一連のバッチを中止する方法は?

(ログでエラー20を発生させ、noexecをオンに設定し、sqlcmdモード:エラー終了時など)

0
user423430