Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么程序没有进入捕捉块_Sql Server_Sql Server 2008 - Fatal编程技术网

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语句结束会话时

当以下类型的错误与TRY…CATCH构造发生在同一执行级别时,CATCH块不会处理这些错误:

  • 编译错误,如语法错误,会阻止批处理运行

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

这些错误将返回到运行批处理、存储过程或触发器的级别

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

希望以上描述能解决您的问题。

根据MSDN(以下链接)

不受TRY…CATCH构造影响的错误 TRY…CATCH构造不会捕获以下条件:

  • 严重性为10或更低的警告或信息性消息

  • 严重性为20或更高的错误会停止会话的SQL Server数据库引擎任务处理。如果发生严重性为20或更高的错误,并且数据库连接未中断,则TRY…CATCH将处理该错误

  • 注意事项,如客户端中断请求或断开的客户端连接

  • 系统管理员使用KILL语句结束会话时

当以下类型的错误与TRY…CATCH构造发生在同一执行级别时,CATCH块不会处理这些错误:

  • 编译错误,如语法错误,会阻止批处理运行

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

这些错误将返回到运行批处理、存储过程或触发器的级别

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


希望以上描述能解决您的问题。

错误是否超出了您的重试区?只有在
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'的对象未包含在您发布的代码中。除非我了解全部情况,否则我无法确定问题的根源