Sql server 2008 在同一存储过程中成功更新的表的对象名称无效
我们在SQL Server数据库中看到了“有趣的行为”。我们有一个选择表X的merge语句。在match子句中有一个子选择表X。当我们从SQL Server工具执行存储过程时,它工作正常。但是当从IPC(ETL工具)执行时,我们会得到一个异常Sql server 2008 在同一存储过程中成功更新的表的对象名称无效,sql-server-2008,stored-procedures,invalid-object-name,Sql Server 2008,Stored Procedures,Invalid Object Name,我们在SQL Server数据库中看到了“有趣的行为”。我们有一个选择表X的merge语句。在match子句中有一个子选择表X。当我们从SQL Server工具执行存储过程时,它工作正常。但是当从IPC(ETL工具)执行时,我们会得到一个异常无效的对象名“X”。 到目前为止,据我所知没有什么特别的,权限和其他东西可能会有很多问题 奇怪的是:merge语句位于try块中,而catch块中的错误消息通过update语句写入表X中!当Sql Server抱怨找不到表X时,这怎么可能呢 另外,对于另一个
无效的对象名“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$\u tabTeiledaten”无效。我们找到了它。gbn的问题引发了一种认识,即X的使用与异常无关。事实上,在合并的目标表上有一个触发器,它引用了X,但来自不同的模式,而没有实际指定模式 希望有人能从我们调试这个狗屎的方式中受益:
- 我们用一个新名称(Y)复制了X,但仍然收到错误消息,显示“无效对象名”X。在那一点上,我们认为我们可以参考一种观点或类似的东西
- 我们从merge语句中删除了所有列(其中有很多列),除了那些由于NOTNULL约束而需要删除的列。问题依然存在
- 我们一次删除merge语句的一个分支。问题依然存在
- 我们删除了完整的merge语句。错误消失了。此时,我们意识到目标表可能会出现一些可疑的情况
- 经过检查,我们发现了来自地狱的扳机