Это работает для меня: (т.е. мне нужно только 2 столбца из 30+, возвращаемых sp_help_job
)
SELECT name, current_execution_status
FROM OPENQUERY (MYSERVER,
'EXEC msdb.dbo.sp_help_job @job_name = ''My Job'', @job_aspect = ''JOB''');
Прежде чем это сработает, мне нужно было запустить:
sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE;
.... чтобы обновить таблицу sys.servers
. (т.е. использование собственной ссылки в OPENQUERY по умолчанию отключено.)
По моему простому требованию я не столкнулся ни с одной из проблем, описанных в разделе OPENQUERY превосходной ссылки Ланса.
Россини, если вам нужно динамически установить эти входные параметры, тогда использование OPENQUERY становится немного более неудобным:
DECLARE @innerSql varchar(1000);
DECLARE @outerSql varchar(1000);
-- Set up the original stored proc definition.
SET @innerSql =
'EXEC msdb.dbo.sp_help_job @job_name = '''+@param1+''', @job_aspect = N'''+@param2+'''' ;
-- Handle quotes.
SET @innerSql = REPLACE(@innerSql, '''', '''''');
-- Set up the OPENQUERY definition.
SET @outerSql =
'SELECT name, current_execution_status
FROM OPENQUERY (MYSERVER, ''' + @innerSql + ''');';
-- Execute.
EXEC (@outerSql);
Я не уверен в различиях (если есть) между использованием sp_serveroption
для непосредственного обновления существующей самореференции sys.servers
и использованием sp_addlinkedserver
(как описано в ссылке Ланса) для создания дубликата / псевдоним.
Примечание 1:
Я предпочитаю OPENQUERY, а не OPENROWSET, учитывая, что OPENQUERY не требует определения строки соединения внутри proc.
Примечание 2:
Сказав все это: обычно я бы просто использовал INSERT ... EXEC :) Да, это 10 минут дополнительного набора текста, но если я могу помочь, я предпочитаю не шутить с:
(а) кавычки в кавычках в кавычках и
(б) sys-таблицы и / или хитрые самосвязанные настройки связанных серверов (т. е. для этого мне нужно доверить свое дело нашим всемогущим администраторам баз данных :)
Однако в этом случае я не смог использовать конструкцию INSERT ... EXEC, так как sp_help_job
уже использует ее. («Оператор INSERT EXEC не может быть вложенным.»)