Sql server 2008 在同一存储过程中成功更新的表的对象名称无效

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时,这怎么可能呢 另外,对于另一个

我们在SQL Server数据库中看到了“有趣的行为”。我们有一个选择表X的merge语句。在match子句中有一个子选择表X。当我们从SQL Server工具执行存储过程时,它工作正常。但是当从IPC(ETL工具)执行时,我们会得到一个异常
无效的对象名“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语句。错误消失了。此时,我们意识到目标表可能会出现一些可疑的情况
  • 经过检查,我们发现了来自地狱的扳机

这是确切的信息吗?X的所有使用都是dbo模式限定的?我更新了错误消息,使其与我们看到的完全匹配。代码中的所有事件都以dbo为前缀。资本化在所有事件中都是完全相同的。但与我们在错误消息中看到的不同。(这可能是个暗示)