1

ID が ID であるため、この更新は失敗します

しかし、直接エラーメッセージが表示されます。
PRINT ステートメントを取得していません。

@@ERROR の使用方法
SSMS の使用。
これをスクリプトと呼びますか、それともクエリと呼びますか?

PRINT   'start';
DECLARE @ErrorVal INT;
UPDATE IndenText SET ID = 7;
SELECT @ErrorVal = @@ERROR;
PRINT @ErrorVal;
IF @ErrorVal <> 0
BEGIN
    PRINT N'A error caught.';
END
PRINT 'done';

これも私からはうまくいきません

PRINT   'start';
DECLARE @ErrorVal INT;
BEGIN TRY
    UPDATE IndenText SET ID = 7;
    SELECT @ErrorVal = @@ERROR;
    PRINT @ErrorVal;
END TRY
BEGIN CATCH
    IF @@ERROR <> 0
    BEGIN
        PRINT N'A error caught.' + @@ERROR;
    END
END CATCH
PRINT 'done';

メッセージ 8102、レベル 16、状態 1、行 4が
表示されます ID 列 'ID' を更新できません。

マーティンが述べたように、それはコンパイルエラーでした。
コンパイル エラーにならない制約を作成しました。
そして、処理する @@ERROR を取得しました。

PRINT   'start';
DECLARE @ErrorVal INT;
DECLARE @newVal INT;
select  @newVal = -1;
BEGIN TRY
    update Twaste1 set ID = @newVal ;
    PRINT 'End Try';
END TRY
BEGIN CATCH
    Select @ErrorVal = @@ERROR;
    PRINT 'Begin Catch';
    IF @ErrorVal <> 0
    BEGIN
        PRINT CAST(@ErrorVal as varchar(30));
        PRINT N'A error caught.';
    END
END CATCH
PRINT 'done'

;

4

2 に答える 2

2

たとえば、更新用:

UPDATE HumanResources.EmployeePayHistory
SET PayFrequency = 4
WHERE BusinessEntityID = 1;

IF @@ERROR = 547 PRINT N'チェック制約違反が発生しました。行く

于 2012-09-28T17:22:23.583 に答える
1

代わりに使用することをお勧めしTRY... CATCHます。これにより、スローされたエラーをキャプチャして調べることができます。

アップデート:

マーティンは、元の質問へのコメントでこれが機能しない理由をすでに説明していると思いますが、MSDN のTRY... CATCH記事への参照を追加します。

次のタイプのエラーは、TRY…CATCH コンストラクトと同じ実行レベルで発生した場合、CATCH ブロックによって処理されません。

  • 構文エラーなど、バッチの実行を妨げるコンパイル エラー。
  • 名前解決の遅延が原因でコンパイル後に発生するオブジェクト名解決エラーなど、ステートメント レベルの再コンパイル中に発生するエラー。
于 2012-09-28T17:09:46.267 に答える