web-dev-qa-db-ja.com

ステートメントが拡張ストアドプロシージャを呼び出すため、メタデータを特定できませんでした

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 [バッチ開始行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の変更点は何ですか?

7

この問題に関して、SQL Server 2012と2016の間で(私が見ることができる)何も変更されていません。一時テーブル、複数の結果セット、拡張ストアドプロシージャ、CLRオブジェクトなどで機能しないことは、SQL Server 2012で導入されて以来すべてsp_describe_first_result_setの制限でした。したがって、実際にこれを実行していると思いますSQL Server 2012より前のバージョンで機能していました。

とはいえ、WITH RESULT SETSで回避策を見つけた場合でも、これら2つのシステムストアドプロシージャの定義を確認し、実際に使用しているコードのサブセクションをにコピーすることを強くお勧めします。操作を直接行うストアドプロシージャ。この方法では、現在使用している抽象化の複数の追加レイヤーは必要ありません(例:OPENROWSETなど)。

定義を取得するには、以下を試してください。結果のXMLをコピーしてテキストエディターに貼り付け、&lt;および&gt;をそれぞれの<および>文字に置き換えます。

USE [msdb];
SELECT OBJECT_DEFINITION(OBJECT_ID(N'msdb.dbo.sp_help_job')) FOR XML PATH('');
6
Solomon Rutzky