web-dev-qa-db-ja.com

SQLサーバージョブステップからの出力はどのように考慮されますか?

要するに: SQL Serverのジョブ履歴にPRINTメッセージしか表示されないようです。有効な履歴出力の定義は何ですか?

Background:UPDATE product SET ...のようなステートメントを実行するだけでは、ジョブ履歴に痕跡は残りません([履歴にステップ出力を含める]がオンになっているかどうかに関係なく)。クエリアナライザーで同じステートメントを実行すると、「(X行が影響を受けています)」と表示されます。

変数を作成し、更新後に@@ ROWCOUNTの内容を割り当てることにより、影響を受ける行の数を含むメッセージを作成して印刷できます。これはジョブ履歴に含まれます。これは正常に機能しますが、Transact-SQLスクリプトジョブステップからの(履歴に書き込まれる)outputの定義を知りたいのですが。印刷された文字列以外に何が含まれていますか?

履歴はSQL Server Management Studioのクエリウィンドウ(以前はクエリアナライザーと呼ばれていました)の[メッセージ]ウィンドウに表示されるものとまったく同じであると簡単に思うかもしれませんが、そうではありません。

6
Andreas Jansson

T-SQLジョブステップの場合、「出力」は「メッセージ」を指します-PRINTおよびRAISERRORを介して送信される通知。結果セットも「出力」として含まれますが、PRINT/RAISERRORメッセージがない場合のみ、それ以外の場合はPRINT/RAISERRORメッセージのみです。含まれています。

このテストを試してください:

ジョブステップ1

定義:

PRINT ' ** Line 1 ** ';

SELECT ' ** Line 2 ** ' AS [Line Two];

RAISERROR(' ** Line 3 ** ', 10, 1);

ジョブ履歴に出力:

メッセージ
ユーザーとして実行:NT SERVICE\SQLSERVERAGENT。 ** 1行目** [SQLSTATE 01000](メッセージ0)** 3行目** [SQLSTATE 01000](メッセージ50000)。ステップは成功しました。

ジョブステップ2

定義:

SELECT ' ** Line B1 ** ' AS [Line B-One];

--PRINT ' ** Line B2 ** '; -- uncomment and output will show this and not "Line B1"

ジョブ履歴に出力:

メッセージ
ユーザーとして実行:NT SERVICE\SQLSERVERAGENT。ラインB-One
---------------
**行B1 **
(1行が影響を受けました)。ステップは成功しました。

ジョブステップ

定義:

PRINT ' ** Start ** ';

RAISERROR(' ** Test Exception ** ', 16, 1);

PRINT ' ** End ** ';

ジョブ履歴に出力:

メッセージ
ユーザーとして実行:NT SERVICE\SQLSERVERAGENT。 **開始** [SQLSTATE 01000](メッセージ0)**テスト例外** [SQLSTATE 42000](エラー50000)**終了** [SQLSTATE 01000](メッセージ0)。ステップは失敗しました。


質問の次のステートメントについて:

[SSMS]の[クエリ]ウィンドウの[メッセージ]ペインに表示されるものとまったく同じように履歴が表示されると簡単に思うかもしれません[例:「(X行の影響を受ける)」]

確かにそう思うかもしれませんが、SSMSの[メッセージ]タブに表示されるものは、必ずしもSQL Serverからの直接の出力ではありません。 "影響を受けるX行"は、SQL Serverから受け取った直接出力ではなく、表形式データストリーム(TDS)に戻ってきた追加情報に基づいてSSMSによって生成されています。同じことが "GO x"を使用するバッチ反復にも当てはまります。ここで、xは、特定のバッチ( "GO"バッチ区切り文字で終わるバッチ)を送信する回数をSSMSに通知する整数です。 [メッセージ]タブの出力にはBeginning execution loopおよび最後にBatch execution completed 4 times.、ただしこれらはSSMSからのメッセージであり、SQL Serverからのメッセージではありません。

7
Solomon Rutzky

ステップの出力を次のように「テーブル」に送る場合:

enter image description here

Msdbを見ると、PRINTRAISERROR、クエリの結果など、ジョブの最後の実行からのall出力を確認できますdbo.sysjobstepslogsテーブルのデータベース:

SELECT JobName = sj.name
    , StepName = sjs.step_name
    , DateModified = sjsl.date_modified
    , LogText = sjsl.log
FROM dbo.sysjobs sj
    INNER JOIN dbo.sysjobsteps sjs ON sj.job_id = sjs.job_id
    INNER JOIN dbo.sysjobstepslogs sjsl ON sjs.step_uid = sjsl.step_uid;

1つの得点、複数行の出力を表示するには、LogText列の内容をメモ帳(または任意のエディター)にコピーアンドペーストする必要があります。

次のように定義されたジョブで:

USE [msdb]
GO

BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'TestOutput', 
        @enabled=1, 
        @notify_level_eventlog=0, 
        @notify_level_email=0, 
        @notify_level_netsend=0, 
        @notify_level_page=0, 
        @delete_level=0, 
        @description=N'No description available.', 
        @category_name=N'[Uncategorized (Local)]', 
        @owner_login_name=N'[login_name]', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object:  Step [Step1]    Script Date: 4/14/2016 2:41:19 PM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Step1', 
        @step_id=1, 
        @cmdexec_success_code=0, 
        @on_success_action=1, 
        @on_success_step_id=0, 
        @on_fail_action=2, 
        @on_fail_step_id=0, 
        @retry_attempts=0, 
        @retry_interval=0, 
        @os_run_priority=0, @subsystem=N'TSQL', 
        @command=N'SELECT d.name
FROM sys.databases d
WHERE d.database_id > 4
ORDER BY d.name;

PRINT ''test'';', 
        @database_name=N'master', 
        @flags=8
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:

GO

クエリからの出力は次のようになります。

enter image description here

コピーアンドペーストのテキストは次のようになります。

Job 'TestOutput' : Step 1, 'Step1' : Began Executing 2016-04-14 14:38:44

name                                                                                                                            
--------------------------------------------------------------------------------------------------------------------------------
Test

(1 rows(s) affected)

test [SQLSTATE 01000]
3
Max Vernon