SQL Server遍历表一般都要用到游标,SQL Server中可以很容易的用游标实现循环,实现SQL Server遍历表中记录。本文将介绍利用使用表变量和游标实现数据库中表的遍历。

表变量来实现表的遍历

以下代码中,代码块之间的差异已经用灰色的背景标记。

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

但是这种方法,必须借助ROWCOUNT。但是使用SET ROWCOUNT将可能会影响 DELETE、INSERT 和 UPDATE 语句。

所以修改上面WHILE循环,改用TOP来选出首条记录。

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

这种方法也存在一个问题,需要将遍历过的行删除,事实上,我们在实际应用中可能并不想要遍历完一行就删除一行。

利用游标来遍历表

  游标是非常邪恶的一种存在,使用游标经常会比使用面向集合的方法慢2-3倍,当游标定义在大数据量时,这个比例还会增加。如果可能,尽量使用while,子查询,临时表,函数,表变量等来替代游标,记住,游标永远只是你最后无奈之下的选择,而不是首选。

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

参考链接:

SQL Server遍历表中记录的实现方法

SQL Server游标的使用

本文转自陈哈哈博客园博客,原文链接http://www.cnblogs.com/kissazi2/archive/2013/02/27/2935307.html如需转载请自行联系原作者

kissazi2

SQL Server遍历表中记录的2种方法的更多相关文章

  1. SQL Server 数据库查找重复记录的几种方法

    http://www.hanyu123.cn/html/c61/6790.html 一.查某一列(或多列)的重复值.(只可以查出重复记录的值,不能查出整个记录的信息) 例如:查找stuid,stuna ...

  2. sql server遍历表不用游标和临时表的方法

    表结果如图 )) ,'Sky,Blue,Water' ,'Book,Apple,Shirt' ,'Cup,Yellow,org' ,'box,phone,paper' GO SELECT id,SUB ...

  3. SQL Server遍历表的几种方法 转载

    SQL Server遍历表的几种方法 阅读目录 使用游标 使用表变量 使用临时表 在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易 ...

  4. SQL Server遍历表的几种方法

    在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易懂,但是它不符合面向集合操作的原则,而且性能也比面向集合低.当然,从面向集合操作的 ...

  5. SQL Server 查看空间使用情况的 5 种方法

    解决方法: 方法 1.sp_spaceused 方法 2.dbcc sqlperf 方法 3.dbcc showfilestats 方法 4.dbcc showcontig 方法 5.sys.dm_d ...

  6. SQL Server 查看备份集元数据的 4 种方法。

    方法 1. restore labelonly 方法 2. restore headeronly 方法 3. restore filelistonly 方法 4. restore verifyonly ...

  7. sql server 遍历表成一棵树结构

    一棵树的层次结构都在一张表内,当有这样的需要的时候.. 可以这样玩: <!-- DepartmentDTO 对象对应 department表_查询sql --> <sql id=&q ...

  8. SQL Server 查看数据库空间分配情况的 2 种方法

    方法 1. sys.dm_db_file_space_usage. 方法 2. sys.dm_db_session_space_usage. ----------------------------- ...

  9. SQL Server中如何实现遍历表的记录

    SQL Server遍历表一般都要用到游标,SQL Server中可以很容易的用游标实现循环,实现SQL Server遍历表中记录. 但游标在实际的开发中都不推荐使用. 我们知道还可以借助临时表或表变 ...

随机推荐

  1. shell编写一个批量添加用户脚本

                                                          shell编写一个批量添加用户脚本 5.1问题 本例要求在虚拟机server0上创建/roo ...

  2. python学习 0 python简介

    一.Python简介 python是一门简单易学又功能强大的编程语言.它具有高效的高级数据结构和简单而有效的面向对象编程的特性.python优雅的语法和动态类型.以及其解释性的性质,使它在许多领域和大 ...

  3. C#两大知名Redis客户端连接哨兵集群的姿势

    前言 前面利用<Docker-Compose搭建Redis高可用哨兵集群>, 我们的思路是将Redis.Sentinel.Redis Client App链接到同一个网桥网络,这个网桥内的 ...

  4. java京东自动登录

    大部分代码都是参考的这边,我只是在他的逻辑上实现了自动通过验证码,放上主逻辑的代码吧,图片识别我用的若快,可以去接其他平台 https://blog.csdn.net/u013232789/artic ...

  5. "首字母变大写"组件:<capitalize> —— 快应用组件库H-UI

     <import name="capitalize" src="../Common/ui/h-ui/text/c_text_capitalize"> ...

  6. 非PDC角色DC强制NTP

    前一阵,公司其他部门员工告诉我,他们的系统无法通过LDAP搜索账户了 经过检查,发现该服务器的时间居然比我们的时间服务器PDC快了将近20分钟,而且该问题机器的 时间源并非PDC,而是另外一台普通DC ...

  7. ViewStub

    在书上了解了ViewStub,但只是带过两笔,没能了解.在网上搜索了一些资料,虽然很多文章都讲得比较完善,但是觉得可能是表达的原因,导致某个点上我理解错误,慢慢的才算比较清楚的认识ViewStub. ...

  8. 【Tool】Windows系统安装Maven依赖管理工具

    安装Maven依赖管理工具 官网下载地址:http://maven.apache.org/download.cgi 系统环境要求: [JDK]Maven3.3版本+需要JDK1.7版本以上支持 [内存 ...

  9. 使用snapjs实现svg路径描边动画

    一,snap.svg插件在近几天,突然接到一个需求,内容是要在网页上写一个路径的动画,还需要可以随意控制动画的速度,开始于结束,本来是一个图片可以解决的问题,结果就这样变难了呀,在网上查一会之后,突然 ...

  10. 如何批量修改文件后缀名,python来帮你

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...