34

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

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

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

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

4

9 に答える 9

11

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

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

于 2009-05-11T02:38:22.967 に答える
7

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

于 2010-08-17T01:24:49.910 に答える
6

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
于 2009-05-11T00:08:40.233 に答える
5

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

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

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

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

BEGIN TRY
  BEGIN TRANSACTION
  /* run all your SQL statements */
  COMMIT TRANSACTION
END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION
END CATCH
于 2009-05-11T00:03:59.850 に答える
3

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

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

于 2009-08-19T22:36:16.057 に答える
2

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

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

于 2009-05-11T00:06:40.000 に答える
2

ここで言及されているいくつかの回避策があります。

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

SQL Server: Query Analyzer で一連のバッチを中止する方法は?

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

于 2011-04-05T23:26:30.213 に答える
0

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

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

于 2009-05-11T02:06:29.090 に答える