2

SQL Server データベースで興味深い動作が見られます。テーブル X を選択するマージ ステートメントがあります。match 句には、テーブル X へのサブセレクトがあります。SQL Server ツールからストアド プロシージャを実行すると、正常に動作します。しかし、IPC (ETL ツール) から実行すると、例外が発生します。Invalid object name 'X'.

これまでのところ、アクセス許可などで多くの問題が発生する可能性があることを理解しているので、特別なことは何もありません。

奇妙なことに、merge ステートメントは try ブロックにあり、catch ブロックでは update ステートメントを介してエラー メッセージがテーブル X に書き込まれます。Sql Server がテーブル X を見つけることができないと不平を言うとき、これはどのように可能ですか?

また、同じ方法で(コード生成を介して)構築された別のストアドプロシージャでも、すべてが正常に機能しますが、テーブルのセットは異なります。

コードは次のようになります

    merge ...
    using
    (select ...
    from dbo.X
    where ...
    when not matched by target 
    and not exists (select 1 from dbo.X q2 where ...)
    then insert (...
    )
    values (...
    )
    when matched and q.ACTION='D'
    then delete
    when matched AND NOT exists (select 1 from dbo.X q3 where ...)
    then update 
    set
      ...

    OUTPUT $action INTO @l_SummaryOfChanges;
    -- Query the results of the table variable.
    SELECT ACTION, COUNT(*) AS CountPerChange
    FROM @l_SummaryOfChanges
    GROUP BY ACTION;
  end try
  begin catch
    update dbo.X
    set LAST_ERROR_MSG=ERROR_MESSAGE(), ERROR_COUNTER=ERROR_COUNTER+1
    where SYNC_ID=@l_SyncID
  end catch

何が起こっているのか?無効なオブジェクト名 'sync$_tabTeiledaten'。

4

1 に答える 1

2

我々はそれを見つけた。gbn の質問は、X の使用法が例外とは何の関係もないという認識を引き起こしました。実際、マージのターゲットテーブルでは、X を参照しているが、実際にスキーマを指定せずに別のスキーマからのトリガーがありました。

私たちがこのたわごとをデバッグした方法から誰かが恩恵を受けますように:

  • X を新しい名前 (Y) で複製しましたが、「無効なオブジェクト名 'X'」というエラー メッセージが引き続き表示されます。その時点で、ビューなどを参照する可能性があると考えていました..
  • Not Null 制約のために必要な列を除いて、merge ステートメントからすべての列 (多数の列) を削除しました。問題は解決しませんでした
  • 一度に 1 つのマージ ステートメントのブランチを削除しました。問題は解決しませんでした。
  • 完全なマージ ステートメントを削除しました。エラーはなくなりました。その時点で、ターゲット テーブルで怪しいことが起こる可能性があることに気付きました。
  • 調べてみると、地獄からの引き金が見つかりました。
于 2011-07-01T12:06:48.937 に答える