Отловить ошибки при запросе с линкованных серверов

debirs
Дата: 26.02.2010 18:31:18
Добрый день!

Имеем несколько прилинкованных серверов. Нужно сделать запрос типа
select 'srv1' as srvname, data from link1
union
select 'srv2' as srvname, data from link2
union
--.. и.т.д.

Хотелось бы чтобы при недоступности одного/нескольких серверов (выключен, нет связи и т.п.) запрос выдавал что-то вроде
srvnamedata
srv134324
srv165456
srv134543
srv2Ошибка получения данных
srv3646656
srv3646674
srv3633656
......


Поможет ли мне TRY ... CATCH? Возникли сомнения, ловит ли он ошибки соединения с сервером...
Le Peace
Дата: 26.02.2010 18:34:35
sp_testlinkedserver
debirs
Дата: 26.02.2010 18:57:14
Le Peace
sp_testlinkedserver


Текст запроса в таком случае генерировать динамически?
А если связь с сервером пропадет сразу после удачного выполнения sp_testlinkedserver ?
Crimean
Дата: 26.02.2010 19:22:51
> Хотелось бы чтобы при недоступности одного/нескольких серверов
> запрос выдавал что-то вроде

в лоб - нереально. по сути можете не получить секцию с "плохого" сервера + эксепшен об этом. а на основании этой инфы доклеить строки в результат. но тогда напрашивается времянка, получение в нее секций данных от каждого сервера по отдельности. если нет - дописываем причину и идем дальше. а раз так, то я бы пошел в сторону exec server.base.owner.sp_executesql
debirs
Дата: 26.02.2010 19:50:59
Crimean
> Хотелось бы чтобы при недоступности одного/нескольких серверов
> запрос выдавал что-то вроде

в лоб - нереально. по сути можете не получить секцию с "плохого" сервера + эксепшен об этом. а на основании этой инфы доклеить строки в результат. но тогда напрашивается времянка, получение в нее секций данных от каждого сервера по отдельности. если нет - дописываем причину и идем дальше. а раз так, то я бы пошел в сторону exec server.base.owner.sp_executesql


Т.е., если упрощенно, то как-то так? (на неточности в синтаксисе внимание не обращайте :) )
DECLARE @sqlstring varchar(1000)
@sqlstring='select ''srv1'',data from srv1 ' --пусть srv1 будеть всегда доступным. Для упрощения примера :)
IF sp_testlinkedserver(srv2) @sqlstring=@sqlstring+' union select ''srv2'',data from srv2 '
ELSE @sqlstring=@sqlstring+' union select ''srv2'',''Failed!'' from srv2 '

sp_executesql(@sqlstring)


Crimean
Дата: 26.02.2010 20:03:37
нет, скорее так:

declare @Temp table ( ... ) -- а возможно и #

declare cursor -- курсор по серверам и базам

open

while 1=1 begin

fetch next from into @ServerName, @dbName

if @@fetch_status <> 0 break

set @ProcName = @ServerName + '.' + @dbName + '.sbo.sp_executesql'

try

insert into @Temp ( ... )
exec @RetCode = @ProcName N'select ...'

catch

if <ERROR> insert into @Temp ( ... ) values ( 'а нет связи, да' )

end

select * from @Temp

обработка доступности сервера - очень условная. обращение к серверу как к линкеду - очень условное. лично я бы сделал через свою DLL :) можно через CLR
debirs
Дата: 27.02.2010 10:04:36
Спасобо за подсказки :)

Буду думать.