SQL Server-无法确定元数据,因为语句'EXECUTE master.dbo.xp_sqlagent_is_starting

时间:2019-10-25 06:41:10

标签: sql-server

在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 个答案:

答案 0 :(得分:1)

从SQL Server 2012起,您需要描述使用OPENROWSETS调用随后又调用其他过程的过程时的预期响应结构。

例如,在SQL Server 2008上,以下SELECT可以获取我在我的函数中使用的jobinfo。

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会使您从OPENROWSET进行的选择无效。

您应该可以使用

EXEC (@Command) AT <linkedServer> 

如果链接服务器被配置为允许它并且该服务器实际上已注册为链接服务器。