今天遇到一个朋友提出来这个问题:每十分钟把某张表中的记录导到一个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(鼠标移到代码上去,在代码的顶部会出现四个图标,第一个是查看源代码,第二个是复制代码,第三个是打印代码,第四个是帮助)
这样就完美地解决了