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'。