T-sql 游标
游標(biāo)簡(jiǎn)介:
???? Sql游標(biāo)提供了一種循環(huán)結(jié)果集的機(jī)制,它對(duì)數(shù)據(jù)集中的數(shù)據(jù)進(jìn)行逐行讀取,可以實(shí)現(xiàn)不易用select語(yǔ)句語(yǔ)法輕易地表達(dá)復(fù)雜計(jì)算。
???? 通過(guò)sql語(yǔ)言從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)口,然后把結(jié)果放到內(nèi)存的一塊區(qū)域中.往往這個(gè)結(jié)果講包含多條數(shù)據(jù),這也是游標(biāo)產(chǎn)生了一個(gè)不可避免的弊端對(duì)系統(tǒng)資源占用相對(duì)較大。
游標(biāo)的使用過(guò)程:
1.聲明游標(biāo)
2.打開(kāi)游標(biāo)
3.從游標(biāo)中重復(fù)(讀取)行,有選擇的修改或者刪除
4.關(guān)閉游標(biāo)
5.當(dāng)不再需要游標(biāo)時(shí),釋放游標(biāo)
?
聲明一個(gè)游標(biāo)
?DECLARE 游標(biāo)名 [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR sql-statement
例:Declare Mycursor
?? For select * from tb_name
打開(kāi)游標(biāo)
OPEN?MyCursor
游標(biāo)的操作
?FETCH
?? ?? ????? [ NEXT | PRIOR | FIRST | LAST]
FROM
{ 游標(biāo)名 | @游標(biāo)變量名 } [ INTO @變量名 [,…] ]
一.?? 可滾動(dòng)游標(biāo)
?Next?????? 當(dāng)前行的下一行
?Prior?????? 當(dāng)前行的前一行
?First?????? 第一行
?Last??????? 最后一行
?Absolute n?? n>0,定位到從開(kāi)始的第n行
?????????????????? n=0 沒(méi)有返回行
??????????????????? n<0 定位到末尾前的第n行
?Relative n?? n<-1 定位到當(dāng)前行之前的第n行
????????????????? n=-1 通Prior關(guān)鍵字相同
????? ??????????? n=0 定位到當(dāng)前行 [重讀]
????????????????? n=1 同Next關(guān)鍵字相同
???????????????? N>1定位到當(dāng)前行之后的第n行
?
Code
---聲明游標(biāo)
DECLARE?@MyVariable?CURSOR
DECLARE?@LastName?varchar(50),?@FirstName?varchar(50)
select?@LastName,@FirstName
DECLARE?MyCursor?CURSOR?FOR
SELECT?top?10?keyid,keyname?FROM?test1
open?MyCursor?
while?@@Fetch_status=0
begin
FETCH???next???FROM???MyCursor?INTO?@LastName,?@FirstName
select?@LastName,@FirstName
end
close?mycursor
deallocate?mycursor
--刪除語(yǔ)句
declare?test??cursor?for
select?top?10?ID?from?test1?order?by?ID??asc
declare?@ID?nvarchar(10)
open?test
fetch?next?from?test?into?@ID
while?@@fetch_status=0
begin
????delete?from??test1????where?ID=@ID
????fetch?next?from?test?into?@ID
end
close?test
deallocate?test
--更新UPDATE語(yǔ)句
declare?test??cursor?for
select?top?50?ID?from?test1?order?by?ID?
declare?@ID?nvarchar(10),@ID2?int
open?test
set?@ID2=0
fetch?next?from?test?into?@ID
while?@@fetch_status=0
begin
SET?@ID2?=?@ID2?+?1
????update?test1
????set?keyname=Cast(@ID2?as?nvarchar(10))
????where?ID=@ID
????fetch?next?from?test?into?@ID
end
close?test
deallocate?test
go
每執(zhí)行一個(gè)FETCH操作之后,通常都要查看一下全局變量@@FETCH_STATUS中的狀態(tài)值,以此判斷FETCH操作是否成功。該變量有三種狀態(tài)值:
· 0 表示成功執(zhí)行FETCH語(yǔ)句。
· -1 表示FETCH語(yǔ)句失敗,例如移動(dòng)行指針使其超出了結(jié)果集。
· -2 表示被提取的行不存在。
由于@@FETCH_STATU是全局變量,在一個(gè)連接上的所有游標(biāo)都可能影響該變量的值。因此,在執(zhí)行一條FETCH語(yǔ)句后,必須在對(duì)另一游標(biāo)執(zhí)行另一FETCH 語(yǔ)句之前測(cè)試該變量的值才能作出正確的判斷。
?
?
?
Code??USE?master
????GO
CREATE?PROCEDURE?sp_BuildIndexes
AS
DECLARE?@TableName?sysname,?@msg?varchar(100),?@cmd?varchar(100)
DECLARE?table_cur?CURSOR?FOR
SELECT?name?FROM?sysobjects?WHERE?type=’u’
OPEN?table_cur
FETCH?NEXT?FROM?table_cur?INTO?@TableName
WHILE?@@fetch_status?=?0
BEGIN
IF?@@fetch_status?=?-2
CONTINUE
SELECT?@msg?=?“Building?indexes?for?table”+@TableName+”…”
PRINT?@msg
SELECT?@cmd?=?“DBCC?DBREINDEX?(‘”+@TableName+”')”
EXEC?(@cmd)
PRINT?“?“
FETCH?NEXT?FROM?table_cur?INTO?@TableName
END
DEALLOCATE?table_cur
GO
下面的腳本將為PUBS數(shù)據(jù)庫(kù)執(zhí)行sp_BuildIndexes
USE?pubs
GO
EXEC?ap_BuildIndexes
Code
use?pubs
go
declare?@int?int
declare?mycursor?scroll?cursor
for?select??job_id??from?jobs
open?mycursor
Fetch?Next?From?mycursor??into?@int?--之前缺少這句?,
---@@Fetch_status?所得到的數(shù)值總是-1
while?@@Fetch_status?=?0
begin
print?@int
?FETCH?Next?FROM?mycursor?into?@int?
end
close?mycursor
deallocate?mycursor
轉(zhuǎn)載于:https://www.cnblogs.com/rhythmK/archive/2009/08/10/1542754.html
總結(jié)
- 上一篇: 解决StreamReader读取中文出现
- 下一篇: POJ 1088----滑雪(DP)