当链接服务器关闭时,exec存储过程将出错

时间:2009-03-24 03:02:19

标签: sql sql-server sql-server-2005

我有一个存储过程用于在许多不同的sql server之间选择数据,并且所有的sql server都已经在内置存储过程的sql server中设置了链接服务器。

这是我的程序:

Create Proc dbo.spGetData
@code as char(4)
AS
if (@code='aaaa')
  Select date From [ServerA].Stock.dbo.Syspara
else if (@code='bbbb')
  Select date From [ServerB].Stock.dbo.Syspara
else if (@code='cccc')
  Select date From [ServerC].Stock.dbo.Syspara
else if (@code='dddd')
  Select date From [ServerD].Stock.dbo.Syspara
GO

如果[ServerB]未处于活动状态或已关闭,则在我致电时:

exec dbo.spGetData 'dddd'

将出现错误,但如果所有4服务器都处于活动状态,则查询将返回且没有错误。

如何避免此问题?

2 个答案:

答案 0 :(得分:1)

添加TRY..CATCH错误处理:

以下示例显示了如何由SELECT语句生成的对象名称解析错误未被TRY ... CATCH构造捕获,但在存储过程内执行相同的SELECT语句时,CATCH块会捕获该错误。

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

错误未被捕获,控制权从TRY ... CATCH构造传递到下一个更高级别。

在存储过程中运行SELECT语句将导致错误发生在低于TRY块的级别。该错误将由TRY ... CATCH构造处理。

-- Verify that the stored procedure does not exist.
IF OBJECT_ID ( N'usp_ExampleProc', N'P' ) IS NOT NULL 
    DROP PROCEDURE usp_ExampleProc;
GO

-- Create a stored procedure that will cause an 
-- object resolution error.
CREATE PROCEDURE usp_ExampleProc
AS
    SELECT * FROM NonexistentTable;
GO

BEGIN TRY
    EXECUTE usp_ExampleProc
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() as ErrorNumber,
        ERROR_MESSAGE() as ErrorMessage;
END CATCH;

答案 1 :(得分:1)

如果像我一样,你仍然需要使用SQL Server 2000,那么就不能使用try catch块。

我不认为它会对超时有所帮助,但是如果你将if语句分解为单独的语句并在每个语句之后检查@@ ERROR,那么这将使你更好地控制。