Bra*_*101 2 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]')
Run Code Online (Sandbox Code Playgroud)
它按预期返回以下结果:
|Column1|Column2|
| 001 | Pass |
| 010 | Pass |
| 100 | Pass |
Run Code Online (Sandbox Code Playgroud)
但我的问题在于,当其中一个链接服务器离线时(例如 [ 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].
Run Code Online (Sandbox Code Playgroud)
错误很明显,但我想知道的是,我是否可以在查询中放入任何内容,这些内容将继续执行并返回其他两个链接服务器的结果,并且只需跳过 [ linkedserver2 ] ,如下所示:
|Column1|Column2|
| 001 | Pass |
| 100 | Pass |
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用 Try...Catch 但我还不是那个程度的 SQL 专家。任何帮助,将不胜感激!
谢谢。
感谢Alex K.向我指出我需要查看有关TRY..CATCH的内容,以帮助我获得所需的工作。:)
Jeroen Mostert我检查了你所说的内容,但我不能放手,所以我尝试了一些东西以及Alex K. 评论的TRY..CATCH链接,我得到了一些 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
Run Code Online (Sandbox Code Playgroud)
谢谢大家的帮助!
| 归档时间: |
|
| 查看次数: |
2523 次 |
| 最近记录: |