4

下面的 SQL Server 作业总是以返回代码 0 退出,表示成功,而实际上它没有完成它的工作,即它没有删除“test.txt”。如何捕获实际的退出代码(例如 %ERRORLEVEL%,或类似“权限被拒绝”的消息,或任何有意义的响应,指示在 msdb.dbo.sp_add_jobstep 上 @command 的成功或失败)?

评论:

  • {DBname}是我拥有的数据库的名称
  • {proxyName}是 SQL Server 代理的名称(对“操作系统 (CmdExec)”子系统有效)属于凭据,该凭据映射到 SQL Server 中对{folderUNC}具有完全控制权的 Windows 域登录
  • {folderUNC}是“test.txt”所在文件夹的完整 UNC 路径

一些可能有用的细节:

  • 服务器:Microsoft SQL Server 企业版(64 位)版本 9.00.4060.00
  • 操作系统: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
4

1 回答 1

3

问题似乎在于它失败时del没有设置。errorlevel有几种方法可以“解决”这个问题,但我个人会选择编写自己的 delete.exe 或通过 .bat 文件。

示例:(删除.bat)

@echo off

del "%1"
if exist "%1" GOTO FAIL
EXIT /B 0

:FAIL
ECHO "File still there ! (%1)"
EXIT /B 1

你可以这样称呼它(@command):

delete.bat c:\test.txt

当文件在据称被删除后仍然存在时,它将返回失败。

于 2012-10-10T18:58:58.303 回答