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遍历表中记录. 但游标在实际的开发中都不推荐使用. 我们知道还可以借助临时表或表变 ...
随机推荐
- Golang笔记集
学习Golang了, 下面分享我的, 还有我收集的Golang的学习资料 我的基础笔记地址: https://github.com/zhuchangwu/go-study-notes 其他参考: Go ...
- 命令行工具nslookup查域名DNS服务器
在使用的操作系统里进入终端, 1.输入 nslookup 回车 2.输入 set type=ns 回车 3.输入域名(不带WWW的),如:baidu.com 回车 操作过程如下, > set t ...
- 安卓开发学习日记 DAY3——TextView,EditView,ImageView
今天学习了一些控件的使用方法,包括TextView,EditView,ImageView 1.TextView,输出一个文本呗 主要属性有 android:id 标志 android:layout_w ...
- 最全的中文NLP资源库,你确定不来看一下吗?
最全的中文NLP资源库,你确定不来看一下吗? 22/100 发布文章 qq_39248703 hello,小伙伴们大家好,今天给大家分享NLP资源库,可以说是最全的资源库了,很多包非常有趣,值得收藏, ...
- 接口自动化测试之-requests模块详解
一.requests背景 Requests 继承了urllib2的所有特性.Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国 ...
- 两个div在同一行显示
栅格系统需要引用bootstrap插件 <script src="~/Scripts/BootStrap/bootstrap.js"> </script> ...
- 一个lock锁就可以分出低中高水平的程序员对问题的处置方式
说到lock锁,我相信在座的各位没有不会用的,而且还知道怎么用不会出错,但让他们聊一聊为什么可以锁住,都说人以群分,大概就有了下面低中高水平的三类人吧. 第一类人 将lock对象定义成static,这 ...
- MySQL锁---InnoDB行锁需要注意的细节
前言 换了工作之后,接近半年没有发博客了(一直加班),emmmm.....今天好不容易有时间,记录下工作中遇到的一些问题,接下来应该重拾知识点了.因为新公司工作中MySQL库经常出现查询慢,锁等待,节 ...
- vue的组件缓存(返回页面不刷新)
每次使用返回是页面总是会刷新 导致了一些体验上的不愉快 现在 发现vue中的一个很方便的方法还可以用来优化性能就是: keep-alive缓存组件 <router-view v-if=" ...
- 作为python开发者,这几个PyCharm 技巧你必须掌握!
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...