以下 SQL Server 作业始终退出并返回代码 0 表示成功,而实际上它没有执行其作业,即它不会删除“test.txt”。
如何捕获实际的退出代码(例如 %ERRORLEVEL% 或“权限被拒绝”之类的消息,或指示 msdb.dbo.sp_add_jobstep 上 @command 成功或失败的任何有意义的响应)?
Remarks:
-
{DBname} 是我拥有的数据库的名称
-
{proxyName} 是 SQL Server 代理代理(对“操作系统 (CmdExec)”子系统有效)的名称,属于映射到 SQL Server 中 Windows 域登录的凭据,该凭据具有完全控制{folderUNC}
-
{folderUNC} 是“test.txt”所在文件夹的完整 UNC 路径
一些可能有用的细节:
- 服务器:Microsoft SQL Server 企业版(64 位)版本 9.00.4060.00
- 操作系统:Microsoft Windows NT 5.2 (3790)
- 我不是系统管理员,只是数据库{DBname}的所有者
CODE:
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