好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Sql存儲過程游標循環的用法及sql如何使用cursor寫一個簡單的循環

Sql存儲過程游標循環的用法及sql如何使用cursor寫一個簡單的循環

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

用游標,和WHILE可以遍歷您的查詢中的每一條記錄并將要求的字段傳給變量進行相應的處理

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

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 …

……您要執行的操作寫在這里

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

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

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

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

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

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

使用游標對記錄集循環進行處理的時候一般操作如以下幾個步驟:

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

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

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

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

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

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

WHILE

設置重復執行 SQL 語句或語句塊的條件。只要指定的條件為真,就重復執行語句。可以使用 BREAK 和 CONTINUE 關鍵字在循環內部控制 WHILE 循環中語句的執行。

語法

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

參數

Boolean_expression

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

復制代碼 代碼如下:

{sql_statement | statement_block}

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

BREAK

導致從最內層的 WHILE 循環中退出。將執行出現在 END 關鍵字后面的任何語句,END 關鍵字為循環結束標記。

CONTINUE

使 WHILE 循環重新開始執行,忽略 CONTINUE 關鍵字后的任何語句。

注釋

如果嵌套了兩個或多個 WHILE 循環,內層的 BREAK 將導致退出到下一個外層循環。首先運行內層循環結束之后的所有語句,然后下一個外層循環重新開始執行。

示例

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

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

while 條件
begin
執行操作
set @i=@i+1
end

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

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

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. 在帶有游標的過程中使用 WHILE

以下的 WHILE 結構是名為 count_all_rows 過程中的一部分。下例中,該 WHILE 結構測試用于游標的函數 @@FETCH_STATUS 的返回值。因為 @@FETCH_STATUS 可能返回 –2、-1 或 0,所以,所有的情況都應進行測試。如果某一行在開始執行此存儲過程以后從游標結果中刪除,將跳過該行。成功提取 (0) 后將執行 BEGIN...END 循環內部的 SELECT 語句。

單變量循環

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

多變量循環

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

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

1.排錯

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

  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

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

2.寫循環

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

  表結構如下:

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

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

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

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

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

create procedure TempFill
  
  declare mycursor cursor for
  select rightid from rights--這兩個是一句,定義游標,然后從rights中取一個rightid給游標
  
  open mycursor
  
  declare @rightid int--定義一個變量
  fetch mycursor into @rightid--把mycursor當前的值給@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 再執行他一下。

您可能感興趣的文章:
  • MySQL游標概念與用法詳解
  • mysql的存儲過程、游標 、事務實例詳解
  • Python操作SQLite數據庫的方法詳解【導入,創建,游標,增刪改查等】
  • MySQL使用游標批量處理進行表操作
  • Mysql存儲過程循環內嵌套使用游標示例代碼
  • MySql游標的使用實例
  • 詳解SQL游標的用法

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

巨人網絡通訊聲明:本文標題《Sql存儲過程游標循環的用法及sql如何使用cursor寫一個簡單的循環》,本文關鍵詞  Sql,存儲,過程,游標,循環,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Sql存儲過程游標循環的用法及sql如何使用cursor寫一個簡單的循環》相關的同類信息!
  • 本頁收集關于Sql存儲過程游標循環的用法及sql如何使用cursor寫一個簡單的循環的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 国产精品久久区m3u8aiqiyi| 国产福利影院在线观看| 男生爆操女生| 天干天干天夜夜爽啪啪免费网站| AV无码久久久久精品网站水牛| 九九激情视频| 天天色天天爽| 该角色涉嫌开挂| 精品亚洲AV无码区最新对白优播 | 被男人操的视频| 动漫美女胸被狂揉扒开吃奶无遮挡| 97色伦影院中文字幕| 通河县| 被啪的最爽的一次自述| 双性荡夫出轨记hnp| 女性无套?免费网站在线明星| 国产桃色视频| 国产永久视频夜色资源网| 精品日韩午夜婷不卡91综合在线| 人人人人澡人人爽人人爽人人学生视频 | 免费高清直播在线观看| 国产精华国产精品| 一边亲一边摸一边桶的动态图| 黄色软| 亚洲欧美午夜精品无码站长工具 | 逛街突然开了遥控器最大视频| 巨龙挺进美艳绝色老师的紧窄小肉| 美国xxx视频| 男的舔女的下面视频| 国产毛多水多女人A片| 久久久久久精品无码色情| 国产一级毛片夜一级毛片| 永久黄网站色视频免费网站| ??禁漫天堂??羞羞漫画在线看| 51成人免费动漫在线| 无码人妻一区二区三区| 国精品人妻无码一区二区三区软件 | 国产精品国内自产拍在线播放| 夹腿综合征| 特极毛片| 98婷婷综合精品一区二区三区|