如果SELECT中的一台或多台链接服务器脱机,则导致链接服务器SELECT UNION

时间:2018-07-12 11:52:27

标签: sql-server linked-server openquery

我正在创建视图,但是在此之前,我正在测试并使用多个链接服务器在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专家。任何帮助将不胜感激!

谢谢。

1 个答案:

答案 0 :(得分:1)

感谢 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

谢谢你们的帮助!