Sql-Server
無法確定元數據,因為語句呼叫了擴展儲存過程
在 sql server 2012 中,我曾經通過獲取 SP_HELP_JOB 的輸出來查看作業
-- https://www.sqlservercentral.com/Forums/Topic259078-8-1.aspx -- getting data from sp_help_job into a temp table -- marcelo miorelli -- 01-april-2013 IF OBJECT_ID('TEMPDB..#JOBiNFO') IS NOT NULL DROP TABLE #JobInfo IF OBJECT_ID('TEMPDB..#ScheduleInfo') IS NOT NULL DROP TABLE #ScheduleInfo SELECT * INTO #JobInfo FROM OPENROWSET('sqloledb', 'server=(local);trusted_connection=yes' , 'set fmtonly off exec msdb.dbo.sp_help_job -- @execution_status=4') SELECT * INTO #ScheduleInfo FROM OPENROWSET('sqloledb', 'server=(local);trusted_connection=yes' , 'set fmtonly off exec msdb.dbo.sp_help_schedule')
現在在 sql server 2016 上這不起作用。
我收到此錯誤消息:
消息 11520,級別 16,狀態 1,過程 sp_describe_first_result_set,第 1 行
$$ Batch Start Line 9 $$無法確定元數據,因為過程“sp_is_sqlagent_starting”中的語句“EXECUTE master.dbo.xp_sqlagent_is_starting @retval OUTPUT”呼叫了擴展儲存過程。
它說
SET FMTONLY ON 可用於僅返回列資訊,不會處理或返回任何行。
對我有用的方式是這樣的:
IF OBJECT_ID('TEMPDB..#JOBiNFO') IS NOT NULL DROP TABLE #JobInfo SELECT * INTO #JobInfo FROM OPENROWSET('sqloledb', 'server=(local);trusted_connection=yes' , 'set fmtonly off; DECLARE @job_id UNIQUEIDENTIFIER = NULL, @job_name SYSNAME = NULL, @job_aspect VARCHAR(9) = NULL, @job_type VARCHAR(12) = NULL, @owner_login_name SYSNAME = NULL, @subsystem NVARCHAR(40) = NULL, @category_name SYSNAME = NULL, @enabled TINYINT = NULL, @execution_status INT = NULL, @date_comparator CHAR(1) = NULL, @date_created DATETIME = NULL, @date_last_modified DATETIME = NULL, @description NVARCHAR(512) = NULL EXEC msdb.dbo.sp_help_job @job_id, @job_name, @job_aspect, @job_type, @owner_login_name, @subsystem, @category_name, @enabled, @execution_status, @date_comparator, @date_created, @date_last_modified, @description 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 2016 中的更改是什麼?
關於這個問題,SQL Server 2012 和 2016 之間沒有任何變化(我可以看到)。自從在 SQL Server 2012 中引入以來,不使用臨時表、多個結果集、擴展儲存過程、CLR 對像等都是限制
sp_describe_first_result_set
。所以,我認為您實際上已經在 SQL Server 之前的版本上執行了它2012 年它會起作用的地方。話雖如此,雖然您確實找到了解決方法 via
WITH RESULT SETS
,但我仍然強烈建議您查看這兩個系統儲存過程的定義,並將您實際使用的程式碼小節複製到執行直接操作。這樣,您將不需要您目前使用的多個額外抽象層(例如OPENROWSET
,等)。嘗試以下方法來獲得定義。將生成的 XML 複製並粘貼到文本編輯器中,並將 和 替換
<
為>
它們各自的<
和>
字元:USE [msdb]; SELECT OBJECT_DEFINITION(OBJECT_ID(N'msdb.dbo.sp_help_job')) FOR XML PATH('');