求助:在sqlserver 下面执行dos 命令问题(CMDExec)

junlintianxia07 2010-06-10 09:30:01
现在我们系统是这样要求的:把一台服务器(A)的硬盘映射到其他三台机器(B、C、D)上面,这样其他机器的sqlserver 备份的文件全部都放在这个共享的网络映射驱动器盘上面 便于管理
现在问题是:
在B、C、D 三台服务器上面已经可以做到把备份文件打包到各自的本地硬盘,但是想通过sql server 的CMDExec 执行一个拷贝命令的时候:
xcopy K:\SQL_BAK\source\*.* Z:\dest\ /s /e /y
总是提示失败,但是直接把这句话写在.bat 中,直接执行dos 命令 是成功的!
我查看了下原因 sqlserver 是使用system 帐户来执行这个命令, 是不是这个账户 无论如何设置都找不到A上面映射到B、C、D 的网络映射驱动器?
前提是我必须把这个拷贝命令同时放在sql server 的作业里面来执行才行,否则在外面再做计划任务调用批处理 就不知道sql server 的文件是否备份压缩完毕 会出意外的!
我的问题就是如何通过sql server 执行一段批处理,来完成这个从本地硬盘到共享硬盘的拷贝操作

是不是写代码调用外部的批处理?,或者vbs ? 小弟不会写,希望各位高手 帮忙写出代码,给出详细步骤!

跪谢!!!急!!!
...全文
639 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
menggang9801 2010-06-13
  • 打赏
  • 举报
回复
算了,我不过有点不平衡。并不是真的要分数。对了,以后有问题多上CSDN
menggang9801 2010-06-12
  • 打赏
  • 举报
回复
???
junlintianxia07 2010-06-12
  • 打赏
  • 举报
回复
我发个帖子,你过来接分
junlintianxia07 2010-06-11
  • 打赏
  • 举报
回复
menggang9801 2010-06-11
  • 打赏
  • 举报
回复
我12楼不也给你答案了,为啥一份多没有。兄弟,做人要厚道!
junlintianxia07 2010-06-10
  • 打赏
  • 举报
回复
还是不行
东那个升 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 junlintianxia07 的回复:]
引用 15 楼 ldslove 的回复:
这个就sql执行的啊。。

我知道这个是sql 执行的啊,
现在我不想在sql 下面执行这种映射命令

因为我写的那个dos :xcopy K:\SQL_BAK\source\*.* Z:\dest\ /s /e /y
可以在.bat 批处理文件中正确执行, 所以现在只要写sql 调用这个.bat 文件就能解决了,告诉我如何写sql来执行调用……
[/Quote]


EXEC MASTER..xp_cmdshell '路径\xxx.bat'
junlintianxia07 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ldslove 的回复:]
这个就sql执行的啊。。
[/Quote]
我知道这个是sql 执行的啊,
现在我不想在sql 下面执行这种映射命令

因为我写的那个dos :xcopy K:\SQL_BAK\source\*.* Z:\dest\ /s /e /y
可以在.bat 批处理文件中正确执行, 所以现在只要写sql 调用这个.bat 文件就能解决了,告诉我如何写sql来执行调用 比如C:\copy.bat
junlintianxia07 2010-06-10
  • 打赏
  • 举报
回复
现在只要解决 我如何写sql 执行外部的.bat 的批处理文件就行! 谁告诉我如何写?
谢谢!
东那个升 2010-06-10
  • 打赏
  • 举报
回复
这个就sql执行的啊。。
junlintianxia07 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ldslove 的回复:]
客户端的映射
exec master..xp_cmdshell
'net use z: \\192.168.1.145\c$ "密码" /user:192.168.1.145\administrator'
/*--说明:
z: 是映射网络路径对应本机的盘符,与下面的备份对应
\\192.168.1.145\c$ 是要映射的网络路径
192.168.1.145\adminis……
[/Quote]
发生系统错误 85。
NULL
本地设备名已在使用中。
NULL
NULL
哎。。。
咋办,没别的办法了吗? 就是写sql 调用外部的.bat 文件也行啊
menggang9801 2010-06-10
  • 打赏
  • 举报
回复
换成unc路径, SQL Server的帐号和你windows登录的帐号用户上下文不一样。
东那个升 2010-06-10
  • 打赏
  • 举报
回复
客户端的映射
exec master..xp_cmdshell
'net use z: \\192.168.1.145\c$ "密码" /user:192.168.1.145\administrator'
/*--说明:
z: 是映射网络路径对应本机的盘符,与下面的备份对应
\\192.168.1.145\c$ 是要映射的网络路径
192.168.1.145\administrator
192.168.1.145是远程的计算机名,administrator是登陆的用户名
密码 上面指定的administrator用户的密码
--*/
东那个升 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 junlintianxia07 的回复:]
EXEC MASTER..xp_cmdshell 'xcopy K:\SQL_BAK\source\*.* Z:\dest\ /s /e /y'

不行啊大哥,这句话直接在sql 执行的话:“无效驱动器规格” 还是不识别我的这个共享映射的驱动器盘
[/Quote]

那你没有Z盘了,没添加映射
junlintianxia07 2010-06-10
  • 打赏
  • 举报
回复
EXEC MASTER..xp_cmdshell 'xcopy K:\SQL_BAK\source\*.* Z:\dest\ /s /e /y'

不行啊大哥,这句话直接在sql 执行的话:“无效驱动器规格” 还是不识别我的这个共享映射的驱动器盘
junlintianxia07 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ldslove 的回复:]
或者直接


EXEC MASTER..xp_cmdshell 'xcopy K:\SQL_BAK\source\*.* Z:\dest\ /s /e /y'
[/Quote]
我先试试,如果成功,在线结贴!
junlintianxia07 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ldslove 的回复:]
引用楼主 junlintianxia07 的回复:
现在我们系统是这样要求的:把一台服务器(A)的硬盘映射到其他三台机器(B、C、D)上面,这样其他机器的sqlserver 备份的文件全部都放在这个共享的网络映射驱动器盘上面 便于管理
现在问题是:
在B、C、D 三台服务器上面已经可以做到把备份文件打包到各自的本地硬盘,但是想通过sql server 的CMDExec 执行一个拷贝命令的时候……
[/Quote]
直接用任务计划的话:“ 前提是我必须把这个拷贝命令同时放在sql server 的作业步骤里面来执行才行,也就是在步骤压缩之后,否则在外面再做计划任务调用批处理 就不知道sql server 的文件是否备份压缩完毕 会出意外的!”
东那个升 2010-06-10
  • 打赏
  • 举报
回复
或者直接


EXEC MASTER..xp_cmdshell 'xcopy K:\SQL_BAK\source\*.* Z:\dest\ /s /e /y'
永生天地 2010-06-10
  • 打赏
  • 举报
回复
利用SQL移动硬盘文件 收藏
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_movefile]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_movefile]
GO

/*--移动服务器上的文件

不借助 xp_cmdshell ,因为这个在大多数时候都被禁用了

--邹建 2004.08(引用请保留此信息)--*/

/*--调用示例

exec p_movefile 'd:\aa.txt','c:\'
--*/
create proc p_movefile
@s_file varchar(1000), --源文件
@d_file varchar(1000) --目标文件
as
declare @err int,@src varchar(255),@desc varchar(255)
declare @obj int

exec @err=sp_oacreate 'Scripting.FileSystemObject',@obj out
if @err<>0 goto lberr

exec @err=sp_oamethod @obj,'MoveFile',null,@s_file,@d_file
if @err<>0 goto lberr

exec @err=sp_oadestroy @obj
return

lberr:
exec sp_oageterrorinfo 0,@src out,@desc out
select cast(@err as varbinary(4)) as 错误号
,@src as 错误源,@desc as 错误描述
go



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zjcxc/archive/2004/08/15/75140.aspx
东那个升 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 junlintianxia07 的回复:]
现在我们系统是这样要求的:把一台服务器(A)的硬盘映射到其他三台机器(B、C、D)上面,这样其他机器的sqlserver 备份的文件全部都放在这个共享的网络映射驱动器盘上面 便于管理
现在问题是:
在B、C、D 三台服务器上面已经可以做到把备份文件打包到各自的本地硬盘,但是想通过sql server 的CMDExec 执行一个拷贝命令的时候:
xcopy K:\SQL_BAK\sour……
[/Quote]

直接用系统计划任务来执行BAT文件。
加载更多回复(6)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧