2009-03-24 8 views
1

多くの異なるSQL Server間で選択されたデータのストアドプロシージャがあり、すべてのSQL Serverがストアドプロシージャを構築したSQL Server [サーバーB]生存していないか、閉じている場合は、私が呼ぶとき、リンクされたサーバーが閉じている間、ストアドプロシージャを実行するとエラーが発生します

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 

::。

exec dbo.spGetData 'dddd' 

エラーがあるでしょう、で

ここに私の手順です4つのサーバーがすべて稼働している場合、クエリはエラーなしで戻ります。

問題を回避するにはどうすればよいですか?

答えて

1

TRY..CATCHエラー処理を追加します。

次の例は、SELECT文によって生成されたオブジェクトの名前解決エラーがTRY ... CATCH構造によって捕捉されない方法を示していますが、CATCHブロックと同じSELECT文によってキャッチされますストアドプロシージャ内で実行されます。

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

私のようにSQL Server 2000を使用する必要がある場合は、try catchブロックを使用できません。

私は時間切れに役立つとは思っていませんが、if文を個々の文に分割し、それぞれの後に@@ ERRORをチェックすると、より良い制御が得られます。

関連する問題