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