当前位置:asp编程网>技术教程>Database教程>  正文

SQL通过BCP命令每10分钟定时把表中的记录导出为txt文件

2012-06-30 12:57:06   来源:www.aspbc.com    作者:wangsdong   浏览量:3437   收藏

今天遇到一个朋友提出来这个问题:每十分钟把某张表中的记录导到一个txt文年中去。

这里就要用到两个技术:

1、导出数据为txt文件

     这里就需要用到sql语句中的BCP命令,BCP命令的语法大家网上找,这里只介绍它的应用    
     A、直接将整张表导出

exec master..xp_cmdshell 'bcp "数据库名.dbo.表名" out "d:\文件夹名\txt文件名.txt" -c -S. -U"sa" -P"密码"'
(鼠标移到代码上去,在代码的顶部会出现四个图标,第一个是查看源代码,第二个是复制代码,第三个是打印代码,第四个是帮助)

     B、使用sql语句导出想要的记录

exec master..xp_cmdshell 'BCP "select top 2 * from 数据库名..表名" queryout d:/文件夹/txt文件名.txt -c -S"." -U"sa" -P"密码"'
(鼠标移到代码上去,在代码的顶部会出现四个图标,第一个是查看源代码,第二个是复制代码,第三个是打印代码,第四个是帮助)

创建一个存储过程,内容是上面的代码

2、定时十分钟执行一次

具体步骤见:sql server 2005作业处理步骤设置

这样就可以了,注意作业处理中的设计,等十分钟后,去看看d:\文件夹名\txt文件名.txt是不是有这个文件。
由于通常自动生成文件,所以文件名不能一样的,可以在存储过程中这样处理:

declare @time varchar(50), @cmdstr varchar(100), @date varchar(20)
declare @year varchar(10), @month varchar(10), @day varchar(10),@hour varchar(10),@minute varchar(10),@second varchar(10)
set @date = getdate() --convert(varchar,getdate(),120)
set @year = year(@date) 
set @month = month(@date)
set @day = day(@date)
set @hour = DATEPART(hour,@date)
set @minute = DATEPART(minute,@date)
set @second = DATEPART(second,getdate())
set @time = @year +  @month + @day + @hour + @minute + '' +@second
print @time

exec master..xp_cmdshell 'BCP "select top 2 * from 数据库名..表名" queryout d:/文件夹/' + @time + '.txt -c -S"." -U"sa" -P"密码"'

print @cmdstr
EXEC master..xp_cmdshell @cmdstr 
(鼠标移到代码上去,在代码的顶部会出现四个图标,第一个是查看源代码,第二个是复制代码,第三个是打印代码,第四个是帮助)


这样可能会出现一个错误:运行后显示信息如下:
消息15281,级别16,状态1,过程xp_cmdshell,第1 行
SQL Server 阻止了对组件'xp_cmdshell' 的过程'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用sp_configure 启用'xp_cmdshell'。有关启用'xp_cmdshell' 的详细信息,请参阅SQL Server 联机丛书中的"外围应用配置器"。

原因:是sql默认是禁用了xp_cmdshell组件

解决方法:
运行这段代码:

sp_configure 'xp_cmdshell', 1;
go
reconfigure;
go
(鼠标移到代码上去,在代码的顶部会出现四个图标,第一个是查看源代码,第二个是复制代码,第三个是打印代码,第四个是帮助)


这样就完美地解决了



关于我们-广告合作-联系我们-积分规则-网站地图

Copyright(C)2013-2017版权所属asp编程网