次の 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 の両方でテストしました。
ありがとう