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游标的使用

本文转自陈哈哈博客园博客,原文链接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. STM32CubeMX工程定时器配置

    STM32CubeMX生成工程 选择自己的芯片型号 配置RCC寄存器时钟为外部晶振 单击芯片配置GPIO,选择输出方式,重命名标签等 进入时钟配置,本人使用的为8M外部晶振作为时钟源,PLL时钟源选择 ...

  2. 【memcache】Memcached

    一.Memcached 简介 1. 官网:http://www.memcached.org 2. Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. 二.作用: 1. 将数据存入内存 ...

  3. java添加对象成功后想知道当前添加对象的id

    我使用的是springboot Mybatis写的项目,结构如下 mapper.xml(以下2个属性必须要有,主键id 一般是自动生成的) mapper.java  (注意新增的返回值不需要,一般情况 ...

  4. 数据结构和算法(Golang实现)(3)简单入门Golang-流程控制语句

    流程控制语句 计算机编程语言中,流程控制语句很重要,可以让机器知道什么时候做什么事,做几次.主要有条件和循环语句. Golang只有一种循环:for,只有一种判断:if,还有一种特殊的switch条件 ...

  5. vuepress+gitee 构建在线项目文档

    目录 快速入门 在现有vue项目中安装本地开发依赖vuepress 在现有vue项目根目录下创建docs目录 创建并配置文档首页内容 运行,查看效果 可能会出现vue和vue-server-rende ...

  6. MyEclipse 10安装SVN插件subclipse

    1. 下载SVN插件subclipse 下载地址:http://subclipse.tigris.org/servlets/ProjectDocumentList?expandFolder=2240& ...

  7. JAVA—线程(Thread)

    1.线程的状态有哪些 我记得在操作系统原理的书上有一张具体的图,暂时找不到书... new:新建状态,被创建出来后未启动时的线程状态. runnable:就绪状态,表示可以运行. blocked:阻塞 ...

  8. 用python画出全球疫情趋势变化图

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

  9. H - Knight Moves DFS

    A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the sh ...

  10. Java核心技术--接口与内部类

    接口implement 继承接口,即履行"义务". 接口中所有的方法自动属于public,在接口声明中,不必提供关键字public 接口中决不能含有实例域,也不能在接口中实现方法 ...