1.游标循环

在关系数据库中,循环遍历数据的方式,可以通过游标来实现。

通常查询数据时都是以集合的方式进行的,然而游标打破了这一规则,可以进行逐行的查询;

在T-SQL中,游标的生命周期由5部分组成,也就是说,要使用游标,必须执行以下这5个步骤:

1).定义游标

2).打开游标

3).使用游标

4).关闭游标

5).释放游标

简单示例:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
-- 检查临时表
IF NOT object_id(‘TempDB.. #temp’) IS NULL
Begin
DROP TABLE TempDB..#Temp_table
End
-- 创建临时表
Create Table TempDB..#Temp_table (a int, b int)
-- 1. 定义游标
Declare cur1 CURSOR FOR
-- 游标查询数据集合
Insert into TempDB..#Temp_table
       Select 1, 2
Declare @i int,
-- 2.打开游标
OPEN cur
-- 3.使用游标
FETCH cur  INTO @i
While @@fetch_status = 0
Begin
    Print @i
    -- 下一条记录
    Fetch cur into @i
End
-- 4. 关闭游标
Close cur
IF NOT object_id(‘TempDB.. #temp’) IS NULL
Gegin
DROP TABLE TempDB..#Temp_table
End
-- 5. 释放游标
Deallocate cur

2.游标嵌套循环

对于游标的嵌套循环操作,在 “使用游标” 的周期时,再次执行一次游标循环:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Create Table #temp(a int,b int)
Insert Into #temp
       Select 1,2
Insert Into #temp
       Select 3,4
Select From #temp
Declare @i int,  @j int
Declare cur1 Cursor For
     Select From #temp
Open cur1
Fetch cur1 into @i
WHILE @@fetch_status =0
Begin
       Select 'cur1:', @i
       -- 内部循环
       Declare cur2 Cursor For
               Select From #temp
       Open cur2
       Fetch cur2 into @j
       WHILE @@fetch_Status =0
       Begin
             Select 'cur2:',@j
             Fetch cur2 into @j
       End
       Close cur2
       Deallocate cur2
Fetch cur1 into @i
End
Close cur1
Drop Table #temp
Deallocate cur1

3. 游标的优缺点

优点:逐行查询,优化数据处理,方便开发人员

缺点:性能上,消耗更多的内存,减少可用的并发,占用带宽,锁定资源,代码量大,可读性差;

不难看出,使用游标的缺点多于其优点,但其存在必定有其作用,SQL Server中的系统多处使用游标检索、处理数据。

在开发中,可以将游标作为一种备用,当我们穷尽了 While循环,子查询,临时表,表变量,自建函数或其他方式扔来无法实现某些查询的时候,使用游标实现

4. 避免使用游标的处理方法

可以通过While循环、变量、临时表等方式,来避免使用游标。

这里有两种方法可以避免使用游标,如若还不能满足需求,就只能回头使用游标了。

第一种方法(常用方法):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
-- 定义一个表变量(必须包含自增长的ID主键)
Declare @tempTable table(ID int identity(1,1), unitID int, unitState int, partID bigint)
Insert into @tempTable
       Select distinct u.id, u.UnitStateID, u.PartID
       From ffUnit u
       Join ffUnitDetail ud On u.id =  ud.unitID
       Where ud.InmostPackageID = @packageID
--  定义累加变量
Declare @i int
Declare @j int
Set @i = 0
Select @j = MAX(ID) From @tempTable
WHILE @i < @j
Begin
      Set @i = @i + 1
      Set @UnitID = null
      Set @CurrUnitStateID = null
      Set @PartID = null
      Select @UnitID = unitID, @CurrUnitStateID = unitState, @PartID = partID
             From @tempTable
             Where ID = @i
      Drop Table @ tempTable Where ID = @i
End
Drop Table @tempTable

第二种方法(使用ROW_NUMBER函数):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Declare @row int
Declare @number int;
Declare @Temp_table Table ( [name] nvarchar(200))
Select ROW_NUMBER() OVER (ORDER BY [Name] ) AS number,[nameINTO #nn1
  
       From dbo.code
Select @number = MAX(number) From #nn1
Set @row = 1
WHILE (@row <= @number)
Begin
     Inert Into @Temp_table
           Select [nameFrom #nn1
                  Where number = @row
     Set @row = @row + 1
END
DROP TABLE #nn1

参考文章:

http://www.2cto.com/database/201304/200084.html

T-SQL 编程之结果集循环处理相关推荐

  1. PL/SQL编程:用while-loop-end循环算出5的阶乘

  2. PL/SQL编程:用Loop-exit-when-end循环算出5的阶乘

  3. PL/SQL编程:用for循环算出5的阶乘

  4. sql delete删除两个表_超强干货!SQL语法大合集

    本文针对关系型数据库的一般语法.限于篇幅,本文侧重说明用法,不会展开讲解特性.原理. 1 基本概念 数据库术语 数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件) 数据表( ...

  5. sql编程接收一个集合_T-SQL是基于集合的编程方法的资产

    sql编程接收一个集合 介绍 (Introduction) This article is the third and last one of a series of articles that ai ...

  6. sql编程接收一个集合_T-SQL中基于集合的程序编程方法简介

    sql编程接收一个集合 介绍 (Introduction) Most IT professionals started their studies or careers by learning pro ...

  7. ORACLE PL/SQL编程

    PL/SQL程序设计 什么是PL/SQL PL/SQL是 Procedure Language & Structured Query Language 的缩写.PL/SQL是对SQL语言存储过 ...

  8. Oracl中PL/SQL编程(10级学员 张帅鹏课堂总结)

    Oracl中PL/SQL编程 概述: PL/SQL是oracle的专用语言,它对标准的SQL语言的扩展.SQL语句可以嵌套在PL/SQL语言中,并结合处理语句.举例,一般在银行系统中,都是事先写好的s ...

  9. 基于Oracle的SQL编程

    基于Oracle的SQL编程 你知道吗?SQL从某种程度上说也是一门编程语言!SQL也有相应的标识符.变量流程控制语句.函数.存储过程等具备了编程语言的特性.而新的SQL规范甚至可以使用Java类并引 ...

最新文章

  1. ”计算机操作系统“学习笔记1
  2. redis使用watch完成秒杀抢购功能
  3. 【Java并发编程】并发之痛 Thread,Goroutine,Actor
  4. 20151118小问题
  5. 定位到元素后获取其属性_Selenium界面自动化测试(4)(Python):元素定位及操作...
  6. nioqrc oracle,程序停在 readnocancel () from -lib-tls-libpthread.so.0
  7. Scala:未受重视却潜力巨大的Android编程语言
  8. HDU2016 数据的交换输出【入门】
  9. 常用的正则表达式及符号诠释
  10. 一个Query Builder,征集更好用的Query Builder的设计方案
  11. Windows安装zookeeper和kafka
  12. access 数据库和mysql_access数据库和sql数据库你必须知道的区别
  13. macOS Mojave 10.14.6 ISO/CDR 虚拟机镜像下载
  14. android启用hdcp_如何在Google Android模拟器中启用Android Market
  15. [GIS原理] 8 GIS基本空间分析-叠置分析|缓冲区分析|窗口分析
  16. 【论文笔记】基于 ROS 的送餐机器人自主抓取实现
  17. 英语语法最终珍藏版笔记-11分词
  18. apache-Tomcat 8.5.39安装包 安装过程以及启动文件详解
  19. 东芝、东北大学宣布:世界首次使用量子密码技术传输基因组数据
  20. 【原创】关于not in的一些事情

热门文章

  1. 技术名词API/SDK/DLL的非技术层面理解
  2. 我们从产品团队扩大中学到了什么
  3. 新产品孕育记:PM如何把一款产品从0带到1
  4. 爱我别走:产品大改版时,如何避免用户流失?
  5. PMcaff-产品 | 教你做好产品设计规范,提升工作效率
  6. 【事件】对战微信,阿里企业级社交产品“钉钉”的深度解读
  7. android ptrace注入
  8. 状态机编程思想:删除代码注释(支持C/C++和Java)
  9. 小白初学搭建 配置本地yum
  10. 检测到在集成的托管管道模式下不适用的 ASP.NET 设置。