2

他のいくつかを呼び出すストアドプロシージャがあります。そのうちの1つは、主キーが重複しているためにテーブルに行を挿入できません。

発生したエラーは、メッセージ2627、レベル14、状態1、手順...、16行目主キー制約の違反'...'です。オブジェクト'...'に重複するキーを挿入できません。

これをExcelスプレッドシートからVBA経由で呼び出しており、通常のOn Error処理が実行されていますが、ルーチンはエラーをトリガーせずにサイレントに失敗しています。

これがストアドプロシージャ内のストアドプロシージャによるものなのか、エラーの重大度が低すぎるためなのかはわかりません。

誰かがこのようなことを経験し、回避策を提案できますか?

私の最初の試みは、ストアドプロシージャ呼び出しの周りにBEGIN TRY / BEGIN CATCHブロックを配置し、CATCHがより高い重大度でRAISERRORを実行することでしたが、トリガーされていないようです。

ありがとう

4

2 に答える 2

2

外部プロシージャで、明示的なトランザクションを追加します。BEGIN TRANSACTION最初とCOMMIT TRANSACTION最後に。

次に、トランザクションを開始する前にを追加しSET XACT_ABORT ON;ます。これでバッチ障害が処理されます。

エラーのある内部プロシージャの後で、ステートメントレベルのエラーのエラー値を確認します。

IF @@ERROR <> 0 
BEGIN
    ROLLBACK TRANSACTION; 
    RETURN 1; 
END
于 2012-04-20T09:58:12.827 に答える
0

これはT-SQLのOUTPUT変数を使用して行いますが、私はSQL側しか知りません。つまり、VBAを使用してSQLから出力パラメーターを取得する必要があります。出力変数をvarcharとして宣言し、すぐに''に設定します。

DECLARE @MyError VARCHAR(500) OUTPUT
SET @MyError = ''

T-SQLで通常のエラーチェックを実行し、エラーが見つかった場合は、@MyError変数に説明を設定します。VBAコードは常に@MyErrorメッセージを受け取りますが、通常は空の文字列''になります。そうでない場合は、VBAでのエラー処理に進みます。

于 2012-04-19T18:37:03.787 に答える