「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」のように見えます。
これは正確なメッセージですか?そして、Xのすべての使用はdboでスキーマ修飾されていますか? – gbn
エラーメッセージが表示されている内容と一致するように更新しました。コード内のすべての発生箇所には、dboという接頭辞が付いています。大文字と小文字は、すべての場合にまったく同じです。しかし、エラーメッセージに表示される内容とは異なります。 (それはヒントかもしれない) –