接着上面那篇日志--存储过程实例
现在使用游标来实现
--定义全局,只进游标test
declare test cursor
global
forward_only
for
 select * from distinct_hd

--该段代码在使用前需要修改的地方:
--1.要根据源数据表结构修改目的表的结构
--2.要修改源数据表名
--3.变量sql的长度要比var_key长,否则在创建文本文件的时候会没有后缀
declare @var_indentity bigint, @var_count bigint, @var_key varchar(50), @sql varchar(120)
--为递增变量赋值
set @var_indentity = 1
--获取循环次数
select @var_count = count(*) from distinct_hd
--打开游标
open test
--循环开始
while @var_indentity <= @var_count
begin
--使用游标获取地区关键字,目的表将以该关键字命名
--select @var_key = diqu from distinct_hd where id = @var_indentity 
fetch next from test into @var_key
--开始动态创建以关键字为表明的表格
print '----------------------'
print '开始动态创建以关键字为表明的表格'
print '表名为: '+@var_key
exec('create table '+@var_key+' ([region_id] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,[usertype] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,[service_num] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,[sms_fee_total_1] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,[sms_fee_sp_1] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,[sms_fee_total_2] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,[sms_fee_sp_2] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,[sms_fee_total_3] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,[sms_fee_sp_3] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,[total_amount] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,[leave_amount] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL)')
--测试
print '动态创建表格成功!!'
--开始动态插入数据
print '开始动态插入数据'
--插入数据,选取条件使用游标实现
--exec('insert into '+@var_key+' select * from fijkl90239 where left(service_num, 7) in (select model from chinahd where diqu = (select diqu from distinct_hd where id = '+@var_indentity+'))')
exec('insert into '+@var_key+' select * from fijkl90239 where left(service_num, 7) in (select model from chinahd where diqu = '''+@var_key+''')')
--测试
print '动态插入数据成功!!'
--将数据输出到对应的文本文件
set @sql = 'BCP test.dbo.' + @var_key+' out E:\work\结果\fijkl90239-cursor\'+@var_key+'.txt -c -U"sa" -P""'
print '开始导出到文本文件'
exec master..xp_cmdshell @sql
print '导出结束!'
print 'bcp test.dbo.'+@var_key+' out E:\work\结果\fijkl90239-cursor\'+@var_key+'.txt -c -U"sa" -P""'
--循环变量递增
print convert(char(5), @var_indentity)
set @var_indentity = @var_indentity + 1
end
--关闭游标
close test
--释放游标
deallocate test
在这里的distinct_hd表中的id字段已经被删除!
上面的代码使用了游标来实现了与上篇日志(存储过程实例)同样的功能
上篇日志的代码花费:5分30秒左右 结束
现在使用游标后的代码要花费: 4分15秒 结束
所以在性能上还是有一点提升的!