當前位置:
首頁 >
T-SQL 编程之结果集循环处理
發布時間:2025/3/20
38
豆豆
生活随笔
收集整理的這篇文章主要介紹了
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 编程之结果集循环处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直接用SM30的维护表创建事务代码
- 下一篇: ABAP数据库—更新数据