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