リンクサーバーのリストをループし、各サーバーに対して特定のクエリを実行するジョブを設定しています。TRY-CATCHブロック内でクエリを実行しようとしているので、特定のサーバーに問題がある場合はログに記録できますが、他のサーバーで続行します。
ループ内で実行しているクエリは次のようになります。
BEGIN TRY
SELECT *
FROM OPENQUERY([server1], 'SELECT 1 AS c;');
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH;
PRINT 'We got past the Catch block!';
サーバーへの接続に問題がある場合、コードはただちに失敗し、CATCH
ブロックに転送されません。サーバーは接続しているが、実際のクエリにエラーがある場合(ゼロ除算など)、CATCH
ブロックで期待どおりにキャッチされます。
たとえば、存在しないことがわかっている名前でリンクサーバーを作成しました。上記を実行するとき、私はちょうど得る:
OLE DB provider "SQLNCLI" for linked server "nonserver" returned message
"Login timeout expired".
OLE DB provider "SQLNCLI" for linked server "nonserver" returned message
"An error has occurred while establishing a connection to the server.
When connecting to SQL Server 2005, this failure may be caused by the
fact that under the default settings SQL Server does not allow remote
connections.".
Msg 53, Level 16, State 1, Line 0
Named Pipes Provider: Could not open a connection to SQL Server [53].
私はBOLを読んでTRY-CATCH
、接続を切断するレベル20以上のエラーをキャッチしないことを知っていますが、これは事実ではないようです(これはレベル16のみです)。
これらのエラーが正しくキャッチされない理由を誰もが知っていますか?