2

これを実現する方法がわかりません。問題をデバッグしており、挿入が成功した場合に @@Error がゼロ以外になる可能性があるかどうかを知る必要があります。@Error <> 0 の場合に終了するストアド プロシージャがあります。これに対する答えがわかっている場合は、それが役に立ちます。誰でも知っていますか?

コードは以下です。挿入が成功した場合に goto ステートメントに到達できるかどうかを知りたいのです。

    -- This happened
    insert into Workflow
    (SubID, ProcessID, LineID, ReadTime)
    values
    (@sub_id, @proc_id, @line_id, @read_time)

    set @error = @@Error
    set @insertedWorkflowId = SCOPE_IDENTITY()
    if @error <> 0 
    begin
        set @error_desc = 'insert into tw_workflow'
        goto ERROR_EXIT
    end

    -- This didn't happen
    INSERT INTO Master.WorkflowEventProcessing (WorkflowId, SubId, ReadTime, ProcessId, LineId) VALUES (@insertedWorkflowId, @sub_id, @read_time, @proc_id, @line_id)
    INSERT INTO Master.ProcessLogging (ProcessCode, WorkflowId, SubId, EventTime) VALUES (10, @insertedWorkflowId, @sub_id, GETDATE())

編集

何が問題なのかをより適切に説明するには、次のようにします。最初の挿入は行われましたが、最後の 2 つは行われませんでした。そんなことがあるものか?最後の 2 つの挿入が単に失敗しただけなのでしょうか?

4

2 に答える 2

2

この挿入が成功すると、 ( 0行を「正常に」挿入できるのではなく)単に使用しているため、ゼロ以外の@@rowcountが発生します。これを使用して、そこにいくつかのデバッグチェックを書き込むか、ルーチンの一部としてそのまま含めることができます。valuesselect...where

insert into Workflow
(SubID, ProcessID, LineID, ReadTime)
values
(@sub_id, @proc_id, @line_id, @read_time)

if @@rowcount = 0 or @@error <> 0 -- Problems!

アップデート

挿入時にトリガーが起動した場合、重大度が次のトリガーのエラー:

  • <10:問題なく実行されます。@@ error = 0
  • 11から16の間:挿入は成功します、@@ error!= 0
  • 17、18:挿入は成功し、実行は停止します
  • 19(ログ付き):挿入は成功し、実行は停止します
  • > 20(ログ付き):挿入は成功せず、実行は停止します

ワークフローテーブルにトリガーを追加し、重大度についてさまざまな値をテストすることでこれに到達したので、これがすべての環境で正確なケースであるとは簡単には言えません。

alter trigger workflowtrig on workflow after insert as begin
    raiserror(13032, 20, 1) with log -- with log is necessary for severity > 18
end

すっごく、その後、この質問に対する答えがいくらかあります。

挿入が成功すると、@@ Errorをゼロ以外にすることができますか?

はい...しかし、これにつながる可能性のある別の一連のイベントがあるかどうかはわかりません。また、そのことを証明するためのテストをまとめるほど創造的ではありません。うまくいけば、他の誰かが確かに知っています。

これはすべて良い答えではないことを私は知っていますが、コメントするには大きすぎるので、それが役立つかもしれないと思いました!

于 2012-10-10T20:00:06.893 に答える
1

T-SQLのドキュメントによると、これは不可能なはずです。これをtry/catchでラップして、ほとんどのエラーをキャッチしようとすることもできます。

SCOPE_IDENTITY()が正しい値、または正しいと思われる値を返さない可能性も考慮する必要があります。Master.WorkflowEventProcessingテーブルとMaster.ProcessLoggingテーブルにFKがある場合、SCOPE_IDENTITYから返された値が正しくないため、これらのテーブルに挿入しようとするとFKエラーが発生する可能性があります。

于 2012-10-10T19:54:59.927 に答える