Sql-Server

無法確定元數據,因為語句呼叫了擴展儲存過程

  • January 15, 2021

在 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('');

引用自:https://dba.stackexchange.com/questions/177861