欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

T-SQL 编程之结果集循环处理

发布时间:2025/3/20 41 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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 编程之结果集循环处理的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。