我们看到'我们的SQL服务器数据库'有趣的行为。我们有一个merge语句,它选择一个表X.在match子句中有一个表X的子选择。当我们从SQL Server Tools执行存储过程时,它工作正常。但是当从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'。
答案 0 :(得分:2)
我们找到了。 gbn的问题引发了对X的使用与异常无关的认识。实际上,在合并的目标表上是一个触发器,它引用了X但来自不同的模式而没有实际指定模式。
可能有人会从调试这个狗屎的方式中受益: