您的位置:程序门 -> ms-sql server -> 基础类



帮我优化一下存储过程,谢了


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


帮我优化一下存储过程,谢了[已结贴,结贴人:iseelxj]
发表于:2007-05-10 09:25:04 楼主
处理内容:
为一个大概有8万条数据的工作表设定12位的code,有一些可能已经有12位的code
处理过程:
1   从一个master中,根据tgpc取得9位的code
2   检查工作表中是否有以该9位code开始的12位code
3   如果有取最大值+1付给工作表
4   如果没有9位code+001付给工作表

实际的存储过程在下面
发表于:2007-05-10 09:26:271楼 得分:0
??
发表于:2007-05-10 09:28:502楼 得分:0
alter   procedure   sp_set_settb_cmpstn_cd
  @dbuser   char(10)
,@returnvalue   int   output  
  as
begin
        set   @tmp_tgpc   =   ' '

        declare   wkrcd   cursor   for
       
        select  
                wk.hin,                                            
                wk.uchi,                                        
                wk.tgpc,                                        
                wk.cgpc,                                        
                wk.fgpc,                                        
                wk.pgpc,                                        
                cdm.set_rprsnttv_cd
        from  
                set_cmpstn_wk   wk
        left   join  
                set_cmpstn_mst   m
        on  
                wk.hin=m.hin   and  
                wk.uchi=m.uchi   and  
                wk.tgpc=m.tgpc   and
                wk.cgpc=m.cgpc   and  
                wk.fgpc=m.fgpc   and  
                wk.pgpc=m.pgpc   and
                m.del_kbn= '1 '  
left   join
        set_rprsnttv_cd_mst   cdm
        on
        wk.tgpc   =   cdm.tgpc   and
        cdm.del_kbn= '0 '
        where  
                m.hin   is   null   and
                m.uchi   is   null   and
                m.tgpc   is   null   and
                m.cgpc   is   null   and
                m.fgpc   is   null   and
                m.pgpc   is   null   and
                cdm.set_rprsnttv_cd   is   not   null   and
                wk.prcss_kbn= '1 '  
        order   by   wk.tgpc
       
        open   wkrcd

        fetch   next   from   wkrcd
        into   @hin,                                
                  @uchi,                              
                  @tgpc,                              
                  @cgpc,                              
                  @fgpc,                              
                  @pgpc,                              
                  @kyuketa                  
       
        while   @@fetch_status   =   0
                begin
                if   @tmp_tgpc   !=   @tgpc
                begin
                set   @tmp_tgpc   =   @tgpc

select  
@cmpstncdchg   =   max(set_cmpstn_cd)
from  
set_cmpstn_wk
where  
set_cmpstn_cd   like   @kyuketa+ '% '   and  
del_kbn= '0 '
group   by   set_cmpstn_cd

if   @cmpstncdchg   is   null   or   ltrim(@cmpstncdchg)   =   ' '
begin
set   @counter   =   '000 '
end
else
begin
--12桁コードを計算する
set   @counter   =   right(rtrim(@cmpstncdchg),3)
end
                end

set   @counter   =   right( '000 '+convert(varchar(3),@counter+1),3)

if   @counter   =   '999 '  
begin
set   @returnvalue   =   5
return   5
end

update   set_cmpstn_wk
                        set
set_cmpstn_cd=@kyuketa+@counter,
updt_dt=getdate(),    
updt_usr_id=@dbuser
where  
prcss_kbn= '1 '   and  
hin   =   @hin   and
uchi   =   @uchi   and
tgpc   =   @tgpc   and
cgpc   =   @cgpc   and
fgpc   =   @fgpc   and
pgpc   =   @pgpc   and
del_kbn= '0 '   and
ltrim(set_cmpstn_cd)   =   ' '

--[   カーソル情報   取得   ]
        fetch   next   from   wkrcd
        into   @hin,                                
                  @uchi,                              
                  @tgpc,                              
                  @cgpc,                              
                  @fgpc,                              
                  @pgpc,                                
                  @kyuketa                  
                end

        close   wkrcd
        deallocate   wkrcd
       
        set   @returnvalue   =   0
end
发表于:2007-05-10 09:29:193楼 得分:0
那位哥哥太快了
发表于:2007-05-16 11:13:454楼 得分:0
你这个修改确实效率不怎么样!呵呵!
发表于:2007-05-16 11:30:155楼 得分:50
太长了,简单看了看。提个意见哦

建议   1、将需要修改的数据提取出来放在临时表(存放主键id和新code,这一步生成id,增量)
          select   [id]   as   sid,identity   (int   ,1,1)   as   ident   into   #table_pqs   from   .....
          2、根据增量ident   生成新code,并修改即可(当然要先获取最大code然后操作)
          最大@maxcode= '000000000012 '
       
          update   table_yours   set   code=right( '000000000000 '+cast(cast(@maxcode   as   int)+ident   as   varchar),12)   from   #table_pqs   where   table_yours.主键字段=sid
               
               
发表于:2007-05-16 11:32:196楼 得分:0
你的修改只是分情况而已,我举的是一个例子而已,可以变通操作,游标那东西尽量不要用


快速检索

最新资讯
热门点击