2011-07-01 12 views
2

「SQL Severデータベースで面白い動作が見られました。テーブルXを選択するマージステートメントがあります。マッチ節にはテーブルXの副選択があります.SQL Serverツールからストアドプロシージャを実行すると正常に動作します。しかし、IPC(ETLツール)から実行すると、例外が発生するInvalid object name 'X'.同じストアドプロシージャで正常に更新されたテーブルのオブジェクト名が無効

これまでのところ、何も特別なことはありませんが、アクセス許可や物事には間違ったことがたくさんあります。

奇妙なこと:マージステートメントは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 [email protected]_SyncID 
    end catch 

何が起こっているの任意のアイデア?無効なオブジェクト名「同期の$ _tabTeiledaten」のように見えます。

+1

これは正確なメッセージですか?そして、Xのすべての使用はdboでスキーマ修飾されていますか? – gbn

+0

エラーメッセージが表示されている内容と一致するように更新しました。コード内のすべての発生箇所には、dboという接頭辞が付いています。大文字と小文字は、すべての場合にまったく同じです。しかし、エラーメッセージに表示される内容とは異なります。 (それはヒントかもしれない) –

答えて

2

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

  • 我々は新しい名前(Y)とXを複製し、まだ「無効なオブジェクト名 『X』というエラーメッセージが表示されました:

    月の誰かが、我々はこのたわごとをデバッグ方法から利益を得るであろう。その時点で、ビューなどを参照する可能性があると考えました。

  • マージステートメントからすべての列を削除しましたが、必要であれば非NULL制約が原因です。問題は継続されました
  • 一度に1つのマージステートメントの分岐を削除しました。問題は持続した。
  • 完全なマージステートメントを削除しました。エラーはなくなりました。その時点で、私たちは、何かの魚が目標表と一緒に進むかもしれないことに気付きました。
  • 検査の結果、地獄からの引き金が見つかりました。
関連する問題