Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何捕获CMDEXEC SQL Server作业的退出代码?_Sql Server_Exit Code_Sql Server Agent_Sql Server Job - Fatal编程技术网

Sql server 如何捕获CMDEXEC SQL Server作业的退出代码?

Sql server 如何捕获CMDEXEC SQL Server作业的退出代码?,sql-server,exit-code,sql-server-agent,sql-server-job,Sql Server,Exit Code,Sql Server Agent,Sql Server Job,以下SQL Server作业始终退出,返回代码0表示成功,但实际上它没有执行其作业,即它没有删除“test.txt”。 如何捕获实际的退出代码(例如%ERRORLEVEL%,或类似“权限被拒绝”的消息,或任何指示msdb.dbo.sp_add_jobstep上@command成功或失败的有意义响应) 备注: {DBname}是我所拥有的数据库的名称 {proxyName}是SQL Server代理代理(对“操作系统(CmdExec)”子系统处于活动状态)的名称,该代理属于映射到SQL Serv

以下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}的所有者
代码:

使用{DBname}
去
将@returnCode声明为INT
声明@jobName NVARCHAR(128)
声明@jobStep1Name SYSNAME
SET@jobName='CMDEXEC测试作业'
SET@jobStep1Name='CMDEXEC测试作业步骤1'
EXEC@returnCode=msdb.dbo.sp_添加_作业
@job_name=@jobName,
@启用=1,
@开始步骤id=1,
@通知\u级别\u事件日志=2,
@删除_级别=0;
如果(@@ERROR 0或@returnCode 0)
打印错误@sp_add_job@@错误='+转换(VARCHAR(10),@@ERROR)+
N'@returnCode='+CONVERT(VARCHAR(10),@returnCode
EXEC@returnCode=msdb.dbo.sp\u add\u jobstep
@job_name=@jobName,
@步骤_id=1,
@步骤名称=@jobStep1Name,
@子系统='CMDEXEC',
@命令='DEL{folderUNC}\test.txt',
@cmdexec\u成功\u代码=0,
@成功时行动=1,
@在_fail _action=2时,
@proxy_name='{proxyName}';
如果(@@ERROR 0或@returnCode 0)
打印N'Error@sp_add_job。@@Error='+CONVERT(VARCHAR(10),@@Error)+
N'@returnCode='+CONVERT(VARCHAR(10),@returnCode
EXEC@returnCode=msdb.dbo.sp\u add\u jobserver
@job_name=@jobName;
如果(@@ERROR 0或@returnCode 0)
打印N'Error@sp_add_job。@@Error='+CONVERT(VARCHAR(10),@@Error)+
N'@returnCode='+CONVERT(VARCHAR(10),@returnCode
EXEC@returnCode=msdb.dbo.sp_start_作业
@job_name=@jobName,
@步骤名称=@jobStep1Name;
如果(@@ERROR 0或@returnCode 0)
打印N'Error@sp_add_job。@@Error='+CONVERT(VARCHAR(10),@@Error)+
N'@returnCode='+CONVERT(VARCHAR(10),@returnCode
EXEC@returnCode=msdb.dbo.sp_delete_作业
@job_name=@jobName;
如果(@@ERROR 0或@returnCode 0)
打印N'Error@sp_add_job。@@Error='+CONVERT(VARCHAR(10),@@Error)+
N'@returnCode='+CONVERT(VARCHAR(10),@returnCode

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

示例:(delete.bat)

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

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

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
@echo off

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

:FAIL
ECHO "File still there ! (%1)"
EXIT /B 1
delete.bat c:\test.txt