SQL Server遍历表中记录的2种方法

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

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

相关文章
|
5月前
|
SQL 数据采集 关系型数据库
实现MySQL与SQL Server之间数据迁移的有效方法
总的来说,从MySQL到SQL Server的数据迁移是一个涉及到很多步骤的过程,可能会遇到各种问题和挑战。但只要精心规划、仔细执行,这个任务是完全可以完成的。
331 18
|
7月前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
146 16
|
10月前
|
SQL 存储 关系型数据库
MySQL/SqlServer跨服务器增删改查(CRUD)的一种方法
通过上述方法,MySQL和SQL Server均能够实现跨服务器的增删改查操作。MySQL通过联邦存储引擎提供了直接的跨服务器表访问,而SQL Server通过链接服务器和分布式查询实现了灵活的跨服务器数据操作。这些技术为分布式数据库管理提供了强大的支持,能够满足复杂的数据操作需求。
448 12
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
197 4
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
442 13
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
278 9
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
184 6
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
1039 1
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
1072 3