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の変更点は何ですか?
この問題に関して、SQL Server 2012と2016の間で(私が見ることができる)何も変更されていません。一時テーブル、複数の結果セット、拡張ストアドプロシージャ、CLRオブジェクトなどで機能しないことは、SQL Server 2012で導入されて以来すべてsp_describe_first_result_set
の制限でした。したがって、実際にこれを実行していると思いますSQL Server 2012より前のバージョンで機能していました。
とはいえ、WITH RESULT SETS
で回避策を見つけた場合でも、これら2つのシステムストアドプロシージャの定義を確認し、実際に使用しているコードのサブセクションをにコピーすることを強くお勧めします。操作を直接行うストアドプロシージャ。この方法では、現在使用している抽象化の複数の追加レイヤーは必要ありません(例:OPENROWSET
など)。
定義を取得するには、以下を試してください。結果のXMLをコピーしてテキストエディターに貼り付け、<
および>
をそれぞれの<
および>
文字に置き換えます。
USE [msdb];
SELECT OBJECT_DEFINITION(OBJECT_ID(N'msdb.dbo.sp_help_job')) FOR XML PATH('');