【发布时间】:2018-07-12 11:52:26
【问题描述】:
我正在创建视图,但在创建视图之前,我正在测试和处理多个链接服务器,它们在选择联合语句中返回列值,我使用以下简单代码:
SELECT * FROM OPENQUERY ([linkedserver1],'SELECT TOP 1 [Column1], [Column2] FROM [db].[table]')
UNION ALL
SELECT * FROM OPENQUERY ([linkedserver2],'SELECT TOP 1 [Column1], [Column2] FROM [db].[table]')
UNION ALL
SELECT * FROM OPENQUERY ([linkedserver3],'SELECT TOP 1 [Column1], [Column2] FROM [db].[table]')
它按预期返回以下结果:
|Column1|Column2|
| 001 | Pass |
| 010 | Pass |
| 100 | Pass |
但我的问题在于,当其中一个链接服务器脱机示例 [linkedserver2] 时,没有显示任何结果,我只得到:
OLE DB provider "SQLNCLI11" for linked server "[linkedserver2]" returned
message "Login timeout expired".
OLE DB provider "SQLNCLI11" for linked server "[linkedserver2]" returned
message "A network-related or instance-specific error has occurred while
establishing a connection to SQL Server. Server is not found or not
accessible. Check if instance name is correct and if SQL Server is
configured to allow remote connections. For more information see SQL
Server Books Online.".
Msg 53, Level 16, State 1, Line 0
Named Pipes Provider: Could not open a connection to SQL Server [53].
错误很明显,但我想知道的是,我是否可以在查询中添加任何内容,这些内容将继续执行并返回其他两个链接服务器的结果,然后跳过 [linkedserver2]如下图:
|Column1|Column2|
| 001 | Pass |
| 100 | Pass |
我正在考虑使用 Try...Catch,但我还不是那种程度的 SQL 专家。任何帮助将不胜感激!
谢谢。
【问题讨论】:
-
不使用
UNION ALL,但您可以将SELECTs 拆分为动态执行的单独语句并将其结果插入临时表中。当然,这在视图中是行不通的,而且我很确定你在那里绝对不走运,因为如果服务器无法访问,该命令甚至不会获得执行计划。表值函数也不起作用,因为那里不允许使用TRY .. CATCH。不过,存储过程可以做到这一点。到现在为止,您应该对为什么链接服务器经常出现问题有了一个很好的了解...
标签: sql-server linked-server openquery