Sql server 为什么程序没有进入捕捉块
我有一个存储过程,它从数据库中不存在的Sql server 为什么程序没有进入捕捉块,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个存储过程,它从数据库中不存在的实体表中选择条目 在下面的代码中,如果我执行存储过程,它不会进入catch块,而对于try块中的每个错误,它都应该自动进入catch块 我无法理解原因 Create PROCEDURE AddUpdateEntity (@Name VARCHAR(20), @Age SMALLINT) AS BEGIN TRY SELECT NAME, Age FROM Entity WHERE NAME = @name AND Age = @A
实体
表中选择条目
在下面的代码中,如果我执行存储过程,它不会进入catch块,而对于try块中的每个错误,它都应该自动进入catch块
我无法理解原因
Create PROCEDURE AddUpdateEntity
(@Name VARCHAR(20),
@Age SMALLINT)
AS
BEGIN TRY
SELECT NAME, Age FROM Entity WHERE NAME = @name AND Age = @Age
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() StatusCode, ERROR_MESSAGE() [Message]
END CATCH
GO
/* Command to execute the SP */
EXEC AddUpdateEntity 'Sandeep',20
此execute语句显示错误“Invalid Entity Object”,但未调用catch块
存储过程已崩溃,正在显示消息
Msg 208,第16级,状态1,程序AddUpdateEntity,第10行名称“对象”实体“无效”
它永远不会进入
CATCH
块,因为查询没有返回任何行。不返回行的sql查询不是错误;这是预期的行为
正如其他人所指出的,您看到的错误似乎是编译时错误,因为实体
表不存在
您可以尝试使用动态sql with强制SP仅在运行时检查表是否存在
BEGIN TRY
DECLARE @sqlStr NVARCHAR(4000),
@sqlParams NVARCHAR(400);
SET @sqlStr = N'SELECT Name, Age FROM Entity WHERE Name=@Name AND Age=@Age';
SET @sqlParams = '@Name VARCHAR(20), @Age SMALLINT';
sp_executesql @sqlStr, @sqlParams, @Name = @Name, @Age = @Age
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() StatusCode, ERROR_MESSAGE() [Message]
END CATCH
它永远不会进入
CATCH
块,因为查询没有返回任何行。不返回行的sql查询不是错误;这是预期的行为
正如其他人所指出的,您看到的错误似乎是编译时错误,因为实体
表不存在
您可以尝试使用动态sql with强制SP仅在运行时检查表是否存在
BEGIN TRY
DECLARE @sqlStr NVARCHAR(4000),
@sqlParams NVARCHAR(400);
SET @sqlStr = N'SELECT Name, Age FROM Entity WHERE Name=@Name AND Age=@Age';
SET @sqlParams = '@Name VARCHAR(20), @Age SMALLINT';
sp_executesql @sqlStr, @sqlParams, @Name = @Name, @Age = @Age
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() StatusCode, ERROR_MESSAGE() [Message]
END CATCH
根据MSDN(遵循链接)
不受TRY…CATCH构造影响的错误
TRY…CATCH构造不会捕获以下条件:
- 严重性为10或更低的警告或信息性消息
- 严重性为20或更高的错误会停止会话的SQL Server数据库引擎任务处理。如果发生严重性为20或更高的错误,并且数据库连接未中断,则TRY…CATCH将处理该错误
- 注意事项,如客户端中断请求或断开的客户端连接
- 系统管理员使用KILL语句结束会话时
- 编译错误,如语法错误,会阻止批处理运行
- 语句级重新编译期间发生的错误,例如编译后由于延迟的名称解析而发生的对象名称解析错误
- 严重性为10或更低的警告或信息性消息
- 严重性为20或更高的错误会停止会话的SQL Server数据库引擎任务处理。如果发生严重性为20或更高的错误,并且数据库连接未中断,则TRY…CATCH将处理该错误
- 注意事项,如客户端中断请求或断开的客户端连接
- 系统管理员使用KILL语句结束会话时
- 编译错误,如语法错误,会阻止批处理运行
- 语句级重新编译期间发生的错误,例如编译后由于延迟的名称解析而发生的对象名称解析错误
希望以上描述能解决您的问题。错误是否超出了您的重试区?只有在
SELECT
中发生错误时才会调用catch块,因为表本身不存在,代码不会编译。因此catch块
不会执行TRY块之外的错误吗?只有在SELECT
中发生错误时才会调用catch块,因为表本身不存在,代码不会编译。因此catch块将不会执行返回错误Msg 208,级别16,状态1,过程AddUpdateEntity,第10行Nom d'objet'Tmp'无效。@Sandepkumar我不会说法语,但我认为这意味着有一个名为'Tmp'的对象未包含在您发布的代码中。除非我知道完整的上下文,否则我无法确定问题的根源。返回错误消息208,级别16,状态1,过程AddUpdateEntity,第10行Nom d'objet'Tmp'无效。@Sandepkumar我不会说法语,但我假设这意味着有一个名为'Tmp'的对象未包含在您发布的代码中。除非我了解全部情况,否则我无法确定问题的根源