我是靠谱客的博主 魁梧汉堡,最近开发中收集的这篇文章主要介绍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 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,[ 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 编程之结果集循环处理的全部内容,希望文章能够帮你解决T-SQL 编程之结果集循环处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部