深入SQL Cursor基本用法的詳細(xì)介紹
更新時(shí)間:2013年06月11日 11:01:51 作者:
本篇文章是對SQL Cursor的基本用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
由于這個(gè)游標(biāo) 執(zhí)行一下就相當(dāng)于SELECT一下 其效率不敢恭維也沒做深入研究。
table1結(jié)構(gòu)如下
id int
name varchar(50)
declare @id int
declare @name varchar(50)
declare cursor1 cursor for --定義游標(biāo)cursor1
select * from table1 --使用游標(biāo)的對象(跟據(jù)需要填入select文)
open cursor1 --打開游標(biāo)
fetch next from cursor1 into @id,@name --將游標(biāo)向下移1行,獲取的數(shù)據(jù)放入之前定義的變量@id,@name中
while @@fetch_status=0 --判斷是否成功獲取數(shù)據(jù)
begin
update table1 set name=name+'1'
where id=@id --進(jìn)行相應(yīng)處理(跟據(jù)需要填入SQL文)
fetch next from cursor1 into @id,@name --將游標(biāo)向下移1行
end
close cursor1 --關(guān)閉游標(biāo)
deallocate cursor1
游標(biāo)一般格式:
DECLARE 游標(biāo)名稱 CURSOR FOR SELECT 字段1,字段2,字段3,... FROM 表名 WHERE ...
OPEN 游標(biāo)名稱
FETCH NEXT FROM 游標(biāo)名稱 INTO 變量名1,變量名2,變量名3,...
WHILE @@FETCH_STATUS=0
BEGIN
SQL語句執(zhí)行過程... ...
FETCH NEXT FROM 游標(biāo)名稱 INTO 變量名1,變量名2,變量名3,...
END
CLOSE 游標(biāo)名稱
DEALLOCATE 游標(biāo)名稱 (刪除游標(biāo))
例子:
/*
功能:數(shù)據(jù)庫表格tbl_users數(shù)據(jù)
deptid userid username
1 100 a
1 101 b
2 102 c
要求用一個(gè)sql語句輸出下面結(jié)果
deptid username
1 ab
2 c
[要求用游標(biāo)實(shí)現(xiàn)設(shè)計(jì): OK_008
時(shí)間: 2006-05
備注:無
*/
create table #Temp1(deptid int,userid int,username varchar(20)) --待測試的數(shù)據(jù)表
create table #Temp2(deptid int,username varchar(20)) --結(jié)果表
--先把一些待測試的數(shù)據(jù)插入到待測試表#Temp1中
insert into #Temp1
select 1,100,'a' union all
select 1,101,'b' union all
select 1,131,'d' union all
select 1,201,'f' union all
select 2,302,'c' union all
select 2,202,'a' union all
select 2,221,'e' union all
select 3,102,'y' union all
select 3,302,'e' union all
select 3,121,'t'
--
declare @deptid int,@username varchar(20)
--定義游標(biāo)
declare Select_cursor cursor for
select deptid,username from #Temp1
open Select_cursor
fetch next from Select_cursor into @deptid,@username --提取操作的列數(shù)據(jù)放到局部變量中
while @@fetch_status=0 --返回被 FETCH 語句執(zhí)行的最后游標(biāo)的狀態(tài)
/*
@@FETCH_STATUS =0 FETCH 語句成功
@@FETCH_STATUS =-1 FETCH 語句失敗或此行不在結(jié)果集中
@@FETCH_STATUS =-2 被提取的行不存在
*/
begin
--當(dāng)表#Temp2列deptid存在相同的數(shù)據(jù)時(shí),就直接在列username上追加@username值
if(exists(select * from #Temp2 where deptid=@deptid ))
update #Temp2 set username=username +@username where deptid=@deptid
else
--插入新數(shù)據(jù)
insert into #Temp2 select @deptid,@username
fetch next from Select_cursor into @deptid,@username
end
close Select_cursor
deallocate Select_cursor
select * from #Temp2 --測試結(jié)果
Drop table #Temp1,#Temp2
復(fù)制代碼 代碼如下:
table1結(jié)構(gòu)如下
id int
name varchar(50)
declare @id int
declare @name varchar(50)
declare cursor1 cursor for --定義游標(biāo)cursor1
select * from table1 --使用游標(biāo)的對象(跟據(jù)需要填入select文)
open cursor1 --打開游標(biāo)
fetch next from cursor1 into @id,@name --將游標(biāo)向下移1行,獲取的數(shù)據(jù)放入之前定義的變量@id,@name中
while @@fetch_status=0 --判斷是否成功獲取數(shù)據(jù)
begin
update table1 set name=name+'1'
where id=@id --進(jìn)行相應(yīng)處理(跟據(jù)需要填入SQL文)
fetch next from cursor1 into @id,@name --將游標(biāo)向下移1行
end
close cursor1 --關(guān)閉游標(biāo)
deallocate cursor1
游標(biāo)一般格式:
DECLARE 游標(biāo)名稱 CURSOR FOR SELECT 字段1,字段2,字段3,... FROM 表名 WHERE ...
OPEN 游標(biāo)名稱
FETCH NEXT FROM 游標(biāo)名稱 INTO 變量名1,變量名2,變量名3,...
WHILE @@FETCH_STATUS=0
BEGIN
SQL語句執(zhí)行過程... ...
FETCH NEXT FROM 游標(biāo)名稱 INTO 變量名1,變量名2,變量名3,...
END
CLOSE 游標(biāo)名稱
DEALLOCATE 游標(biāo)名稱 (刪除游標(biāo))
復(fù)制代碼 代碼如下:
例子:
/*
功能:數(shù)據(jù)庫表格tbl_users數(shù)據(jù)
deptid userid username
1 100 a
1 101 b
2 102 c
要求用一個(gè)sql語句輸出下面結(jié)果
deptid username
1 ab
2 c
[要求用游標(biāo)實(shí)現(xiàn)設(shè)計(jì): OK_008
時(shí)間: 2006-05
備注:無
*/
create table #Temp1(deptid int,userid int,username varchar(20)) --待測試的數(shù)據(jù)表
create table #Temp2(deptid int,username varchar(20)) --結(jié)果表
--先把一些待測試的數(shù)據(jù)插入到待測試表#Temp1中
insert into #Temp1
select 1,100,'a' union all
select 1,101,'b' union all
select 1,131,'d' union all
select 1,201,'f' union all
select 2,302,'c' union all
select 2,202,'a' union all
select 2,221,'e' union all
select 3,102,'y' union all
select 3,302,'e' union all
select 3,121,'t'
--
declare @deptid int,@username varchar(20)
--定義游標(biāo)
declare Select_cursor cursor for
select deptid,username from #Temp1
open Select_cursor
fetch next from Select_cursor into @deptid,@username --提取操作的列數(shù)據(jù)放到局部變量中
while @@fetch_status=0 --返回被 FETCH 語句執(zhí)行的最后游標(biāo)的狀態(tài)
/*
@@FETCH_STATUS =0 FETCH 語句成功
@@FETCH_STATUS =-1 FETCH 語句失敗或此行不在結(jié)果集中
@@FETCH_STATUS =-2 被提取的行不存在
*/
begin
--當(dāng)表#Temp2列deptid存在相同的數(shù)據(jù)時(shí),就直接在列username上追加@username值
if(exists(select * from #Temp2 where deptid=@deptid ))
update #Temp2 set username=username +@username where deptid=@deptid
else
--插入新數(shù)據(jù)
insert into #Temp2 select @deptid,@username
fetch next from Select_cursor into @deptid,@username
end
close Select_cursor
deallocate Select_cursor
select * from #Temp2 --測試結(jié)果
Drop table #Temp1,#Temp2
您可能感興趣的文章:
相關(guān)文章
SQL Server數(shù)據(jù)庫中的存儲過程介紹
這篇文章主要介紹了SQL Server數(shù)據(jù)庫中的存儲過程介紹,本文講解了什么是存儲過程、存儲過程語法、存儲過程的一些使用實(shí)例等內(nèi)容,需要的朋友可以參考下2015-01-01SQL Server數(shù)據(jù)庫安裝時(shí)常見問題解決方案集錦
對于初學(xué)者來說,安裝SQL Server數(shù)據(jù)庫時(shí),常常會有一些問題的出現(xiàn),這篇文章就是針對安裝時(shí)常見問題總結(jié)的解決方案,需要的朋友可以參考下2015-08-08使用sp_xml_preparedocument處理XML文檔的方法
有時(shí)會在存儲過程中處理一些XML格式的數(shù)據(jù),所以會用到sp_xml_preparedocument,他可以將XML數(shù)據(jù)進(jìn)行讀取,然后使用 MSXML 分析器 (Msxmlsql.dll) 對其進(jìn)行分析。2011-08-08sqlserver數(shù)據(jù)庫使用存儲過程和dbmail實(shí)現(xiàn)定時(shí)發(fā)送郵件
這篇文章主要介紹了sqlserver數(shù)據(jù)庫存儲過程和Job實(shí)現(xiàn)定時(shí)從數(shù)據(jù)庫發(fā)送郵件的功能,大家參考使用吧2014-01-01