2012-09-04 45 views
3

以下SQL Server作业总是退出,返回代码0表示成功,但事实上它并未执行其作业,即它不会删除“test.txt”。 如何捕获实际的退出代码(类似于%ERRORLEVEL%,或'许可被拒绝'的消息,或者任何有意义的响应,指示msdb.dbo.sp_add_jobstep上@command的成功或失败)?如何捕获CMDEXEC SQL Server作业的退出代码?

备注:

  • {数据库名称}是数据库我
  • {的proxyName}的所有者是SQL Server代理的代理的名称(即活跃于的名字在“操作系统(CmdExec)”属于映射到SQL Server中具有完全控制 Windows域登录凭据子系统){} folderUNC
  • {} folderUNC是完整的UNC路径到哪里 “的test.txt” 是

的一些细节,可能是有用的文件夹:

  • 服务器:Microsoft SQL Server企业版(64位)版本9.00 .4060.00
  • OS:微软的Windows NT 5.2(3790)
  • 我不是一个系统管理员,但只有数据库的所有者{}数据库名称

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 

回答

2

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

例子:(delete.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 

它将返回为失败当文件被假想后仍然存在删除。

相关问题