ALTER PROCEDURE uspTryCatchTest
AS
BEGIN TRY
-- Table does not exist; object name resolution
-- error not caught.
SELECT * FROM NonexistentTable;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
当我执行此程序时,我得到对象名称解析错误...
如何修复
答案 0 :(得分:3)
假设我们在谈论MS SQL Server,TRY / CATCH块只能处理某些类型的错误。无论您是否使用延迟名称解析,存储过程都会导致编译时错误。但是,如果你有一个TRY / CATCH块封装了对这个过程的调用,它将捕获错误。
...有趣的是,看起来你已经直接从reference page获取代码了。
当CATCH块不处理以下类型的错误 它们与TRY ... CATCH结构处于相同的执行级别:
- 编译阻止批处理运行的错误,例如语法错误。
- 语句级重新编译期间发生的错误,例如 作为编译后发生的对象名称解析错误,因为 延迟名称解析。
答案 1 :(得分:1)
我宁愿用它来检查表是否存在
IF NOT (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dbo'
AND TABLE_NAME = 'YourTable'))
BEGIN
PRINT 'NOT Exists';
END
答案 2 :(得分:1)
ALTER PROCEDURE uspTryCatchTest
AS
BEGIN TRY
-- Table does not exist; object name resolution
-- error not caught.
EXEC('SELECT * FROM NonexistentTable')
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
使用EXEC执行选择查询是有意义的
由于