Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 TRY…CATCH未捕获错误_Sql Server_Tsql_Try Catch - Fatal编程技术网

Sql server SQL Server TRY…CATCH未捕获错误

Sql server SQL Server TRY…CATCH未捕获错误,sql-server,tsql,try-catch,Sql Server,Tsql,Try Catch,到目前为止,我第一次在SQL Server中使用TRY…CATCH的经验并没有给我留下深刻印象 我已停止链接服务器上的SQL服务,以尝试测试链接服务器已关闭、无法访问等情况 这段代码没有捕获任何错误,而是抛出“登录超时已过期”和“网络相关或实例特定错误已发生…”错误,并停止执行其余代码 我的SQL TRY…CATCH块是否设置不正确?根据MSDN,该怎么办 测试与链接服务器的连接。如果测试不成功 该过程将引发一个异常,并说明失败的原因 因此,在编译代码(SP)时,SP\u testlinkeds

到目前为止,我第一次在SQL Server中使用TRY…CATCH的经验并没有给我留下深刻印象

我已停止链接服务器上的SQL服务,以尝试测试链接服务器已关闭、无法访问等情况

这段代码没有捕获任何错误,而是抛出“登录超时已过期”和“网络相关或实例特定错误已发生…”错误,并停止执行其余代码

我的SQL TRY…CATCH块是否设置不正确?

根据MSDN,该怎么办

测试与链接服务器的连接。如果测试不成功 该过程将引发一个异常,并说明失败的原因

因此,在编译代码(SP)时,
SP\u testlinkedserver
检查连接。但是,您可以通过使用动态SQL延迟并捕获它

像这样-

BEGIN TRY
    EXEC N'EXEC sp_testlinkedserver N''[MyLinkedServer]'';';
END TRY
BEGIN CATCH
    SELECT 'LinkedServerDown' AS Result
    RETURN
END CATCH
SELECT TOP(1) FirstName FROM [MyLinkedServer].TestDatabase.dbo.Customer

不受TRY…CATCH构造影响的错误

TRY…CATCH构造不会捕获以下条件:

  • 严重性为10或10的警告或信息性消息 更低
  • 严重性为20或更高的错误会停止SQL Server 会话的数据库引擎任务处理。如果发生错误 严重性为20或更高,且数据库连接不可用 中断,尝试…CATCH将处理错误
  • 注意事项,如客户端中断请求或断开的客户端 联系
  • 当系统管理员使用结束会话时 KILL语句
  • 以下类型的错误不由CATCH块处理: 它们发生在与TRY…CATCH构造相同的执行级别:

  • 编译错误,如语法错误,会阻止批处理 跑步
  • 语句级重新编译期间发生的错误,例如 编译后发生的对象名称解析错误,因为 延迟的名称解析

  • 您需要创建EndTestLinkedServer存储过程。这还将捕获登录超时错误

    BEGIN TRY
        EXEC sp_executesql N'EXEC sp_testlinkedserver [192.168.51.81];';
    END TRY
    BEGIN CATCH
        SELECT 'LinkedServerDown' AS Result
    END CATCH
    
    定义如下:

    exec dbo.USP_testlinkedserver 'myServerNameHere'
    

    您所遇到的错误的严重程度如何?如果它高于20,try-catch将不会捕获错误。我如何判断错误的严重性?我希望它能工作!但是,我得到的错误消息和结果与以前相同。@Dezryth:我在sql server实例中检查了上述代码,它运行得非常好。请参阅我编辑的答案(包括我的本地链接服务器ip)。@Dezryth:从语句中删除引号(
    ),然后尝试此查询-
    EXEC sp_executesql N'EXEC sp_testlinkedserver[MyLinkedServer];'CREATE PROCEDURE USP_testlinkedserver 
        @ServerName sysname
    AS
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @statement NVARCHAR(MAX), @errorMessage NVARCHAR(MAX)
    
        SET @statement = N'SELECT * FROM OPENQUERY('+QUOTENAME(@ServerName,'[')+', ''SELECT 1'')'
    
    BEGIN TRY
        -- run the query
        EXEC sp_executesql @stmt = @statement;
    END TRY
    BEGIN CATCH
        -- show custom message
        SET @errorMessage=QUOTENAME(@ServerName,'[') + ' linked server is not available. ' + ERROR_MESSAGE()
        Raiserror(@errorMessage,16,1)
    END CATCH;
    
    END