4

次の t-sql コードを参照してください

   DECLARE @iError INT
   EXEC('select * from sysobj')
   SELECT @iError = @@ERROR
   PRINT 'Error = ' + CAST(@iError AS VARCHAR(10))

私がそれを実行した後、それは私が望むものであるエラーメッセージを返します。

メッセージ 208、レベル 16、状態 1、行 1
無効なオブジェクト名 'sysobj'。
エラー = 208

ただし、クエリを変更すると

   DECLARE @iError INT
   EXEC('select * from sysobjects where ''c'' = 1')
   SELECT @iError = @@ERROR
   PRINT 'Error = ' + CAST(@iError AS VARCHAR(10))

出力は次のようになります。

メッセージ 245、レベル 16、状態 1、行 1
varchar 値 'c' をデータ型 int に変換するときに変換に失敗しました。

問題は、EXEC() が実行されないコードです。

実際のストアド プロシージャには、PRINT 後のエラーを処理するコードがいくつかあります。そして、これらのコードはいずれも 2 番目のケースで実行されませんでした。

誰かがなぜこれが起こるのか教えてもらえますか?

SQL Server 2008 と 2005 の両方でテストしました。

ありがとう

4

3 に答える 3

3

さまざまなエラーにはさまざまなレベルの中止があり、これらのいくつかは ARITHIGNORE や ANSI_WARNINGS などの設定を使用して制御できます。

これらすべてを詳細に説明している次の記事を読むことをお勧めします。

http://www.sommarskog.se/error-handling-I.html#whathappens

ステートメントの終了とバッチの中止

これら 2 つのグループは、一意のインデックスの重複、ディスク領域の不足など、通常の実行時エラーで構成されます。すでに説明したように、どのエラーがどのアクションを引き起こすかを事前に予測することは必ずしも容易ではありません。この表は、いくつかの一般的なエラーと、それらが現在のステートメントまたはバッチ全体を中止するかどうかを示しています。

ここに画像の説明を入力

于 2012-04-13T21:29:27.630 に答える
1

エラー処理のためにTRY...CATCHの実装を検討してください。その後、すべてのエラー処理を CATCH ブロックに入れることができるはずです。

于 2012-04-13T20:49:25.157 に答える
1

これに関する記事が msdn hereにあります。EXEC()ステートメントが実行されるコンテキストと関係があります。に渡されるパラメータにエラー トラップを含めると、EXEC()それを一時テーブルに詰め込んで、それを調べることができます。

これが彼らの例です:

DECLARE @cmd VARCHAR(1000), @ExecError INT

CREATE TABLE #ErrFile (ExecError INT)

SET @cmd = 'EXEC GetTableCount ' + 
'''pubs.dbo.authors''' + 
'INSERT #ErrFile VALUES(@@ERROR)'

EXEC(@cmd)

SET @ExecError = (SELECT * FROM #ErrFile)

SELECT @ExecError AS '@@ERROR'
于 2012-04-13T21:59:35.293 に答える