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遍历表中记录. 但游标在实际的开发中都不推荐使用. 我们知道还可以借助临时表或表变 ...
随机推荐
- shell编写一个批量添加用户脚本
shell编写一个批量添加用户脚本 5.1问题 本例要求在虚拟机server0上创建/roo ...
- python学习 0 python简介
一.Python简介 python是一门简单易学又功能强大的编程语言.它具有高效的高级数据结构和简单而有效的面向对象编程的特性.python优雅的语法和动态类型.以及其解释性的性质,使它在许多领域和大 ...
- C#两大知名Redis客户端连接哨兵集群的姿势
前言 前面利用<Docker-Compose搭建Redis高可用哨兵集群>, 我们的思路是将Redis.Sentinel.Redis Client App链接到同一个网桥网络,这个网桥内的 ...
- java京东自动登录
大部分代码都是参考的这边,我只是在他的逻辑上实现了自动通过验证码,放上主逻辑的代码吧,图片识别我用的若快,可以去接其他平台 https://blog.csdn.net/u013232789/artic ...
- "首字母变大写"组件:<capitalize> —— 快应用组件库H-UI
 <import name="capitalize" src="../Common/ui/h-ui/text/c_text_capitalize"> ...
- 非PDC角色DC强制NTP
前一阵,公司其他部门员工告诉我,他们的系统无法通过LDAP搜索账户了 经过检查,发现该服务器的时间居然比我们的时间服务器PDC快了将近20分钟,而且该问题机器的 时间源并非PDC,而是另外一台普通DC ...
- ViewStub
在书上了解了ViewStub,但只是带过两笔,没能了解.在网上搜索了一些资料,虽然很多文章都讲得比较完善,但是觉得可能是表达的原因,导致某个点上我理解错误,慢慢的才算比较清楚的认识ViewStub. ...
- 【Tool】Windows系统安装Maven依赖管理工具
安装Maven依赖管理工具 官网下载地址:http://maven.apache.org/download.cgi 系统环境要求: [JDK]Maven3.3版本+需要JDK1.7版本以上支持 [内存 ...
- 使用snapjs实现svg路径描边动画
一,snap.svg插件在近几天,突然接到一个需求,内容是要在网页上写一个路径的动画,还需要可以随意控制动画的速度,开始于结束,本来是一个图片可以解决的问题,结果就这样变难了呀,在网上查一会之后,突然 ...
- 如何批量修改文件后缀名,python来帮你
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...