2017-02-24 1 views
0

Ich muss Ansicht oder Prozedur erstellen, die einige Daten von 50 verbundenen Servern auswählt, aber einige von ihnen können offline sein (schlechtes Internet).SQL Wie Union wählt von Verbindungsservern mit Konnektivitätsprüfung

Ich habe dieses Stück Code

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 

Aber es stellt sich nach wie vor Fehler über Konnektivität und bricht ganze Skript. Das nächste, was ich brauche, muss durch alle verbundenen Server und union Ergebnisse in einem großen Ergebnis gehen.

Irgendwelche Ideen? Dank

+0

Erstelle globale temp tabel, um Daten zu speichern und usainin distinct ..from temporäre Tabelle abzurufen –

Antwort

0

Der folgende Code verwendet einen Cursor, um jeden verbundenen Server zu durchlaufen. Wenn die Verbindung gut ist, wird dynamic sql hinzugefügt, andernfalls wird eine Nachricht gedruckt. Das Ende dynamisches sql ist nur für die guten Verbindungen:

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