sql-server - 如果 SELECT 中的一个或多个链接服务器脱机,则链接服务器 SELECT UNION 结果

标签 sql-server linked-server openquery

我正在创建 View ,但在此之前我正在测试并使用多个链接服务器在 select union 语句中返回列值,我使用以下简单代码:

    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 专家。任何帮助将不胜感激!

谢谢。

最佳答案

感谢 Alex K. 向我指出我需要查看有关 TRY..CATCH 的内容,以帮助我获得所需的工作。 :)

Jeroen Mostert 我检查了你所说的内容,但我无法放手,所以我尝试了一些东西以及 TRY..CATCH 链接 Alex K. 发表了评论,我得到了 UNION ALL 工作的一些解决方案。

它并不漂亮,但至少有用:

    DECLARE @name NVARCHAR(100)
    DECLARE @sql as nvarchar(max)=N''
    DECLARE @Query NVARCHAR(MAX)
    DECLARE getid CURSOR FOR
    SELECT name FROM sys.servers where is_linked = 1

    OPEN getid

    FETCH NEXT FROM getid INTO @name

    WHILE @@FETCH_STATUS = 0
    BEGIN
    BEGIN TRY
         exec sys.sp_testlinkedserver @name
         SET @sql=@sql+N'SELECT * FROM ['+ @name +'].[pacific].[Alarms].[Alarm] UNION All '
    END TRY
    BEGIN CATCH
    END CATCH

    FETCH NEXT FROM getid INTO @name

    END

    SET @Query = substring(@sql, 0, (len(@sql) - 9))
    CLOSE getid
    DEALLOCATE getid

    EXEC sp_executesql @Query

谢谢大家的帮助!

关于sql-server - 如果 SELECT 中的一个或多个链接服务器脱机,则链接服务器 SELECT UNION 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51304969/

相关文章:

mysql - 从 SQL Server(ODBC 连接)使用 MySQL 作为链接服务器时查询缓慢

mysql - Openquery INSERT 语法

sql-server - SQLserver时间戳尝试设置默认值,结果不可读

sql-server - 带有我自己的数据库表和列的 ASP.NET MVC 4 安全架构

sql - 数据库间查询的性能(链接服务器之间)

sql-server - 如何创建链接服务器来连接azure sql DW和MongoDB?

sql-server - SQL OpenQuery 字符串附近的语法不正确

sql - SQL Server OPENQUERY 中的括号标识符问题

sql-server - 使用 cfqueryparams 和 MSSQL Server 时 CFQUERY 超时?

sql - 如何在 T-SQL 中插入另一个表中的列?