SQL Server遍历表中记录的2种方法
SQL Server遍历表一般都要用到游标,SQL Server中可以很容易的用游标实现循环,实现SQL Server遍历表中记录。本文将介绍利用使用表变量和游标实现数据库中表的遍历。
表变量来实现表的遍历
以下代码中,代码块之间的差异已经用灰色的背景标记。

1 DECLARE @temp TABLE
2
3 (
4
5 [id] INT IDENTITY(1, 1) ,
6
7 [Name] VARCHAR(10)
8
9 )
10
11 DECLARE @tempId INT ,
12
13 @tempName VARCHAR(10)
14
15 INSERT INTO @temp
16
17 VALUES ( 'a' )
18
19 INSERT INTO @temp
20
21 VALUES ( 'b' )
22
23 INSERT INTO @temp
24
25 VALUES ( 'c' )
26
27 INSERT INTO @temp
28
29 VALUES ( 'd' )
30
31 INSERT INTO @temp
32
33 VALUES ( 'e' )
34
35 WHILE EXISTS ( SELECT [id]
36
37 FROM @temp )
38
39 BEGIN
40
41 SET ROWCOUNT 1
42
43 SELECT @tempId = [id] ,
44
45 @tempName = [Name]
46
47 FROM @temp
48
49 SET ROWCOUNT 0
50
51 --delete from @temp where [id] = @tempId
52
53 PRINT 'Name:----' + @tempName
54
55 END

但是这种方法,必须借助ROWCOUNT。但是使用SET ROWCOUNT将可能会影响 DELETE、INSERT 和 UPDATE 语句。
所以修改上面WHILE循环,改用TOP来选出首条记录。

1 WHILE EXISTS ( SELECT [id]
2
3 FROM @temp )
4
5 BEGIN
6
7 SELECT TOP 1
8
9 @tempId = [id] ,
10
11 @tempName = [Name]
12
13 FROM @temp
14
15 DELETE FROM @temp
16
17 WHERE [id] = @tempId
18
19 SELECT *
20
21 FROM @temp
22
23
24
25 EXEC('drop table '+)
26
27 PRINT 'Name:----' + @tempName
28
29 END

这种方法也存在一个问题,需要将遍历过的行删除,事实上,我们在实际应用中可能并不想要遍历完一行就删除一行。
利用游标来遍历表
游标是非常邪恶的一种存在,使用游标经常会比使用面向集合的方法慢2-3倍,当游标定义在大数据量时,这个比例还会增加。如果可能,尽量使用while,子查询,临时表,函数,表变量等来替代游标,记住,游标永远只是你最后无奈之下的选择,而不是首选。

1 --定义表变量
2
3 DECLARE @temp TABLE
4
5 (
6
7 [id] INT IDENTITY(1, 1) ,
8
9 [Name] VARCHAR(10)
10
11 )
12
13 DECLARE @tempId INT ,
14
15 @tempName VARCHAR(10)
16
17 DECLARE test_Cursor CURSOR LOCAL FOR
18
19 SELECT [id],[name] FROM @temp
20
21 --插入数据值
22
23 INSERT INTO @temp
24
25 VALUES ( 'a' )
26
27 INSERT INTO @temp
28
29 VALUES ( 'b' )
30
31 INSERT INTO @temp
32
33 VALUES ( 'c' )
34
35 INSERT INTO @temp
36
37 VALUES ( 'd' )
38
39 INSERT INTO @temp
40
41 VALUES ( 'e' )
42
43
44
45 --打开游标
46
47 OPEN test_Cursor
48
49 WHILE @@FETCH_STATUS = 0
50
51 BEGIN
52
53 FETCH NEXT FROM test_Cursor INTO @tempId,@tempname
54
55 PRINT 'Name:----' + @tempName
56
57 END
58
59 CLOSE test_Cursor
60
61 DEALLOCATE test_Cursor

参考链接:
本文转自陈哈哈博客园博客,原文链接http://www.cnblogs.com/kissazi2/archive/2013/02/27/2935307.html如需转载请自行联系原作者
kissazi2
SQL Server遍历表中记录的2种方法的更多相关文章
- SQL Server 数据库查找重复记录的几种方法
http://www.hanyu123.cn/html/c61/6790.html 一.查某一列(或多列)的重复值.(只可以查出重复记录的值,不能查出整个记录的信息) 例如:查找stuid,stuna ...
- sql server遍历表不用游标和临时表的方法
表结果如图 )) ,'Sky,Blue,Water' ,'Book,Apple,Shirt' ,'Cup,Yellow,org' ,'box,phone,paper' GO SELECT id,SUB ...
- SQL Server遍历表的几种方法 转载
SQL Server遍历表的几种方法 阅读目录 使用游标 使用表变量 使用临时表 在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易 ...
- SQL Server遍历表的几种方法
在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易懂,但是它不符合面向集合操作的原则,而且性能也比面向集合低.当然,从面向集合操作的 ...
- SQL Server 查看空间使用情况的 5 种方法
解决方法: 方法 1.sp_spaceused 方法 2.dbcc sqlperf 方法 3.dbcc showfilestats 方法 4.dbcc showcontig 方法 5.sys.dm_d ...
- SQL Server 查看备份集元数据的 4 种方法。
方法 1. restore labelonly 方法 2. restore headeronly 方法 3. restore filelistonly 方法 4. restore verifyonly ...
- sql server 遍历表成一棵树结构
一棵树的层次结构都在一张表内,当有这样的需要的时候.. 可以这样玩: <!-- DepartmentDTO 对象对应 department表_查询sql --> <sql id=&q ...
- SQL Server 查看数据库空间分配情况的 2 种方法
方法 1. sys.dm_db_file_space_usage. 方法 2. sys.dm_db_session_space_usage. ----------------------------- ...
- SQL Server中如何实现遍历表的记录
SQL Server遍历表一般都要用到游标,SQL Server中可以很容易的用游标实现循环,实现SQL Server遍历表中记录. 但游标在实际的开发中都不推荐使用. 我们知道还可以借助临时表或表变 ...
随机推荐
- Debian Bug report logs - #724721 zsh: Tab completion error with vi
Hi Ludovic, Ludovic Lebègue wrote: > While using zsh shell trying to autocomplete with tab key di ...
- 01 微信小程序创建组件和使用组件
01 创建组件 遇见的困难 图标显示不出来,是因为你没有在组件的css中引入,所以显示不出来. 我一直以为是一个坑.结果是自己没有整清楚 01==>在page的同级目录下,创建一个文件夹,命名为 ...
- php-fpm cgi fast-cgi
基础 在整个网站架构中,Web Server(如Apache)只是内容的分发者.举个栗子,如果客户端请求的是 index.html,那么Web Server会去文件系统中找到这个文件,发送给浏览器,这 ...
- Spire.Cloud 私有化部署教程(一) - CentOS 7 系统
Spire.Cloud支持的Linux服务器系统包括CentOS和Ubuntu(推荐使用CentOS 7和Ubuntu 18版本),本教程主要介绍如何在CentOS 7系统上实现Spire.Cloud ...
- bootstrapTest
<!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="utf-8&q ...
- For循环详解
for语句 学过c语言都对循环结构不陌生,尤其是for循环,他是C语言中最有特色的循环语句,使用最为灵活. 形式 结构:for(表达式1:表达式2:表达式3){循环体结构} 每部分的作用 表达式1:一 ...
- CVPR2020|3D-VID:基于LiDar Video信息的3D目标检测框架
作者:蒋天园 Date:2020-04-18 来源:3D-VID:基于LiDar Video信息的3D目标检测框架|CVPR2020 Brief paper地址:https://arxiv.org/p ...
- labview 机器视觉
学习labview机器视觉,一定要安装VAS,VDM.先安装labview,再安装VAS和VDM. 安装完成后,前面板出现vision 后面板出现视觉与运动函数
- SPFA()判环
1 SPFA()判负环 SPFA()判负环的原理就是在求最短路的过程中,如果存在负环,比如说要求从A到a的最短距离,设为s,但是经过a->c->b->a可以更短,所以如果一直经过a- ...
- Django文档阅读-Day3
Django文档阅读-Day3 Writing your first Django app, part 3 Overview A view is a "type" of Web p ...