Tôi đang thiết lập một công việc để lặp qua danh sách các máy chủ được liên kết và thực hiện một truy vấn cụ thể đối với từng máy chủ. Tôi đang cố gắng thực hiện truy vấn bên trong khối TRY-CATCH để nếu có vấn đề với một máy chủ cụ thể, tôi có thể đăng nhập nhưng sau đó tiếp tục với các máy chủ khác.
Truy vấn tôi đang thực hiện bên trong vòng lặp trông giống như thế này:
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!';
Nếu có sự cố khi kết nối với máy chủ, mã sẽ bị lỗi ngay lập tức và không chuyển sang CATCH
khối. Nếu máy chủ kết nối nhưng có lỗi trong truy vấn thực tế, ví dụ: chia cho 0, thì điều này được bắt theo dự kiến của CATCH
khối.
Ví dụ: tôi đã tạo một máy chủ được liên kết với một tên mà tôi biết không tồn tại. Khi thực hiện những điều trên tôi chỉ nhận được:
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].
Tôi đã đọc BOL trên TRY-CATCH
và biết rằng nó sẽ không bắt lỗi cấp 20+ phá vỡ kết nối nhưng dường như không phải vậy (đây chỉ là cấp 16).
Có ai biết tại sao những lỗi này không được bắt chính xác?