用什么可以代替游标???

kkty2008 2006-04-20 01:36:42
我想轮循一个数据集,处理每一条记录,现在的实现方式是有游标,还有更好方式吗?
我要用游标来循环一个数据集,处理每一个数据,如代码:
--建立游标,利用while实现循环操作
DECLARE XWService_Cursor CURSOR FOR
SELECT ID FROM d_order WHERE sdictate=@sBuy
OPEN XWService_Cursor
FETCH NEXT FROM XWService_Cursor INTO @ID
WHILE @@FETCH_STATUS = 0
BEGIN
--如果满足条件,写入临时表
SELECT * from d_order WHERE ID = @ID
--
end
FETCH NEXT FROM XWService_Cursor INTO @ID
END
CLOSE XWService_Cursor
DEALLOCATE XWService_Cursor
请问,我不想用游标,可以用什么办法来实现?使用游标会损失速度,我现在操作的是大容量的数据库,电信的。

...全文
547 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhandaxia 2006-04-20
  • 打赏
  • 举报
回复
To楼主,遇到高峰期数据积压的情况在短信通道中比较普遍,因为SQL Server数据库同时处理大量数据的能力有限,建议把数据库操作和上下行操作分开执行互补干扰。比如用CS程序读取数据到内存快速处理,数据库在后台异步执行。
yui 2006-04-20
  • 打赏
  • 举报
回复
看具体情况,如果逻辑处理简单的,能不用游标就不用游标
如果部分处理简单,部分处理复杂的,可以对能简单处理的那部分直接用SQL语句实现,对需要复杂处理的那部分用游标逐行实现你想要的功能
Yang_ 2006-04-20
  • 打赏
  • 举报
回复
电信有的是钱,让他们升级硬件,呵呵

如果确信游标速度慢,任何游标都是可以代替掉的

其实游标本身不牺牲速度
panjinfu80 2006-04-20
  • 打赏
  • 举报
回复
得看具体情况
有时非用不可的。
hyrongg 2006-04-20
  • 打赏
  • 举报
回复
不用游标作循环的例子:
---------------- DO LOOP NO NEED CURSOR------
SET NOCOUNT ON
DECLARE @EMPLOYEEID INT
DECLARE @LASTNAME NVARCHAR(50),
@iNextRowId int,
@iCurrentRowId int,
@iLoopControl int

SET @ILOOPCONTROL=1
SELECT @INEXTROWID=MIN(EMPLOYEEID) FROM EMPLOYEES
IF ISNULL(@INEXTROWID,0)=0
BEGIN
SELECT 'NO DATA FOUND IN TABLE'
RETURN
END

SELECT @ICURRENTROWID = EMPLOYEEID ,
@LASTNAME = LASTNAME
FROM EMPLOYEES WHERE EMPLOYEEID=@INEXTROWID

WHILE ILOOPCONTROL=1
BEGIN
SET @INEXTROWID=NULL
SELECT @INEXTROWID=MIN(EMPLOYEEID) FROM EMPLOYEE
WHERE EMPLOYEEID>@ICURRENTROWID

IF ISNULL(@INEXTROWID)
BEGIN
BREAK
END

END
SET NOCOUNT OFF
---------------- DO LOOP NO NEED CURSOR------
kkty2008 2006-04-20
  • 打赏
  • 举报
回复
特别是那些投票活动什么的,比如春晚,好多短信是没有发走的,我们处理的方法是,超过10分钟取消临时订阅关系,抛弃,防止数据积压
kkty2008 2006-04-20
  • 打赏
  • 举报
回复
不是具体的问题,是想找到一种好的解决方案,这样说吧,
随便举个例子,短信收发有3个表:上行表(用户上行),下行表(发给用户的表),业务处理表()我设计的时候用CS程序间隔5ms掉一个存储过程(处理上行数据),在处理这个上行数据的存储过程中,我用游标去轮循这个上行表,处理每一条数据,如根据具体的业务号,分流数据到各小库,或则作其他处理,然后删除这条数据,正常的情况下,上行表是没数据的。
问题:小数据的情况下,处理是没问题的,但遇到峰值的时候,就会造成数据积压,(现实的例子是你们发短信,今天发可能明天才收到),有什么好方法处理?请大家分析分析?
rouqu 2006-04-20
  • 打赏
  • 举报
回复
对表中数据进行逐行处理 即处理过程复杂 表数据量不大的情况下 用游标比较合适

如果你的处理逻辑简单的话 直接用TSQL语句来搞定
-狙击手- 2006-04-20
  • 打赏
  • 举报
回复
while实现循环省不了的啊

用中间表啊,生成 有行号的中间表
比如:select *,rowid = identity(int,1,1) into # from table

然后while 行号
WangZWang 2006-04-20
  • 打赏
  • 举报
回复
首先要想清楚你要实现的具体功能,看看
有没有用批处理来处理代替cursor能
完成的功能。
lsqkeke 2006-04-20
  • 打赏
  • 举报
回复
请贴出原表结构及部分数据,然后仔细说明需要做什么处理,实现什么结果?

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧