2017-02-24 17 views
0

我需要创建视图或过程,从50个链接的服务器中选择一些数据,但其中一些可能处于脱机状态(不良Internet)。SQL如何结合从连接服务器中选择连通性检查

我有这样一段代码

declare @srvr nvarchar(128), @retval int; 
set @srvr = 'SERVER103'; 
begin try 
    exec @retval = sys.sp_testlinkedserver @srvr; 
end try 
begin catch 
    set @retval = sign(@@error); 
end catch; 
if @retval = 0 
    select sel1.sum1, sel1.sum2, sel2.sum1, sel2.sum2 from 
     (select sum(column1) as sum1, sum(column2) as sum2 from [SERVER103].[dbo].[table] where date like '201702%' group by column1, column2) as sel1 
     (select sum(column1) as sum1, sum(column2) as sum2 from [SERVER103].[dbo].[table2] where date like '201702%' group by column1, column2) as sel2 

但它仍然会引发错误有关连接和破坏整个脚本。 接下来我需要的东西必须经过所有链接的服务器和联合结果才能成为一个大的结果。

任何想法? 谢谢

+0

创建全局临时表tabel来存储数据和检索usein distinct ..from临时表 –

回答

0

以下代码使用游标来遍历每个链接的服务器。如果连接良好,则添加动态sql,否则会打印一条消息。最终的动态sql只是为了很好的链接:

declare @loop as int=1 
declare @srvname as nvarchar(100) 
declare @sql as nvarchar(max)=N'' 
declare @Date as varchar(10) = '201702%' 
declare srvcursor cursor for select srvname from sysservers where srvname <> @@SERVERNAME 
open srvcursor 
fetch next from srvcursor into @srvname 
WHILE @@FETCH_STATUS = 0 
    begin 
    begin try 
    exec sys.sp_testlinkedserver @srvname 
    set @[email protected]+N'select sel1.sum1, sel1.sum2, sel2.sum1, sel2.sum2 from 
     (select sum(column1) as sum1, sum(column2) as sum2 from [' + @srvname + N'].[dbo].[table] where date like ''' + @Date + N''' group by column1, column2) as sel1 
     (select sum(column1) as sum1, sum(column2) as sum2 from [' + @srvname + N'].[dbo].[table2] where date like ''' + @Date + N''' group by column1, column2) as sel2 
     UNION ' 
    end try 
    begin catch 
    print @srvname + 'is broken.' 
    end catch 
    fetch next from srvcursor into @srvname 
    end 
if @sql <> N'' 
    begin 
    set @sql = left(@sql, len(@sql)-6) 
    print @sql 
    --exec(@sql) 
    end 
close srvcursor 
deallocate srvcursor