查询无效的外部表时无法捕获错误

时间:2017-10-25 14:05:59

标签: sql-server azure azure-sql-database external-tables

如果您有一个基于另一个Azure SQL数据库中不存在的表创建的外部表。

SELECT * 
FROM invalid_external_table

抛出以下错误消息:

  

Msg 46823,Level 16,State 1,Procedure
  从{azure database}检索数据时出错。收到的基本错误消息是:'无效的对象名称' dbo.invalid_table'。'。

我正在处理的问题是你似乎无法捕捉到这个错误。

以下代码会导致相同的错误:

BEGIN TRY
    SELECT * 
    FROM invalid_external_table 
END TRY
BEGIN CATCH
    PRINT 'caught exception'
END CATCH

我在Azure SQL数据库中查询基于另一个SQL数据库中的表的外部表。

是否可以在查询外部表之前捕获此错误或验证外部表?

1 个答案:

答案 0 :(得分:1)

根据the documentation

  

TRY ... CATCH构造不会捕获以下条件:

     
      
  • 语句级重新编译期间发生的错误,例如   编译后因对象名称解析错误   延期名称解析。
  •   
     

如果在TRY块内的较低执行级别(例如,执行sp_executesql或用户定义的存储过程时)的编译或语句级重新编译期间发生错误,则错误发生在低于TRY的级别... CATCH构造并将由关联的CATCH块处理。

这也不是特定于外部表,以下将引发错误:

BEGIN TRY
    SELECT * FROM msdb.dbo.InvalidTable;
END TRY
BEGIN CATCH
    PRINT 'caught exception';
END CATCH

但是如果你动态执行SQL,那么你将到达catch块,例如:

BEGIN TRY
    EXECUTE sp_executeSQL N'SELECT * FROM msdb.dbo.InvalidTable;';
END TRY
BEGIN CATCH
    PRINT 'caught exception';
END CATCH