2017-02-24 5 views
0

50 개의 연결된 서버에서 일부 데이터를 선택하는 뷰 또는 프로 시저를 만들어야하지만 일부는 오프라인 일 수 있습니다 (잘못된 인터넷).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

데이터를 저장하고 distinct .. from temp 테이블에서 use를 검색하기 위해 글로벌 임시 테이블을 만듭니다. –

답변

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