我正在创建 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/