SQL Server - метаданные не могут быть определены, поскольку оператор 'EXECUTE master.dbo.xp_sqlagent_is_starting - PullRequest
0 голосов
/ 25 октября 2019

В SQL Server 2017 я хочу остановить / запустить задание агента удаленного сервера.

Я выполнил запрос

select * from openrowset('SQLOLEDB',
                          '192.168.56.101,2433';'monitor';'P@ssword',
                          'EXEC msdb.dbo.sp_update_job @job_name=N''AG Sync Check'', @enabled=0')

и получил этот результат.

Msg 11520, Level 16, State 1, Procedure sp_describe_first_result_set, Line 1 [Batch Start Line 9] The metadata could not be determined because statement 'EXECUTE master.dbo.xp_sqlagent_is_starting @retval OUTPUT' in procedure 'sp_is_sqlagent_starting' invokes an extended stored procedure.

Я также проверил с 'set fmtonly on / off' и ничего не изменилось.

Пожалуйста, кто-нибудь поможет мне?

1 Ответ

1 голос
/ 25 октября 2019

Начиная с SQL Server 2012 и выше, вам необходимо описать ожидаемую структуру ответа при использовании OPENROWSETS для вызова процедур, которые в свою очередь вызывают дальнейшие процедуры.

Например, в SQL Server 2008 нижеприведенный SELECT работает для полученияИнформация о задании, которую я использую в моей функции.

SELECT * FROM OPENROWSET(
'sqloledb'
,'server=localhost;trusted_connection=yes'
,'set fmtonly off exec msdb.dbo.sp_help_job')

Однако на SQL Server 2012 и выше это вернет ту же ошибку, что и вы. Чтобы это исправить, нам нужно включить опцию WITH RESULT SETS для описания возвращаемого оператора SELECT. Т.е.

SELECT * FROM OPENROWSET(
'sqloledb'
,'server=localhost;trusted_connection=yes'
,'exec msdb.dbo.sp_help_job WITH RESULT SETS
(
(job_id uniqueidentifier, originating_server nvarchar(30), name sysname, enabled tinyint, description nvarchar(512), start_step_id int, category sysname, owner sysname, notify_level_eventlog int,
notify_level_email int, notify_level_netsend int, notify_level_page int, notify_email_operator sysname, notify_netsend_operator sysname, notify_page_operator sysname, delete_level int,
date_created datetime, date_modified datetime, version_number int, last_run_date int, last_run_time int, last_run_outcome int, next_run_date int, next_run_time int, next_run_schedule_id int,
current_execution_status int, current_execution_step sysname, current_retry_attempt int, has_step int, has_schedule int, has_target int, type int)
)')

По совпадению, приведенный ниже метод указания наборов результатов вызывает ошибку в SQL Server 2008. Но так как вы указали, что работаете в SQL Server 2017, я подозреваю, что если вы опишете выводиспользуя WITH RESULT SETS, запрос должен работать нормально.

Поскольку вы запускаете задание обновления, оно не возвращает значений. Но использование WITH ROWSET NONE делает ваш SELECT FROM OPENROWSET недействительным.

Вы должны иметь возможность использовать

EXEC (@Command) AT <linkedServer> 

Если связанный сервер настроен на его разрешение и сервер фактически зарегистрирован как связанный сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...