SQL Server遍历表中记录的2种方法(使用表变量和游标)
2013-02-28 00:00
579 查看
SQL Server遍历表一般都要用到游标,SQL Server中可以很容易的用游标实现循环,实现SQL Server遍历表中记录。本文将介绍利用使用表变量和游标实现数据库中表的遍历。
表变量来实现表的遍历
以下代码中,代码块之间的差异已经用灰色的背景标记。
但是这种方法,必须借助ROWCOUNT。但是使用 SET ROWCOUNT 将可能会影响 DELETE、INSERT 和 UPDATE 语句。
所以修改上面WHILE循环,改用TOP来选出首条记录。
这种方法也存在一个问题,需要将遍历过的行删除,事实上,我们在实际应用中可能并不想要遍历完一行就删除一行。
利用游标来遍历表
游标是非常邪恶的一种存在,使用游标经常会比使用面向集合的方法慢2-3倍,当游标定义在大数据量时,这个比例还会增加。如果可能,尽量使用while,子查询,临时表,函数,表变量等来替代游标,记住,游标永远只是你最后无奈之下的选择,而不是首选。
表变量来实现表的遍历
以下代码中,代码块之间的差异已经用灰色的背景标记。
DECLARE @temp TABLE ( [id] INT IDENTITY(1, 1) , [Name] VARCHAR(10) ) DECLARE @tempId INT , @tempName VARCHAR(10) INSERT INTO @temp VALUES ( 'a' ) INSERT INTO @temp VALUES ( 'b' ) INSERT INTO @temp VALUES ( 'c' ) INSERT INTO @temp VALUES ( 'd' ) INSERT INTO @temp VALUES ( 'e' ) WHILE EXISTS ( SELECT [id] FROM @temp ) BEGIN SET ROWCOUNT 1 SELECT @tempId = [id] , @tempName = [Name] FROM @temp SET ROWCOUNT 0 --delete from @temp where [id] = @tempId PRINT 'Name:----' + @tempName END
但是这种方法,必须借助ROWCOUNT。但是使用 SET ROWCOUNT 将可能会影响 DELETE、INSERT 和 UPDATE 语句。
所以修改上面WHILE循环,改用TOP来选出首条记录。
WHILE EXISTS ( SELECT [id] FROM @temp ) BEGIN SELECT TOP 1 @tempId = [id] , @tempName = [Name] FROM @temp DELETE FROM @temp WHERE [id] = @tempId SELECT * FROM @temp EXEC('drop table '+) PRINT 'Name:----' + @tempName END
这种方法也存在一个问题,需要将遍历过的行删除,事实上,我们在实际应用中可能并不想要遍历完一行就删除一行。
利用游标来遍历表
游标是非常邪恶的一种存在,使用游标经常会比使用面向集合的方法慢2-3倍,当游标定义在大数据量时,这个比例还会增加。如果可能,尽量使用while,子查询,临时表,函数,表变量等来替代游标,记住,游标永远只是你最后无奈之下的选择,而不是首选。
--定义表变量 DECLARE @temp TABLE ( [id] INT IDENTITY(1, 1) , [Name] VARCHAR(10) ) DECLARE @tempId INT , @tempName VARCHAR(10) DECLARE test_Cursor CURSOR LOCAL FOR SELECT [id],[name] FROM @temp --插入数据值 INSERT INTO @temp VALUES ( 'a' ) INSERT INTO @temp VALUES ( 'b' ) INSERT INTO @temp VALUES ( 'c' ) INSERT INTO @temp VALUES ( 'd' ) INSERT INTO @temp VALUES ( 'e' ) --打开游标 OPEN test_Cursor WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM test_Cursor INTO @tempId,@tempname PRINT 'Name:----' + @tempName END CLOSE test_Cursor DEALLOCATE test_Cursor
相关文章推荐
- sql临时表,表变量,CTE,游标使用方法
- Oracle游标使用方法(&游标里使用变量绑定)
- SQL Server遍历表中记录的2种方法
- 使用PL/SQL 记录变量接收游标数据
- 利用在带有游标的过程中使用 WHILE的方法取出各个门店零售的销售数据(遍历多表取出数字)
- [SQL模板] 避免使用游标 cursor 的最佳方法
- VS高级使用方法1:autoexp.dat使用Visual studio在debug时显示变量内容
- 游标常量+游标变量的使用
- Asp.net中static变量和viewstate的使用方法(谨慎)
- 在PL/SQL中使用游标、动态sql和绑定变量的小例子
- 在 iPhone 开发中,全局变量的几种使用方法
- sql server游标的Cursor for后面使用变量
- Django 模板中变量、过滤器、标签的使用方法
- Bash变量及条件判断使用记录
- 学习记录-QCheckBox使用setChecked初始设置没有信号的解决方法
- 在iPhone开发中,全局变量的几种使用方法
- itemRender---之outerDocument : 使用itemRender 和item Editor时想要访问外部变量或方法的关键字
- [黑马程序员] _变量的基本使用方法(赋值、占位符、接收、命名规则)
- 关于gSoap我得使用方法记录