服务器端游标快要把我折磨死了~~~~!高手指点

[复制链接]
查看11 | 回复1 | 2006-6-20 13:02:00 | 显示全部楼层 |阅读模式
服务器端游标快要把我折磨死了,我要将[temp_user]中的记录合并到[WAPCOUNT_USER]中,遍历表[temp_user]判断在[WAPCOUNT_USER]中是否有相同的记录,有相同的记录则更新相关的记录,没有相同的记录则插入这条记录。
我彻底明白了为什么所有人都在说不要用服务器游标了,35W条记录这个存储过程执行了3个小时,我晕死,哪个高手帮忙解决一下撒。能不能用别的方法替代服务器端游标来实现遍历啊?
CREATE proc dbo.user_sql as

declare user_cursor cursor for

SELECT WAPTD_USERID,ACCESS_NUM,CREATETIME from[BackUpTableNew].[xc_count].[temp_user]

open user_cursor

declare @user_cursor_USERID varchar(100)

declare @user_cursor_ACCESS_NUM int

declare @user_cursor_CREATETIME datetime

fetch next from user_cursor into @user_cursor_USERID,@user_cursor_ACCESS_NUM,@user_cursor_CREATETIME

while @@FETCH_STATUS = 0

begin



declare @WAPTD_VIEW_WAPTD_LOGIN_USERNAME varchar(50)

declare @WAPTD_VIEW_PHONENUMBER varchar(20)

declare @WAPTD_VIEW_MOBILETYPE varchar(100)

declare @WAPTD_VIEW_REFER varchar(1000)

declare @WAPTD_VIEW_REMOTE_ADDR varchar(20)

select @WAPTD_VIEW_WAPTD_LOGIN_USERNAME=WAPTD_LOGIN_USERNAME,@WAPTD_VIEW_PHONENUMBER=PHONENUMBER, @WAPTD_VIEW_MOBILETYPE=MOBILETYPE,@WAPTD_VIEW_REFER=REFER, @WAPTD_VIEW_REMOTE_ADDR=REMOTE_ADDR from [BackUpTableNew].[dbo].[wapcount] where createtime = @user_cursor_CREATETIME and waptd_userid=@user_cursor_USERID



if EXISTS (Select ACCESS_NUM,DIFF_DAY_ACCESSFrom[BackUpTableNew].[dbo].[WAPCOUNT_USER] Where WAPTD_USERID=@user_cursor_USERID)

begin

UPDATE[BackUpTableNew].[dbo].[WAPCOUNT_USER] SET ACCESS_NUM=ACCESS_NUM+@user_cursor_ACCESS_NUM,DIFF_DAY_ACCESS=DIFF_DAY_ACCESS+1Where WAPTD_USERID=@user_cursor_USERID

end

else

begin

Insert Into[BackUpTableNew].[dbo].[WAPCOUNT_USER] (WAPTD_USERID,WAPTD_LOGIN_USERNAME,PHONENUMBER,MOBILETYPE,CREATETIME,ACCESS_NUM,REMOTE_ADDR,FIRST_URL,LASTTIME,UP_ACCESS_DATE,DIFF_DAY_ACCESS) VALUES (@user_cursor_USERID,@WAPTD_VIEW_WAPTD_LOGIN_USERNAME,@WAPTD_VIEW_PHONENUMBER,@WAPTD_VIEW_MOBILETYPE,@user_cursor_CREATETIME,@user_cursor_ACCESS_NUM,@WAPTD_VIEW_REMOTE_ADDR,@WAPTD_VIEW_REFER,@user_cursor_CREATETIME,@user_cursor_CREATETIME,1)

end



fetch next from user_cursor into @user_cursor_USERID,@user_cursor_ACCESS_NUM,@user_cursor_CREATETIME

end

close user_cursor

deallocate user_cursor


delete [BackUpTableNew].[xc_count].[temp_user]
GO
回复

使用道具 举报

千问 | 2006-6-20 13:02:00 | 显示全部楼层
--!这样子更新,呵呵,亏想的出来。
直接分2步完成不能达到要求?
1 更新2表中共有的数据,用temp_user更新WAPCOUNT_USER
update WAPCOUNT_USER set ACCESS_NUM=ACCESS_NUM+t.ACCESS_NUM,DIFF_DAY_ACCESS=DIFF_DAY_ACCESS+1
from temp_user t,WAPCOUNT_USER w where t.WAPTD_USERID=w.WAPTD_USERID
2 merge新数据
insert into WAPCOUNT_USER
select *--具体看你2张表结构,同构直接*
from temp_user where WAPTD_USERID not in(select WAPTD_USERID from WAPCOUNT_USER)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行