首页 > 代码库 > SQL Server使用xp_cmdshell提示“不是内部或外部命令,也不是可运行的程序 或批处理文件”

SQL Server使用xp_cmdshell提示“不是内部或外部命令,也不是可运行的程序 或批处理文件”

    数据迁移后,使用SQL Server 2012 备份数据库,备份完成后自动压缩成rar文件,以前执行没有问题的语句现在只能做备份,而不能自动压缩并删除备份,说明问题出在执行备份后压缩时出现问题。将语句复制到查询分析器执行报错,提示“RAR.EXE不是内部或外部命令,也不是可运行的程序 或批处理文件”。

SQL语句如下:

/*自动压缩文件,并在压缩完成后删除原文件*/

declare @sqlPathB  varchar(150)   ---数据路径

set @sqlPathB=‘RAR.EXE  a -dw -ep E:\EFBackup\EFNETSYS\EFNETSYS‘+rtrim(convert(varchar(20),getdate(),112))+‘.rar ‘  --创建压缩文件及存放路径,-df或-dw表示压缩后即删除原文件,-ep表压缩包内不带路径

+‘E:\EFBackup\EFNETSYS\EFNETSYS‘+rtrim(convert(varchar(20),getdate(),112))+‘0000.bak‘  --取被压缩文件及路径

exec xp_cmdshell @sqlPathB



    首先,检查环境变量。

    自动压缩需调用WinRar的Rar.exe,我的WinRar安装在D盘,上面的SQL语句执行时,需使用WinRar安装目录下的Rar.exe,因此,环境变量中必须添加WinRra安装路径。经检查发现,因为数据库迁移,环境变量忘记添加。按以下顺序添加(以Win server 2008为例):

1、桌面上右键【计算机】,找到【属性】,点击【高级系统设置】,调出【系统属性】对话框,并找到【环境变量】

技术分享

2、点开【环境变量】,在【系统变量】里,找到并选中【Path】变量,点击【编辑】以打开【编辑系统变量】对话框

技术分享

3、在打开的对话框里,将WinRar的安装路径放在【变量值】的最后,我这里是D:\Program Files\WinRAR,这里要注意,新放置的路径,与其他路径要用半角分号进行分隔。

技术分享

4、添加完后,一路确定返回即可。

5、测试是否正常,在CMD中,执行“rar.exe”,回车,窗口列出命令用法,说明设置成功。

技术分享


设置完成后,应该可以正常使用,谁知,执行SQL语句后依然不能正常进行压缩,问题仍未解决,既然在DOS命令窗口rar.exe可以正常执行,说明问题与压缩命令没有关系,继续查找原因。


其次,检查SQL Server设置。

因为只是在SQL中调用xp_cmdshell组件,现在rar.exe在DOS命令窗口可以正常运行,现在只好从SQL Server入手查找原因。因为数据库压缩备份是利用SQL Server代理来自动执行的,现从这里入手:

1、打开SQL Server配置管理器,找到SQL Server服务,查看SQL Server代理服务

技术分享2、突然发现SQL Server代理的登录身份为LocalService。

想到以前也有一次是因为登录身份导致SQL使用问题,后来改成LocalSyste就可以正常使用,怀疑是登录身份的权限不足,导致无法正常调用rar.exe导致的。

3、修改SQL Server代理的登录身份为LocalSystem。

在SQL代理服务上右键,选择属性,打开SQL代理属性对话框,并在登录身份为的内置账户下接菜单,将Local Service更为Local System,之后点击确定。

技术分享

系统提示因帐户变更,SQL代理服务重启,点击是重启服务即可。

技术分享


设置完成后,再次执行SQL语句,发现压缩成功。



总结:

xp_cmdshell在执行cmd命令时,除要正确配置必要的环境变量外,还要给予命令执行所涉及到的必须的权限。

SQL Server使用xp_cmdshell提示“不是内部或外部命令,也不是可运行的程序 或批处理文件”