BCP如何自动导出以日期命名的文件?

summerain 2003-10-09 11:19:02
大家好,我想用BCP大容量导出数据,每天导出一个文件。我想创建一个计划任务,以实现每天自动导出数据文件的目的,并且要求导出的文件不覆盖以前的文件,文件以日期命名。我想BCP是可以实现这个要求的,只是找不到合适的办法。请大家帮帮我,在线等!谢谢。
...全文
182 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
txlicenhe 2003-10-09
  • 打赏
  • 举报
回复
create procedure test
As
declare @fn char(8),@sql varchar(500)
set @fn = convert(char(8),getdate(),112)
set @sql = 'bcp "dbname..tablename" out c:\'+ @fn + ' -c -Sservername -Usa -Ppassword'
exec master..xp_cmdshell @sql

go

再用job调用此存储过程


pengdali 2003-10-09
  • 打赏
  • 举报
回复
declare @a varchar(8000)
set @a='bcp test.dbo.P_Aspect out c:\test'+convert(char(8),getdate(),112)+'.txt -c -q -S"servername" -U"sa" -P""'

EXEC master..xp_cmdshell @a
summerain 2003-10-09
  • 打赏
  • 举报
回复
谢谢诸位。我改用宽度更大的变量,比如varchar(8000),执行结果还是不成功。另外,我采用临时表的方法比较采用查询的方法,前者导出800,0000条数据花费时间35分钟,其中将数据导入到临时表花费25分钟,BCP导出数据花费10分钟;后者(查询方式,没有where子句)BCP导出数据花费6分钟多点。由此看来采用临时表的方式不是最优选择。
zjcxc 2003-10-09
  • 打赏
  • 举报
回复
不是语句问题,是你的变量问题,改为下面的试试:

DECLARE @filename char(8),@sql varchar(8000),@query varchar(8000)
--将变量宽度定义大一点.
SET @filename=CONVERT(char(8),GETDATE(),112)
SET @query='SELECT * FROM db1.dbo.table1 WHERE con1<GETDATE()'
SET @sql='BCP "'+@query+'" QUERYOUT F:\'+@filename+' -U"sa" -P"sa" -n -S"DBserver"'
exec @result=master..xp_cmdshell @sql
PRINT @result
print @sql

summerain 2003-10-09
  • 打赏
  • 举报
回复
经检查,查询语句去掉WHERE子句就成功了。但是这样就不能实现导出部分数据的目的。where子句难道真的不能在这里使用吗?
pengdali 2003-10-09
  • 打赏
  • 举报
回复
你这样:

DECLARE @filename char(8),@sql varchar(255),@query varchar(255)
SET @filename=CONVERT(char(8),GETDATE(),112)

SET @query='SELECT * into ##临时表 FROM db1.dbo.table1 WHERE con1<GETDATE()'


SET @sql='bcp tempdb..##临时表 out F:\'+@filename+' -U"sa" -P"sa" -n -S"DBserver"'

exec @result=master..xp_cmdshell @sql

drop table ##临时表

PRINT @result
print @sql
pengdali 2003-10-09
  • 打赏
  • 举报
回复
DECLARE @filename char(8),@sql varchar(255),@query varchar(255)
SET @filename=CONVERT(char(8),GETDATE(),112)

SET @query='SELECT * FROM pubs..jobs'

SET @sql='BCP "'+@query+'" QUERYOUT c:\'+@filename+' -U"sa" -P"element" -n -S"192.168.19.189"'
exec master..xp_cmdshell @sql

--这里是好的。
txlicenhe 2003-10-09
  • 打赏
  • 举报
回复
/** 导出文本文件
EXEC master..xp_cmdshell 'bcp dbname..tablename out c:\DT.txt -c -Sservername -Usa -Ppassword'
此方式不用引号

EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword'
此方式要引号
txlicenhe 2003-10-09
  • 打赏
  • 举报
回复
create procedure test
As
declare @fn char(8),@sql varchar(500)
set @fn = convert(char(8),getdate(),112)
set @sql = 'bcp dbname..tablename out c:\'+ @fn + ' -c -Sservername -Usa -Ppassword'
exec master..xp_cmdshell @sql

go

summerain 2003-10-09
  • 打赏
  • 举报
回复
谢谢大力和马可。我按上述测试一遍,发现查询分析器总是输出BCP的帮助信息,并没有真正执行,但将BCP语句放到命令行方式下执行是成功的。查帮助说xp_cmdshell中的command_string不能包含一对以上的双引号。而上述中的command_string包括多个双引号,可能问题就出在这里。是不是可以不用双引号而以别的代替呢?
我的语句如下:
DECLARE @filename char(8),@sql varchar(255),@query varchar(255)
SET @filename=CONVERT(char(8),GETDATE(),112)
SET @query='SELECT * FROM db1.dbo.table1 WHERE con1<GETDATE()'
SET @sql='BCP "'+@query+'" QUERYOUT F:\'+@filename+' -U"sa" -P"sa" -n -S"DBserver"'
exec @result=master..xp_cmdshell @sql
PRINT @result
print @sql

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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