4

次の 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
4

1 に答える 1

3

失敗したとき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

おそらく削除された後、ファイルがまだそこにある場合、失敗として返されます。

于 2012-10-10T18:58:58.303 に答える