当链接服务器关闭/不可用时,OPENQUERY会发生什么?

时间:2014-07-15 12:37:45

标签: sql-server sql-server-2008 linked-server openquery

在SQL Server 2008数据库的存储过程中,我在OPENQUERY语句的FROM子句中添加了SELECT,而后者又包含OPENQUERY {1}},像这样:

SELECT MyField
FROM OPENQUERY (LinkedServer, 
               'select MyField
                from OPENQUERY (OtherServer,
                                ''select t.SomeField as [MyField]
                                  from table t'');

现在,我想知道如果这些服务器中的任何一个由于某种原因而关闭会发生什么。它只返回一个空结果集还是抛出错误?另外,如果OtherServer关闭,我是否需要处理外部OPENQUERY中的错误?

重要的是在sproc中处理所有内容,即不应将错误传播给sproc的调用者。

如果链接服务器不可用,MSDN documentation on OPENQUERY不会详细说明任何行为。

我在DBA.SE上发现this answer提到了sp_testlinkedserver sproc。是这样称道的吗?我如何使用它来测试OtherServer

1 个答案:

答案 0 :(得分:0)

我们通过更改OtherServer的凭据对其进行了测试,以便内部OPENQUERY失败。发生异常:

  

无法初始化OLE DB提供程序的数据源对象" MSDASQL"对于链接服务器" OtherServer"。   OLE DB提供程序" MSDASQL"对于链接服务器" OtherServer"返回消息" [MySQL] [ODBC 5.3(a)驱动程序]用户访问被拒绝' [用户]' (使用密码:是)"。

并将其传播到存储过程。因此,围绕TRY...CATCH块中的查询应该提供正确的错误处理方法。