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

时间:2011-07-01 10:28:49

标签: sql-server-2008 stored-procedures invalid-object-name

我们看到'我们的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'。

1 个答案:

答案 0 :(得分:2)

我们找到了。 gbn的问题引发了对X的使用与异常无关的认识。实际上,在合并的目标表上是一个触发器,它引用了X但来自不同的模式而没有实际指定模式。

可能有人会从调试这个狗屎的方式中受益:

  • 我们使用新名称(Y)复制了X,但仍然收到错误消息“无效对象名称'X'。那时我们认为我们可能会引用一个视图或其他东西......
  • 我们从merge语句中删除了所有列(其中有很多列),但由于Not Null约束而需要的那些列除外。问题持续存在
  • 我们一次删除了合并声明的1个分支。问题依然存在。
  • 我们删除了完整的合并声明。错误消失了。那时我们意识到目标表可能会出现一些腥味。
  • 在检查时,我们发现了地狱的触发器。