2

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

4

1 回答 1

2

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

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

  • 我们用新名称 (Y) 复制了 X,但仍然收到错误消息“无效的对象名称‘X’。那时我们认为我们可能会参考一个观点或类似的东西..
  • we removed all the columns (there where lots of) from the merge statement, except those which where necessary due to Not Null Constraints. The problem persisted
  • We removed 1 of the branches of the merge statement at a time. The problem persisted.
  • we removed the complete merge statement. The error was gone. At that point we realized that something fishy might go on with the target table.
  • On inspection we found the trigger from hell.
于 2011-07-01T12:06:48.937 回答