我正在设置一项工作,以遍历链接服务器的列表并针对每个服务器执行特定的查询。我正在尝试在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级)。
有谁知道为什么不能正确捕获这些错误?