如何将光标转换为while循环? [英] How to convert cursor to while loop?

查看:80
本文介绍了如何将光标转换为while循环?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,

 请帮我将以下光标转换为while循环,是否会提高性能?如果不是除了基于集合的quires之外还能做什么呢?

  Please help me to convert the following cursor into while loop, whether it will improve the performance? if not what else I can do other than set-based quires?

  DECLARE @plan_no varchar(5),@ user_id varchar(7),@ group_type varchar(1) ,

@ status varchar(6),@ received_dt varchar(10),@ app_type varchar(15),@ member_id int



DECLARE
  batch_apps_cursor_nagarpr CURSOR FAST_FORWARD FOR

SELECT
  plan_no,user_id,group_type,status,app_received_dt,member_id

FROM
stat_his..stg_eats_batch_tab WITH(NOLOCK)  

WHERE
processed_status ='-1'



OPEN
batch_apps_cursor_nagarpr


FETCH NEXT FROM batch_apps_cursor_nagarpr INTO

@ plan_no,@ user_id,@ group_type,@ status,@ received_dt,@ member_id

WHILE(@@ FETCH_STATUS  = 0)

BEGIN

SET @app_type ='PDP'

IF if left(@ plan_no,1)='H'

BEGIN

SET @app_type ='MAPD'

END

IF if left(@ plan_no,1)='R'

BEGIN

SET @app_type ='MAPD'

END

IF @status IN('APPRCV','PENDNG','ACTIVE','RESRCH','INCMPL', 

        'INCMED','PNDMED','INCSNP ')

BEGIN

EXECUTE stat_his..upd_eats_enrbatch_apps @ plan_no,@ user_id,@ group_type,@ status,@ received_dt,@ app_type



更新
  stat_his..stg_eats_batch_tab

SET
processed_status ='5'

WHERE
member_id = @member_id



END

ELSE IF @status ='DISENR'

BEGIN

EXECUTE stat_his..upd_eats_disenrbatch_apps @ plan_no,@ user_id,@ group_type,@ status,@ received_dt,@ app_type



更新
  stat_his..stg_eats_batch_tab

SET
processed_status ='5'

WHERE
member_id = @member_id

END




FETCH NEXT FROM batch_apps_cursor_nagarpr INTO

@ plan_no,@ user_id,@ group_type,@ status,@ received_dt,@ member_id


END



关闭
batch_apps_cursor_nagarpr

DEALLOCATE
  batch_apps_cursor_nagarpr

 DECLARE @plan_no varchar(5),@user_id varchar(7),@group_type varchar(1),
@status varchar(6),@received_dt varchar(10),@app_type varchar(15),@member_id int

DECLARE  batch_apps_cursor_nagarpr CURSOR FAST_FORWARD FOR
SELECT  plan_no,user_id,group_type,status,app_received_dt,member_id
FROM stat_his..stg_eats_batch_tab WITH (NOLOCK)  
WHERE processed_status = '-1'

OPEN batch_apps_cursor_nagarpr
FETCH NEXT FROM batch_apps_cursor_nagarpr INTO
@plan_no ,@user_id ,@group_type ,@status ,@received_dt,@member_id
WHILE ( @@FETCH_STATUS  = 0 )
BEGIN
SET @app_type = 'PDP'
IF left(@plan_no,1) ='H'
BEGIN
SET @app_type = 'MAPD'
END
IF left(@plan_no,1) ='R'
BEGIN
SET @app_type = 'MAPD'
END
IF @status IN ('APPRCV','PENDNG','ACTIVE','RESRCH','INCMPL', 
               'INCMED', 'PNDMED','INCSNP')
BEGIN
EXECUTE stat_his..upd_eats_enrbatch_apps @plan_no,@user_id,@group_type,@status,@received_dt,@app_type

UPDATE  stat_his..stg_eats_batch_tab
SET processed_status = '5'
WHERE member_id = @member_id

END
ELSE IF @status = 'DISENR'
BEGIN
EXECUTE stat_his..upd_eats_disenrbatch_apps @plan_no,@user_id,@group_type,@status,@received_dt,@app_type

UPDATE  stat_his..stg_eats_batch_tab
SET processed_status = '5'
WHERE member_id = @member_id
END

FETCH NEXT FROM batch_apps_cursor_nagarpr INTO
@plan_no ,@user_id ,@group_type ,@status ,@received_dt ,@member_id
END

CLOSE batch_apps_cursor_nagarpr
DEALLOCATE  batch_apps_cursor_nagarpr

谢谢..

推荐答案

为什么?它们完全相同。停止使用NOLOCK直到你知道它做了什么,你准备好处理该提示带来的问题。 
Why? They are EXACTLY the same thing. And stop using NOLOCK until you KNOW what it does and you are PREPARED to handle the problems that come with that hint. 


这篇关于如何将光标转换为while循环?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆