T-SQL 编程之结果集循环处理
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 a From # temp
Open cur1
Fetch cur1 into @i
WHILE @@fetch_status =0
Begin
Select 'cur1:' , @i
-- 内部循环
Declare cur2 Cursor For
Select b 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,[ name ] INTO #nn1
From dbo.code
Select @number = MAX (number) From #nn1
Set @row = 1
WHILE (@row <= @number)
Begin
Inert Into @Temp_table
Select [ name ] From #nn1
Where number = @row
Set @row = @row + 1
END
DROP TABLE #nn1
|
参考文章:
http://www.2cto.com/database/201304/200084.html
T-SQL 编程之结果集循环处理相关推荐
- PL/SQL编程:用while-loop-end循环算出5的阶乘
- PL/SQL编程:用Loop-exit-when-end循环算出5的阶乘
- PL/SQL编程:用for循环算出5的阶乘
- sql delete删除两个表_超强干货!SQL语法大合集
本文针对关系型数据库的一般语法.限于篇幅,本文侧重说明用法,不会展开讲解特性.原理. 1 基本概念 数据库术语 数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件) 数据表( ...
- sql编程接收一个集合_T-SQL是基于集合的编程方法的资产
sql编程接收一个集合 介绍 (Introduction) This article is the third and last one of a series of articles that ai ...
- sql编程接收一个集合_T-SQL中基于集合的程序编程方法简介
sql编程接收一个集合 介绍 (Introduction) Most IT professionals started their studies or careers by learning pro ...
- ORACLE PL/SQL编程
PL/SQL程序设计 什么是PL/SQL PL/SQL是 Procedure Language & Structured Query Language 的缩写.PL/SQL是对SQL语言存储过 ...
- Oracl中PL/SQL编程(10级学员 张帅鹏课堂总结)
Oracl中PL/SQL编程 概述: PL/SQL是oracle的专用语言,它对标准的SQL语言的扩展.SQL语句可以嵌套在PL/SQL语言中,并结合处理语句.举例,一般在银行系统中,都是事先写好的s ...
- 基于Oracle的SQL编程
基于Oracle的SQL编程 你知道吗?SQL从某种程度上说也是一门编程语言!SQL也有相应的标识符.变量流程控制语句.函数.存储过程等具备了编程语言的特性.而新的SQL规范甚至可以使用Java类并引 ...
最新文章
- ”计算机操作系统“学习笔记1
- redis使用watch完成秒杀抢购功能
- 【Java并发编程】并发之痛 Thread,Goroutine,Actor
- 20151118小问题
- 定位到元素后获取其属性_Selenium界面自动化测试(4)(Python):元素定位及操作...
- nioqrc oracle,程序停在 readnocancel () from -lib-tls-libpthread.so.0
- Scala:未受重视却潜力巨大的Android编程语言
- HDU2016 数据的交换输出【入门】
- 常用的正则表达式及符号诠释
- 一个Query Builder,征集更好用的Query Builder的设计方案
- Windows安装zookeeper和kafka
- access 数据库和mysql_access数据库和sql数据库你必须知道的区别
- macOS Mojave 10.14.6 ISO/CDR 虚拟机镜像下载
- android启用hdcp_如何在Google Android模拟器中启用Android Market
- [GIS原理] 8 GIS基本空间分析-叠置分析|缓冲区分析|窗口分析
- 【论文笔记】基于 ROS 的送餐机器人自主抓取实现
- 英语语法最终珍藏版笔记-11分词
- apache-Tomcat 8.5.39安装包 安装过程以及启动文件详解
- 东芝、东北大学宣布:世界首次使用量子密码技术传输基因组数据
- 【原创】关于not in的一些事情