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

表变量来实现表的遍历
以下代码中,代码块之间的差异已经用灰色的背景标记。
复制代码 代码如下:
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

更多相关文章

  1. Android(安卓)中文API(86)——ResourceCursorAdapter
  2. 获取android联系人信息
  3. Android(安卓)遍历ListView条目控件
  4. 【有图】android通过jdbc连接mysql(附文件)
  5. 遍历android根目录的简单资源查看器
  6. android分页查询获取系统联系人信息
  7. android sqlist中游标下标越界问题解决方案
  8. Android遍历获取正在运行的服务(ActivityManager.RunningServiceI
  9. Android(安卓)studio 操作数据库游标适配器

随机推荐

  1. 对职业生涯的思考
  2. 国内技术氛围到底怎么样呢
  3. Springboot整合mybatis多数据源(注解完整
  4. 帮你解读什么是Redis缓存穿透和缓存雪崩
  5. 说说Java的Comparable 与 Comparator
  6. Prometheus和Grafana监控Nacos
  7. Mysql各种存储引擎对比总结
  8. Go语言开发的Web框架都有哪些?
  9. PMP备考心得
  10. Android学习笔记3:使用日志工具