大家都知道在操作大量的记录的时候,游标的性能真的是慢的令人发指,但是游标对一条记录操作方便性又令人爱不释手,有没有能兼顾性能又能方便呢,答案是肯定的,昨天正好进行项目sql语句优化,遇到了一个一条记录需要多次操作不能简单的使用其它语句替换的实例。
例子:
表a
FF字段
-----------
001,002,003
-----------
004,005
-----------
006
通常我们遇到没有办法替换游标的原因就是因为出现了上面类似的记录,一条记录需要进行单独处理。
这块解决方案,先是把上面的记录的内容改成多条,具体做法如下:
1. 建立两张张表a的临时表 a1,a2;其中a1,为a的复制表,a2表为空白表
2. 使用while循环判select top 1 ff from a1 where charindex(‘,‘,ff)>0 是否存在,如果存在执行如下操作:
1. insert into a2 select substring(ff,1,charindex(‘,‘,ff)-1) from a1 where charindex(‘,‘,ff)>0 ---取得001插入第一条记录,取得004插入第二条
2. update a1 set ff=substring(ff,charindex(‘,‘,ff)+1,len(ff)-charindex(‘,‘,ff)) where charindex(‘,‘,ff)>0 --去掉已经插入a2表的记录中的内容
3. 继续循环while判断
这样我们就得到了a1和a2表是已经完全被拆开ff字段的记录的记录了,可以像下面一样使用了
select ff from a1
union all
select ff from a2
这样单条记录多次被操作不想使用游标的一种情况就得到了解决。
ps:大家需要注意,在临时表建立时,肯定不能有索引的存在的,其它的问题根据具体情况解决