请看下面的 t-sql 代码
DECLARE @iError INT
EXEC('select * from sysobj')
SELECT @iError = @@ERROR
PRINT 'Error = ' + CAST(@iError AS VARCHAR(10))
在我运行它之后,它会返回错误消息,这就是我想要的。
消息 208,级别 16,状态 1,第 1 行
无效的对象名称“sysobj”。
错误 = 208
但是,如果我更改查询
DECLARE @iError INT
EXEC('select * from sysobjects where ''c'' = 1')
SELECT @iError = @@ERROR
PRINT 'Error = ' + CAST(@iError AS VARCHAR(10))
输出将是
消息 245,级别 16,状态 1,行 1
将 varchar 值“c”转换为数据类型 int 时转换失败。
问题是 EXEC() 之后的任何代码都没有执行。
在真正的存储过程中,我有一些代码来处理 PRINT 之后的错误。并且这些代码都没有在第二种情况下执行。
有人可以让我知道为什么会这样吗?
我在 SQL Server 2008 和 2005 上都对其进行了测试。
谢谢