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命令时,除要正确配置必要的环境变量外,还要给予命令执行所涉及到的必须的权限。

时间: 2024-10-13 02:57:47

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

'telnet' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

Win7或者win8等是默认没有安装telnet功能,所以你直接用telnet命令是用不了的: 下面介绍在win8下面如何操作:“控制面板”-->“程序”(在左下角)-->程序和功能--->“启用或关闭Windows功能”,勾上“telnet客户端”,确定就可以正常使用telnet命令了. 'telnet' 不是内部或外部命令,也不是可运行的程序 或批处理文件.

JNI之——'cl' 不是内部或外部命令,也不是可运行的程序或批处理文件

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46604315 问题的出现: 今天卸载了VS2010,重装vs2008后,发现qtcreator不能用了,弹出如下的界面: qtcreator 'cl' 不是内部或外部命令,也不是可运行的程序或批处理文件 解决方案: 将D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin加入到环境变量Path中,D:\Program

pip不是内部或外部命令也不是可运行的程序或批处理文件的问题

当我用windows电脑 pip install missingno 时 它居然会报pip不是内部或外部命令也不是可运行的程序或批处理文件的问题! 解决方法: 1)找到 pip.exe 所在位置,一般安装过Anaconda之后都会有这个文件,即已经安装过pip了,出现上面的问题是因为未在环境变量中添加它的路径. 2)D:\downloads\Anacoda\Scripts   这是在电脑里的位置 3)添加到环境变量中: 在此电脑中 - 属性 - 环境变量 - 系统变量 - Path - 编辑 4

CMD命令:不是内部或者外部命令也不是可运行的程序或批处理文件

https://blog.csdn.net/l_mloveforever/article/details/79513681 前言: 相信有很多小伙伴都比较喜欢使用Command命令来快速的打开或运行程序,但是有些时候命令提示符会和我们开个小玩笑.今天我就教大家如何管教这个不听话的cmd! 场景: 看有些大神在命令提示符里输入两句命令就能执行一大串东西,本着学习的态度,先试试再说!没成想出现了:“不是内部或外部命令,也不是可运行的程序或批处理文件.” 通过各种查各种找,终于发现问题的所在:原来是环

20200221_python虚拟环境在Windows下安装配置_virtualenv不是内部或外部命令也不是可运行的程序或批处理文件

1. 使用管理员启动命令行; 2. 安装虚拟环境 a)      .\pip install virtualenv  -i https://pypi.douban.com/simple/ b)       .\pip install virtualenvwrapper-win -i https://pypi.douban.com/simple/ 3.  解决错误 a)      添加ignore 4.  输入.\workon 出现这个, 表示安装成功: 5. 配置虚拟环境路径, 如果不配置WOR

Windows中安装jdk,出现javac不是内部或外部命令 也不是可运行的程序

在经过多次实验,终于解决了在dos窗口验证jdk是否安装成功的错误提示-----javac不是内部或外部命令 也不是可运行的程序 首先要明确的是 在新建 JAVA_HOME , CLASSPATH文件是在系统变量里创建,而不是在用户变量里创建. 在JAVA_HOME:E:\AUTMuLu\java\jdk   ----jdk的安装路径 CLASSPATH:  .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\bin; -

‘cnpm' 不是内部或外部命令,也不是可运行的程序

昨天用npm 安装环境,实在太慢了,就想用cnpm,然后发现提示‘cnpm' 不是内部或外部命令,也不是可运行的程序. 看了很多方法,选择了下面这个,运气好到爆棚,就直接可以用了.其他的方法暂未去了解.先保存一种吧. 一.在进入创建的文件夹后,利用淘宝npm镜像安装相关依赖 npm install -g cnpm --registry=https://registry.npm.taobao.org 二.在cmd中输入cnpm -v就可以看是否安装成功. 'cnpm' 不是内部或外部命令,也不是可

'pybot.bat' 不是内部或外部命令,也不是可运行的程序

在通过命令行工具 运行RobotFramework的文件, 会使用到pybot.bat. 在dos输入pybot提示'pybot' 不是内部或外部命令,也不是可运行的程序或批处理文件, 可以在python的安装路径下添加一个文件, pybot.bat. 文件中的内容如下: @echo offc:\python27\python.exe -m robot.run %* 接下来就可以运行成功了: 'pybot.bat' 不是内部或外部命令,也不是可运行的程序 原文地址:https://www.cnb

Android错误笔记:adb不是内部或外部命令 也不是可运行的程序

一般如果按照网上的Eclipse配置教程操作的话,如果出现在dos界面输入adb出现:“adb不是内部或外部命令 也不是可运行的程序.”这个问题一般不会影响android的大部分开发,但需要用到调用到数据库的时候,则需要用到adb. 可以尝试以下方法. 解决方法: 在sdk的安装目录里找到platform-tools文件夹,复制里面adb.exe. AdbWinApi.dll. AdbWinUsbApi.dll三个文件到,粘贴到DOS窗口显示的运行路径.如下图,粘贴到C:\User\chp.里.