次の SQL Server ジョブは常に成功を示すリターン コード 0 で終了しますが、実際にはそのジョブは実行されません。つまり、"test.txt" は削除されません。実際の終了コード (%ERRORLEVEL% のようなもの、または「許可が拒否されました」のようなメッセージ、または msdb.dbo.sp_add_jobstep での @command の成功または失敗を示す意味のある応答) をキャッチするにはどうすればよいですか?
備考:
- {DBname}は、私が所有しているデータベースの名前です
- {proxyName}は、{folderUNC} へのフル コントロールを持つ SQL Server の Windows ドメイン ログインにマップされる資格情報に属する SQL Server エージェント プロキシ (「オペレーティング システム (CmdExec)」サブシステムに対してアクティブ) の名前です。
- {folderUNC}は、「test.txt」があるフォルダーへの完全な UNC パスです。
役に立つかもしれないいくつかの詳細:
- サーバー: Microsoft SQL Server Enterprise Edition (64 ビット) バージョン 9.00.4060.00
- OS: Microsoft Windows NT 5.2 (3790)
- 私はシステム管理者ではなく、データベース{DBname}の所有者です
コード:
USE {DBname}
GO
DECLARE @returnCode AS INT
DECLARE @jobName NVARCHAR(128)
DECLARE @jobStep1Name SYSNAME
SET @jobName = 'CMDEXEC Test Job'
SET @jobStep1Name = 'CMDEXEC Test Job Step 1'
EXEC @returnCode = msdb.dbo.sp_add_job
@job_name = @jobName,
@enabled = 1,
@start_step_id = 1,
@notify_level_eventlog = 2,
@delete_level = 0;
IF (@@ERROR <> 0 OR @returnCode <> 0)
PRINT N'Error @ sp_add_job. @@ERROR = ' + CONVERT(VARCHAR(10), @@ERROR) +
N' @returnCode = ' + CONVERT(VARCHAR(10), @returnCode
EXEC @returnCode = msdb.dbo.sp_add_jobstep
@job_name = @jobName,
@step_id = 1,
@step_name = @jobStep1Name,
@subsystem = 'CMDEXEC',
@command = 'DEL {folderUNC}\test.txt',
@cmdexec_success_code = 0,
@on_success_action = 1,
@on_fail_action = 2,
@proxy_name = '{proxyName}';
IF (@@ERROR <> 0 OR @returnCode <> 0)
PRINT N'Error @ sp_add_job. @@ERROR = ' + CONVERT(VARCHAR(10), @@ERROR) +
N' @returnCode = ' + CONVERT(VARCHAR(10), @returnCode
EXEC @returnCode = msdb.dbo.sp_add_jobserver
@job_name = @jobName;
IF (@@ERROR <> 0 OR @returnCode <> 0)
PRINT N'Error @ sp_add_job. @@ERROR = ' + CONVERT(VARCHAR(10), @@ERROR) +
N' @returnCode = ' + CONVERT(VARCHAR(10), @returnCode
EXEC @returnCode = msdb.dbo.sp_start_job
@job_name = @jobName,
@step_name = @jobStep1Name;
IF (@@ERROR <> 0 OR @returnCode <> 0)
PRINT N'Error @ sp_add_job. @@ERROR = ' + CONVERT(VARCHAR(10), @@ERROR) +
N' @returnCode = ' + CONVERT(VARCHAR(10), @returnCode
EXEC @returnCode = msdb.dbo.sp_delete_job
@job_name = @jobName;
IF (@@ERROR <> 0 OR @returnCode <> 0)
PRINT N'Error @ sp_add_job. @@ERROR = ' + CONVERT(VARCHAR(10), @@ERROR) +
N' @returnCode = ' + CONVERT(VARCHAR(10), @returnCode