选择不存在异常块的非现有列的语句

时间:2012-04-19 00:23:29

标签: sql-server

由于X_TEST列不存在,我预计会出现错误。 但错误没有被异常块捕获。

BEGIN TRY
   SELECT X_TEST FROM ACCOUNTS 
END TRY
BEGIN CATCH
   PRINT 'There was an error! ' + ERROR_MESSAGE()
END CATCH

为什么?是因为错误的严重性?

3 个答案:

答案 0 :(得分:3)

不,TRY只能在自己的范围内处理某些类型的错误。现在,您说您有一个看起来像这样的存储过程(在non_existent_column被删除之后):

CREATE PROCEDURE dbo.blat
AS
BEGIN
  BEGIN TRY
    SELECT non_existent_column FROM dbo.table_that_exists;
  END TRY
  BEGIN CATCH
    PRINT ERROR_MESSAGE();
  END CATCH
END
GO

如果你只是这样做......

EXEC dbo.blat;

...您将受到编译错误的困扰,因为该TRY范围内的语句无法解析:

Msg 207, Level 16, State 1, Procedure fooblat, Line 5
Invalid column name 'non_existent_column'.

但是,您可以在外部范围捕获此错误(过程是否具有TRY/CATCH):

BEGIN TRY
  EXEC dbo.fooblat;
END TRY
BEGIN CATCH
  PRINT 'There was an error:';
  PRINT ERROR_MESSAGE();
END CATCH

结果(注意这不是例外,文字不再是红色):

There was an error:
Invalid column name 'non_existent_column'.

你也可以通过动态SQL来避免这种情况,但似乎你已经把它击落了,所以这是我能想到的下一个最好的建议 - 在外部范围捕获错误。

答案 1 :(得分:2)

使用不存在的列是语法错误。您的批次甚至从未开始执行。

考虑以下代码:

BEGIN TRY
   sdgedtju§$%&/()= 
END TRY
BEGIN CATCH
   PRINT 'There was an error! ' + ERROR_MESSAGE()
END CATCH

你不会指望它甚至开始吧?它不编译。使用不存在的列是相同的

答案 2 :(得分:2)

此代码会为您提供您期望看到的行为......

BEGIN TRY
   exec('SELECT X_TEST FROM ACCOUNTS')
END TRY
BEGIN CATCH
   PRINT 'There was an error! ' + ERROR_MESSAGE()
END CATCH