我有一个存储过程用于在许多不同的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服务器都处于活动状态,则查询将返回且没有错误。
如何避免此问题?
答案 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,那么这将使你更好地控制。