使用CURSOR进行高效遍历:DECLARE cur CURSOR FOR SELECT * FROM table; OPEN cur; FETCH NEXT FROM cur INTO @var1, @var2; WHILE @@FETCH_STATUS = 0 BEGIN -- 处理逻辑 FETCH NEXT FROM cur INTO @var1, @var2; END CLOSE cur; DEALLOCATE cur; 这个方法网友说超级实用,批量处理数据时速度飞起。
网友分享1
我平时处理大表数据,用WHILE循环加TOP 1最稳:DECLARE @id INT; SELECT TOP 1 @id = id FROM table ORDER BY id; WHILE @@ROWCOUNT > 0 BEGIN -- 你的操作 UPDATE table SET status=1 WHERE id=@id; SELECT TOP 1 @id = id FROM table WHERE status=0 ORDER BY id; END 效率高,不会卡住。
网友分享2
推荐用MERGE语句代替遍历,太神了!MERGE target AS t USING source AS s ON t.id=s.id WHEN MATCHED THEN UPDATE SET t.col=s.col WHEN NOT MATCHED THEN INSERT (id,col) VALUES (s.id,s.col); 网友测试过,百万级数据秒杀cursor。
网友分享3
SET BASE TABLE模式遍历:UPDATE table SET col=1 WHERE id IN (SELECT TOP 10000 id FROM table WHERE col=0); WHILE @@ROWCOUNT > 0 BEGIN UPDATE table SET col=1 WHERE id IN (SELECT TOP 10000 id FROM table WHERE col=0); END 分批处理,内存友好。
网友分享4
XML方法遍历记录:SELECT * FROM (SELECT id, data FROM table FOR XML PATH('row'), TYPE) AS xml.nodes('/row') AS t(c) CROSS APPLY (SELECT c.value('@id','int') AS id, c.value('data[1]','varchar')) AS x; 复杂场景下用这个,速度不错。
网友分享5
用临时表+循环:CREATE TABLE #temp (id INT); INSERT #temp SELECT id FROM table WHERE condition; DECLARE @id INT; WHILE EXISTS(SELECT 1 FROM #temp) BEGIN SELECT TOP 1 @id=id FROM #temp; -- 处理 DELETE #temp WHERE id=@id; END DROP TABLE #temp; 网友说管理数据最清晰。
网友分享6
高效技巧:用OUTPUT子句记录变更,避免二次查询。UPDATE table SET col=1 OUTPUT DELETED.id INTO #changed WHERE condition; 结合WHILE循环,工作效率提升3倍!
FAQ
Q: Cursor和WHILE循环哪个更快?
A: 大数据用MERGE或SET BASE更快,Cursor适合复杂逻辑。
Q: 怎么避免遍历时死锁?
A: 加NOLOCK提示或分批处理,每批1000条。
Q: 百万级数据怎么遍历?
A: 优先MERGE或临时表+TOP分页。
Q: 内存不够怎么办?
A: 用磁盘临时表,别一次性全加载。