在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
?
答案 0 :(得分:0)
我们通过更改OtherServer
的凭据对其进行了测试,以便内部OPENQUERY
失败。发生异常:
无法初始化OLE DB提供程序的数据源对象" MSDASQL"对于链接服务器" OtherServer"。 OLE DB提供程序" MSDASQL"对于链接服务器" OtherServer"返回消息" [MySQL] [ODBC 5.3(a)驱动程序]用户访问被拒绝' [用户]' (使用密码:是)"。
并将其传播到存储过程。因此,围绕TRY...CATCH
块中的查询应该提供正确的错误处理方法。