2012-09-04 79 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 

它將返回爲失敗當文件被假想後仍然存在刪除。

相關問題