我们看到 SQL Sever 数据库的“有趣行为”。我们有一个选择表 X 的合并语句。在匹配子句中有一个对表 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”。