婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Sql存儲過程游標(biāo)循環(huán)的用法及sql如何使用cursor寫一個簡單的循環(huán)

Sql存儲過程游標(biāo)循環(huán)的用法及sql如何使用cursor寫一個簡單的循環(huán)

熱門標(biāo)簽:濮陽清豐400開頭的電話申請 南京怎么申請400這種電話 樂昌電話機(jī)器人 南通智能外呼系統(tǒng)怎么樣 臺灣外呼系統(tǒng)軟件 真3地圖標(biāo)注 地圖標(biāo)注跑線下市場 疫情時期電話機(jī)器人 地圖標(biāo)注可以編輯地名嗎

用游標(biāo),和WHILE可以遍歷您的查詢中的每一條記錄并將要求的字段傳給變量進(jìn)行相應(yīng)的處理

==================

DECLARE 
@A1 VARCHAR(10),
@A2 VARCHAR(10),
@A3 INT
DECLARE CURSOR YOUCURNAME FOR SELECT A1,A2,A3 FROM YOUTABLENAME
OPEN YOUCURNAME
fetch next from youcurname into @a1,@a2,@a3
while @@fetch_status>-1
begin
update … set …-a3 where …

……您要執(zhí)行的操作寫在這里

fetch next from youcurname into @a1,@a2,@a3
end
close youcurname
deallocate youcurname

—————————————

在應(yīng)用程序開發(fā)的時候,我們經(jīng)常可能會遇到下面的應(yīng)用,我們會通過查詢數(shù)據(jù)表的記錄集,循環(huán)每一條記錄,通過每一條的記錄集對另一張表進(jìn)行數(shù)據(jù)進(jìn)行操作,如插入與更新,我們現(xiàn)在假設(shè)有一個這樣的業(yè)務(wù):老師為所在班級的學(xué)生選課,選的課程如有哲學(xué)、馬克思主義政治經(jīng)濟(jì)學(xué)、毛澤東思想概論、鄧小平理論這些課,現(xiàn)在操作主要如下:

1) 先要查詢這些還沒有畢業(yè)的這些學(xué)生的名單,畢業(yè)過后的無法進(jìn)行選課;
2) 在批量的選取學(xué)生的同時,還需要添加對應(yīng)的某一門課程;
3) 點添加后選課結(jié)束。

數(shù)據(jù)量少可能看不出用Java程序直接多次進(jìn)行數(shù)據(jù)庫操作這種辦法實現(xiàn)的弱點,因為它每次在操作數(shù)據(jù)庫的時候,都存在著頻繁的和數(shù)據(jù)庫的I/O直接交互,這點性能的犧牲實屬不應(yīng)該,那我們就看下面的方法,通過存儲過程的游標(biāo)方法來實現(xiàn):建立存儲過程:

Create PROCEDURE P_InsertSubject
@SubjectId int
AS
DECLARE rs CURSOR LOCAL SCROLL FOR
select studentid from student where StudentGradu = 1
OPEN rs
FETCH NEXT FROM rs INTO @tempStudentID
WHILE @@FETCH_STATUS = 0
BEGIN
Insert SelSubject values (@SubjectId,@tempStudentID)
FETCH NEXT FROM rs INTO @tempStudentID
END
CLOSE rs
GO

使用游標(biāo)對記錄集循環(huán)進(jìn)行處理的時候一般操作如以下幾個步驟:

1、把記錄集傳給游標(biāo);
2、打開游標(biāo)
3、開始循環(huán)
4、從游標(biāo)中取值
5、檢查那一行被返回
6、處理
7、關(guān)閉循環(huán)
8、關(guān)閉游標(biāo)

上面這種方法在性能上面無疑已經(jīng)是提高很多了,但我們也想到,在存儲過程編寫的時候,有時候我們盡量少的避免使用游標(biāo)來進(jìn)行操作,所以我們還可以對上面的存儲過程進(jìn)行改造,使用下面的方法來實現(xiàn):

Create PROCEDURE P_InsertSubject
@SubjectId int
AS
declare @i int,
@studentid
DECLARE @tCanStudent TABLE
(
studentid int
,FlagID TINYINT
)
BEGIN
insert @tCanStudent select studentid,0 from student where StudentGradu = 1
SET @i=1
WHILE( @i>=1)
BEGIN
SELECT @studentid=''
SELECT TOP 1 @studentid = studentid FROM @tCanStudent WHERE flagID=0
SET @i=@@ROWCOUNT
IF @i=0 GOTO Return_Lab
Insert SelSubject values (@SubjectId,@studentid)
IF @@error=0
UPDATE @tCanStudent SET flagID=1 WHERE studentid = @studentid
Return_Lab:
END
End
GO

我們現(xiàn)在再來分析以上這個存儲過程,它實現(xiàn)的方法是先把滿足條件的記錄集數(shù)據(jù)存放到一個表變量中,并且在這個表變量中增加一個FLAGID進(jìn)行數(shù)據(jù)初始值為0的存放,然后去循環(huán)這個記錄集,每循環(huán)一次,就把對應(yīng)的FLAGID的值改成1,然后再根據(jù)循環(huán)來查找滿足條件等于0的情況,可以看到,每循環(huán)一次,處理的記錄集就會少一次,然后循環(huán)的往選好課程表里面插入,直到記錄集的條數(shù)為0時停止循環(huán),此時完成操作。

比較以上的幾種循環(huán)方法的應(yīng)用,就會知道,有時候可能對于同一種功能我們實現(xiàn)的方法不同,而最終應(yīng)用程序性能的影響的差異就會很大,第二種、第三種就大大的減少的數(shù)據(jù)庫交互I/O操作的頻繁,會節(jié)省很多時間,方法三又避免用游標(biāo)又可以節(jié)省不必要的開銷。

使用SQL的Agent可以執(zhí)行計劃任務(wù),把寫好的SQL語句放在計劃任務(wù)里,可以達(dá)到奇妙的效果,如定時備份數(shù)據(jù),定時執(zhí)行特定操作等等,當(dāng)涉及循環(huán)操作很多條數(shù)據(jù)時,這里就要使用游標(biāo)了,當(dāng)然SQL中也有循環(huán)語句,如使用While。不過while的功能只能實現(xiàn)一般的操作,游標(biāo)的功能更為強(qiáng)大些,可在一個指定的一個集合內(nèi)循環(huán)操作數(shù)據(jù),實現(xiàn)動態(tài)操作,那就更牛了,呵呵,以下資料供存檔用。

WHILE

設(shè)置重復(fù)執(zhí)行 SQL 語句或語句塊的條件。只要指定的條件為真,就重復(fù)執(zhí)行語句。可以使用 BREAK 和 CONTINUE 關(guān)鍵字在循環(huán)內(nèi)部控制 WHILE 循環(huán)中語句的執(zhí)行。

語法

WHILE Boolean_expression
  { sql_statement | statement_block }
  [ BREAK ]
  { sql_statement | statement_block }
  [ CONTINUE ]

參數(shù)

Boolean_expression

返回 TRUE 或 FALSE 的表達(dá)式。如果布爾表達(dá)式中含有 SELECT 語句,必須用圓括號將 SELECT 語句括起來。

復(fù)制代碼 代碼如下:

{sql_statement | statement_block}

Transact-SQL 語句或用語句塊定義的語句分組。若要定義語句塊,請使用控制流關(guān)鍵字 BEGIN 和 END。

BREAK

導(dǎo)致從最內(nèi)層的 WHILE 循環(huán)中退出。將執(zhí)行出現(xiàn)在 END 關(guān)鍵字后面的任何語句,END 關(guān)鍵字為循環(huán)結(jié)束標(biāo)記。

CONTINUE

使 WHILE 循環(huán)重新開始執(zhí)行,忽略 CONTINUE 關(guān)鍵字后的任何語句。

注釋

如果嵌套了兩個或多個 WHILE 循環(huán),內(nèi)層的 BREAK 將導(dǎo)致退出到下一個外層循環(huán)。首先運(yùn)行內(nèi)層循環(huán)結(jié)束之后的所有語句,然后下一個外層循環(huán)重新開始執(zhí)行。

示例

declare @i int
set @i=1
while @i30
begin
insert into test (userid) values(@i)
set @i=@i+1
end

------------------------------------------------------------

while 條件
begin
執(zhí)行操作
set @i=@i+1
end

A. 在嵌套的 IF...ELSE 和 WHILE 中使用 BREAK 和 CONTINUE

在下例中,如果平均價格少于 $30,WHILE 循環(huán)就將價格加倍,然后選擇最高價。如果最高價少于或等于 $50,WHILE 循環(huán)重新啟動并再次將價格加倍。該循環(huán)不斷地將價格加倍直到最高價格超過 $50,然后退出 WHILE 循環(huán)并打印一條消息。

USE pubs
GO
WHILE (SELECT AVG(price) FROM titles)  $30
BEGIN
  UPDATE titles
  SET price = price * 2
  SELECT MAX(price) FROM titles
  IF (SELECT MAX(price) FROM titles) > $50
  BREAK
  ELSE
  CONTINUE
END
PRINT 'Too much for the market to bear'

B. 在帶有游標(biāo)的過程中使用 WHILE

以下的 WHILE 結(jié)構(gòu)是名為 count_all_rows 過程中的一部分。下例中,該 WHILE 結(jié)構(gòu)測試用于游標(biāo)的函數(shù) @@FETCH_STATUS 的返回值。因為 @@FETCH_STATUS 可能返回 –2、-1 或 0,所以,所有的情況都應(yīng)進(jìn)行測試。如果某一行在開始執(zhí)行此存儲過程以后從游標(biāo)結(jié)果中刪除,將跳過該行。成功提取 (0) 后將執(zhí)行 BEGIN...END 循環(huán)內(nèi)部的 SELECT 語句。

單變量循環(huán)

USE pubs
DECLARE tnames_cursor CURSOR
FOR
  SELECT TABLE_NAME 
  FROM INFORMATION_SCHEMA.TABLES
OPEN tnames_cursor
DECLARE @tablename sysname
--SET @tablename = 'authors'
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@FETCH_STATUS > -1)
BEGIN
  IF (@@FETCH_STATUS > -2)
  BEGIN 
  SELECT @tablename = RTRIM(@tablename) 
  EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM ' 
    + @tablename )
  PRINT ' '
 END
  FETCH NEXT FROM tnames_cursor INTO @tablename
END
CLOSE tnames_cursor
DEALLOCATE tnames_cursor

多變量循環(huán)

CREATE  PROCEDURE my_FeeCount AS
declare @到期時間  char(10)
declare @片區(qū)   char(20)
declare @繳費(fèi)用戶數(shù) char(10)
declare @sql char(2000)
declare cur_data cursor for 
 select convert(varchar(10),到期時間,120) as 到期時間 ,片區(qū),count(distinct main_id) as 繳費(fèi)用戶數(shù) 
 from V_aipu_fee where 提交時間>=convert(varchar(10),getdate()-90,120) and 提交時間convert(varchar(10),getdate()+1-90,120)
 and 收費(fèi)類型='續(xù)費(fèi)收費(fèi)'
 Group by convert(varchar(10),到期時間,120),片區(qū)
 order by convert(varchar(10),到期時間,120) 
open cur_data
fetch next from cur_data into @到期時間,@片區(qū),@繳費(fèi)用戶數(shù) 
while(@@fetch_status = 0) 
begin
  set @sql='update '+RTRIM(@片區(qū))+'實收='+RTRIM(@片區(qū))+'實收+'+RTRIM(@繳費(fèi)用戶數(shù))+' where 收費(fèi)日期='''+RTRIM(@到期時間)+''''
 print @sql
 fetch next from cur_data into @到期時間,@片區(qū),@繳費(fèi)用戶數(shù) 
end
close cur_data

下面接著給大家介紹sql使用cursor寫一個簡單的循環(huán)

1.排錯

  和sql server較了一天的勁,只寫了兩個簡單的存儲過程。當(dāng)然智商雖然不高還沒低到這個份上。大半天都是花費(fèi)在排錯上了。

  System.Data.SqlClient.SqlException: SQL Server 不存在或訪問被拒絕。 at

System.Data.SqlClient.ConnectionPool.GetConnection(Boolean isInTransaction) at System.Data.SqlClient.SqlConnectionPoolManager.GetPooledConnection(SqlConnectionString options, Boolean isInTransaction) at System.Data.SqlClient.SqlConnection.Open() at _20060409.WebForm1.test() in d:\work files\20060409\webform1.aspx.cs:line 52

  冷不丁報了這個錯,這個就是從程序里連不上。在服務(wù)中除了MSSQLserverADHelper以外所有的服務(wù)都打開了還是不行;名稱正確、無別名、沒起實例名稱;端口號服務(wù)器端和客戶端都是1433。為了找出問題只好上網(wǎng)查查結(jié)果發(fā)現(xiàn)連上網(wǎng)線后這個毛病就沒了。暈,看來是少打了什么補(bǔ)丁。

2.寫循環(huán)

  首先需求是這樣的我手里現(xiàn)在有兩張表,rights和roles。

  表結(jié)構(gòu)如下:

rights
  -------------------
  rightid int
  right varchar(20)
  
  ==========
  
  roles
  -------------------
  roleid int
  roletype int
  role varchar(20)
  rightid int

    在我的role表里有一個角色admin。admin擁有right表中的所有權(quán)限,但是有四個字段,要是用手寫完我這個速度,加上這個數(shù)量我看也就算了。省了手上的力氣就要費(fèi)腦子。

  在查詢分析器里寫了半天,總算是吭哧出來了。

  首先使用truncate table把role原來的失敗信息清掉,聽說會比delete快一點,只不過數(shù)量少看不出明顯效果。

  然后建立一個臨時的用于填充的存儲過程。

create procedure TempFill
  
  declare mycursor cursor for
  select rightid from rights--這兩個是一句,定義游標(biāo),然后從rights中取一個rightid給游標(biāo)
  
  open mycursor
  
  declare @rightid int--定義一個變量
  fetch mycursor into @rightid--把mycursor當(dāng)前的值給@rightid
  
  while @@fetch_status=
  begin
  insert into rolestable (roletype,role,rightid)values(,'admin',@rightid)
  fetch mycursor into @rightid
  end
  
  close mycursor
  deallocate mycursor

  這樣就寫完了。

  execute TempFill 再執(zhí)行他一下。

您可能感興趣的文章:
  • MySQL游標(biāo)概念與用法詳解
  • mysql的存儲過程、游標(biāo) 、事務(wù)實例詳解
  • Python操作SQLite數(shù)據(jù)庫的方法詳解【導(dǎo)入,創(chuàng)建,游標(biāo),增刪改查等】
  • MySQL使用游標(biāo)批量處理進(jìn)行表操作
  • Mysql存儲過程循環(huán)內(nèi)嵌套使用游標(biāo)示例代碼
  • MySql游標(biāo)的使用實例
  • 詳解SQL游標(biāo)的用法

標(biāo)簽:南京 河北 廣安 馬鞍山 福建 通遼 阿里 陜西

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Sql存儲過程游標(biāo)循環(huán)的用法及sql如何使用cursor寫一個簡單的循環(huán)》,本文關(guān)鍵詞  Sql,存儲,過程,游標(biāo),循環(huán),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Sql存儲過程游標(biāo)循環(huán)的用法及sql如何使用cursor寫一個簡單的循環(huán)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Sql存儲過程游標(biāo)循環(huán)的用法及sql如何使用cursor寫一個簡單的循環(huán)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲欧美自拍偷拍| 欧美一级日韩免费不卡| 亚洲欧美日韩国产综合在线| 色婷婷综合久久久中文字幕| 国产欧美日本一区视频| 成人综合婷婷国产精品久久 | 91亚洲国产成人精品一区二区三| 亚洲不卡在线观看| 成人黄色电影在线 | 欧美三级视频在线播放| 91黄色激情网站| 91啪亚洲精品| 91小宝寻花一区二区三区| 成人avav影音| 大白屁股一区二区视频| 成人免费三级在线| 色婷婷av一区二区三区软件| 色婷婷综合久久久中文一区二区| 日本久久精品电影| 欧美男人的天堂一二区| 日韩精品专区在线影院观看 | 卡一卡二国产精品| 国产精品一区二区三区乱码| 99在线精品观看| 欧美一区二区三区人| 国产欧美日韩一区二区三区在线观看| 欧美国产日韩一二三区| 日韩电影在线观看网站| 国产成人鲁色资源国产91色综 | 色94色欧美sute亚洲13| 欧美精品v国产精品v日韩精品 | 日本怡春院一区二区| 国产精品麻豆视频| 成人国产精品免费观看动漫| 亚洲品质自拍视频| 欧美色视频在线观看| 一区二区三区精密机械公司| 色哟哟一区二区三区| 日韩成人伦理电影在线观看| 精品免费99久久| 不卡大黄网站免费看| 中文在线资源观看网站视频免费不卡| 欧美tk丨vk视频| 午夜视频在线观看一区| 欧美日韩高清不卡| 亚洲超碰精品一区二区| 欧美久久久久久蜜桃| 日韩avvvv在线播放| 日韩一区二区高清| 国产精品一区二区在线观看网站| 久久综合一区二区| 国产成人自拍网| 精品成人a区在线观看| 久久福利资源站| 国产网站一区二区三区| 色综合夜色一区| 美腿丝袜亚洲色图| 国产精品久久久久久久久晋中| 91亚洲精品久久久蜜桃网站| 亚洲乱码国产乱码精品精小说 | 91精品国产一区二区三区蜜臀| 麻豆国产91在线播放| 中文乱码免费一区二区| 91精品婷婷国产综合久久 | 国产欧美久久久精品影院| 色视频欧美一区二区三区| 精品福利一二区| 国产精品久久久99| 亚洲男同性恋视频| 美女一区二区在线观看| 成人午夜伦理影院| 日韩成人一级片| 91精品午夜视频| 91精品国产免费| 久久综合狠狠综合久久综合88| 国产成人av电影| 久久久午夜精品| 国产专区欧美精品| 欧美亚洲动漫精品| 一区二区三区不卡在线观看| 在线免费av一区| 国产成人一区在线| 亚洲激情中文1区| 国产亚洲精品超碰| 在线免费精品视频| 国产一区在线不卡| 男人操女人的视频在线观看欧美 | 精品一区二区在线视频| 亚洲欧洲一区二区三区| 欧美日韩一级视频| 国产传媒欧美日韩成人| 亚洲卡通动漫在线| 国产亚洲一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃| 性久久久久久久久久久久| 精品欧美久久久| 99久久久无码国产精品| 日韩黄色一级片| 亚洲少妇30p| 久草精品在线观看| 国产一区高清在线| 久久精品国产久精国产| 日本成人在线看| 国产成人精品网址| 91在线观看污| aaa亚洲精品| 99久久99精品久久久久久| 欧美大片一区二区| 久久女同互慰一区二区三区| 国产精品亲子伦对白| 久久这里只有精品6| 久久久三级国产网站| 久久精品视频在线看| 一区二区在线观看不卡| 青青草精品视频| 国产黄人亚洲片| 在线观看日韩一区| 欧美日韩精品欧美日韩精品一 | 成人在线综合网站| 99re免费视频精品全部| 亚洲欧美激情视频在线观看一区二区三区 | 国产乱人伦精品一区二区在线观看 | 精品久久人人做人人爰| 一区二区激情视频| 精品在线观看视频| 欧美精品在线观看播放| 国产亚洲一区二区在线观看| 亚洲综合久久久| 国产精选一区二区三区| 国产丝袜欧美中文另类| 久久精品久久久精品美女| 欧美视频日韩视频在线观看| 欧美韩国日本综合| 国产精品亚洲成人| 欧美高清性hdvideosex| 国产精品电影一区二区| 成人综合在线视频| 久久精品欧美一区二区三区不卡| 国产白丝网站精品污在线入口| 8x福利精品第一导航| 国产精品久久久久久久第一福利| 国产精品18久久久久久久网站| 国产精品一区在线观看你懂的| 中文字幕一区二区三区不卡| 亚洲精品在线免费播放| 欧美情侣在线播放| 在线中文字幕一区二区| 午夜精品影院在线观看| 国产精品二三区| 亚洲男同性恋视频| 五月婷婷激情综合网| 亚洲欧洲中文日韩久久av乱码| 精品国产免费一区二区三区四区 | 久久99久久久久| 亚洲色图制服诱惑| 成人欧美一区二区三区| 精品国产免费一区二区三区四区 | 六月丁香婷婷久久| 图片区小说区区亚洲影院| 中文字幕一区二区不卡| 精品国产91久久久久久久妲己| 精品动漫一区二区三区在线观看| 欧美精品vⅰdeose4hd| 欧美无乱码久久久免费午夜一区 | 欧美日韩一二区| 91女人视频在线观看| 91精品蜜臀在线一区尤物| 欧美一区二区网站| 精品少妇一区二区三区日产乱码| 91麻豆精品国产无毒不卡在线观看 | 国产激情偷乱视频一区二区三区| 美女视频黄免费的久久| 亚洲h动漫在线| 一区二区三区在线视频观看| 中文字幕一区二区三区av| 依依成人综合视频| 亚洲成av人影院| 日韩电影在线一区二区| 欧美aⅴ一区二区三区视频| 久久成人久久爱| 99re在线视频这里只有精品| 在线看日韩精品电影| 日韩视频在线永久播放| 久久精品无码一区二区三区| 午夜欧美大尺度福利影院在线看| 欧美性生活久久| 亚洲国产cao| 欧美精品久久久久久久久老牛影院 | 国产欧美一区二区精品仙草咪| 亚洲国产欧美在线| 色婷婷激情一区二区三区| 国产精品精品国产色婷婷| 国产精一区二区三区| 色婷婷综合五月| 国产午夜亚洲精品不卡| 风间由美一区二区三区在线观看 | 91免费视频观看| 国产亚洲美州欧州综合国| 看国产成人h片视频| 精品人伦一区二区色婷婷|