设为首页 收藏本站
查看: 503|回复: 0

[经验分享] SQL Server遍历表中记录的2种方法

[复制链接]

尚未签到

发表于 2015-6-27 21:03:30 | 显示全部楼层 |阅读模式
  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
  
  参考链接:
  SQL Server遍历表中记录的实现方法
  SQL Server游标的使用
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81077-1-1.html 上篇帖子: InfoPath开发实战(3):获取SQL Server中的数据 下篇帖子: SQL Server 2008空间数据应用系列九:使用空间工具(Spatial Tools)导入ESRI格式地图数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表