日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
SQLServer游標(biāo)的正確使用與注意事項

此文章主要向大家講述的是學(xué)習(xí)SQL Server游標(biāo)的正確使用,在這一步中,需要指定SQL Server數(shù)據(jù)庫的游標(biāo)屬性與根據(jù)要求,而產(chǎn)生的結(jié)果集。一共有兩種方法可以指定一個游標(biāo)。以下就是對這兩種形式的描述。

開化網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)于2013年創(chuàng)立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

形式1(ANSI 92)

 
 
 
  1. DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR  
  2. FOR select_statement  
  3. [FOR {READ ONLY | UPDATE ][OF column_list]}] 

形式2

 
 
 
  1. DECLARE cursor_name CURSOR  
  2. [LOCAL | GLOBAL]  
  3. [FORWARD_ONLY | SCROLL]  
  4. [STATIC | KEYSET | DYNAMIC]  
  5. [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]  
  6. FOR select_statement  
  7. [FOR {READ ONLY | UPDATE ][OF column_list]}] 

INSENSITIVE關(guān)鍵字指明要為檢索到的結(jié)果集建立一個臨時拷貝,以后的數(shù)據(jù)從這個臨時拷貝中獲取。如果在后來SQL Server游標(biāo)處理的過程中,原有基表中數(shù)據(jù)發(fā)生了改變,那么它們對于該游標(biāo)而言是不可見的。這種不敏感的游標(biāo)不允許數(shù)據(jù)更改。

SCROLL關(guān)鍵字指明游標(biāo)可以在任意方向上滾動。所有的fetch選項(first、last、next、relative、absolute)都可以在游標(biāo)中使用。如果忽略該選項,則游標(biāo)只能向前滾動(next)。

Select_statement指明SQL語句建立的結(jié)果集。Transact SQL語句COMPUTE、COMPUTE BY、FOR BROWSE和INTO在游標(biāo)聲明的選擇語句中不允許使用。

READ ONLY指明在游標(biāo)結(jié)果集中不允許進行數(shù)據(jù)修改。

UPDATE關(guān)鍵字指明游標(biāo)的結(jié)果集可以修改。

OF column_list指明結(jié)果集中可以進行修改的列。缺省情況下(使用UPDATE關(guān)鍵字),所有的列都可進行修改。

LOCAL關(guān)鍵字指明游標(biāo)是局部的,它只能在它所聲明的過程中使用。

GLOBAL關(guān)鍵字使得游標(biāo)對于整個連接全局可見。全局的游標(biāo)在連接激活的任何時候都是可用的。只有當(dāng)連接結(jié)束時,游標(biāo)才不再可用。

FORWARD_ONLY指明游標(biāo)只能向前滾動。

STATIC的游標(biāo)與INSENSITIVE的游標(biāo)是相同的。

KEYSET指明選取的行的順序。SQL Server將從結(jié)果集中創(chuàng)建一個臨時關(guān)鍵字集。如果對數(shù)據(jù)庫的非關(guān)鍵字列進行了修改,則它們對游標(biāo)是可見的。因為是固定的關(guān)鍵字集合,所以對關(guān)鍵字列進行修改或新插入列是不可見的。

DYNAMIC指明游標(biāo)將反映所有對結(jié)果集的修改。

SCROLL_LOCK是為了保證游標(biāo)操作的成功,而對修改或刪除加鎖。

OPTIMISTIC指明哪些通過SQL Server游標(biāo)進行的修改或者刪除將不會成功。

注意:

如果在SELECT語句中使用了DISTINCT、UNION、GROUP BY語句,且在選擇中包含了聚合表達式,則游標(biāo)自動為INSENSITIVE的游標(biāo)。

如果基表沒有唯一的索引,則游標(biāo)創(chuàng)建成INSENSITIVE的游標(biāo)。

如果SELECT語句包含了ORDER BY,而被ORDER BY的列并非唯一的行標(biāo)識,則DYNAMIC游標(biāo)將轉(zhuǎn)換成KEYSET游標(biāo)。如果KEYSET游標(biāo)不能打開,則將轉(zhuǎn)換成INSENSITIVE游標(biāo)。使用SQL ANSI-92語法定義的游標(biāo)同樣如此,只是沒有INSENSITIVE關(guān)鍵字而已。

ii. 打開游標(biāo)

打開游標(biāo)就是創(chuàng)建結(jié)果集。SQL Server游標(biāo)通過DECLARE語句定義,但其實際的執(zhí)行是通過OPEN語句。語法如下:

OPEN { { [GLOBAL] cursor_name } | cursor_variable_name}

GLOBAL指明一個全局游標(biāo)。

Cursor_name是被打開的游標(biāo)的名稱。

Cursor_variable_name是所引用游標(biāo)的變量名。該變量應(yīng)該為游標(biāo)類型。

在游標(biāo)被打開之后,系統(tǒng)變量@@cursor_rows可以用來檢測結(jié)果集的行數(shù)。@@cursor_rows為負數(shù)時,表示游標(biāo)正在被異步遷移,其絕對值(如果@@cursor_rows為-5,則絕對值為5)為當(dāng)前結(jié)果集的行數(shù)。異步游標(biāo)使用戶在游標(biāo)被完全遷移時仍然能夠訪問游標(biāo)的結(jié)果。

iii. 從游標(biāo)中取值

在從游標(biāo)中取值的過程中,可以在結(jié)果集中的每一行上來回移動和處理。如果游標(biāo)定義成了可滾動的(在聲明時使用SCROLL關(guān)鍵字),則任何時候都可取出結(jié)果集中的任意行。對于非滾動的游標(biāo),只能對當(dāng)前行的下一行實施取操作。結(jié)果集可以取到局部變量中。Fetch命令的語法如下:

 
 
 
  1. FETCH [NEXT | PRIOR| FIRST | LAST | ABSOLUTE {n | @nvar} | RELATIVE {n | @nvar}]  
  2. FROM [GLOBAL] cursor_name} | cursor_variable_name}  
  3. [INTO @variable_name ][,……n]] 

NEXT指明從當(dāng)前行的下一行取值。

PRIOR指明從當(dāng)前行的前一行取值。

FIRST是結(jié)果集的第一行。

LAST是結(jié)果集的最后一行。

ABSOLUTE n表示結(jié)果集中的第n行,該行數(shù)同樣可以通過一個局部變量傳播。行號從0開始,所以n為0時不能得到任何行。#p#

RELATIVE n表示要取出的行在當(dāng)前行的前n行或后n行的位置上。如果該值為正數(shù),則要取出的行在當(dāng)前行前n行的位置上,如果該值為負數(shù),則返回當(dāng)前行的后n行。

INTO @cursor_variable_name表示游標(biāo)列值存儲的地方的變量列表。該列表中的變量數(shù)應(yīng)該與DECLARE語句中選擇語句所使用的變量數(shù)相同。變量的數(shù)據(jù)類型也應(yīng)該與被選擇列的數(shù)據(jù)類型相同。直到下一次使用FETCH語句之前,變量中的值都會一直保持。

每一次FETCH的執(zhí)行都存儲在系統(tǒng)變量@@fetch_status中。如果FETCH成功,則@@fetch_status被設(shè)置成0。@@fetch_status為-1表示已經(jīng)到達了結(jié)果集的一部分(例如,在游標(biāo)被打開之后,基表中的行被刪除)。@@fetch_status可以用來構(gòu)造SQL Server游標(biāo)處理的循環(huán)。

例如:

 
 
 
  1. DECLARE @iname char(20), @fname char(20)  
  2. OPEN author_cur  
  3. FETCH FIRST FROM author_cur INTO @iname, @fname  
  4. WHILE @@fetch_status = 0 
  5. BEGIN  
  6. IF @fname = ‘Albert’  
  7. PRINT “Found Albert Ringer”  
  8. ELSE  
  9. Print “Other Ringer”  
  10. FETCH NEXT FROM author_cur INTO @iname, @fname  
  11. END 

iv. 關(guān)閉游標(biāo)

CLOSE語句用來關(guān)閉游標(biāo)并釋放結(jié)果集。游標(biāo)關(guān)閉之后,不能再執(zhí)行FETCH操作。如果還需要使用FETCH語句,則要重新打開游標(biāo)。語法如下:

 
 
 
  1. CLOSE [GLOBAL] cursor_name | cursor_variable_name 

v. 釋放游標(biāo)

游標(biāo)使用不再需要之后,要釋放游標(biāo)。DEALLOCATE語句釋放數(shù)據(jù)結(jié)構(gòu)和游標(biāo)所加的鎖。語法如下:

 
 
 
  1. DEALLOCATE [GLOBAL] cursor_name | cursor_variable_name 

下面給出SQL Server游標(biāo)的一個完整的例子:

 
 
 
  1. USE master  
  2. GO  
  3. CREATE PROCEDURE sp_BuildIndexes  
  4. AS  
  5. DECLARE @TableName sysname, @msg varchar(100), @cmd varchar(100)  
  6. DECLARE table_cur CURSOR FOR  
  7. SELECT name FROM sysobjects WHERE type=’u’  
  8. OPEN table_cur  
  9. FETCH NEXT FROM table_cur INTO @TableName  
  10. WHILE @@fetch_status = 0 
  11. BEGIN  
  12. IF @@fetch_status = -2  
  13. CONTINUE  
  14. SELECT @msg = “Building indexes for table”+@TableName+”…”  
  15. PRINT @msg  
  16. SELECT @cmd = “DBCC DBREINDEX (‘”+@TableName+”')”  
  17. EXEC (@cmd)  
  18. PRINT “ “  
  19. FETCH NEXT FROM table_cur INTO @TableName  
  20. END  
  21. DEALLOCATE table_cur  
  22. GO 

下面的腳本將為PUBS數(shù)據(jù)庫執(zhí)行sp_BuildIndexes

 
 
 
  1. USE pubs  
  2. GO  
  3. EXEC ap_BuildIndexes 

注意:上面也是創(chuàng)建用戶定義的系統(tǒng)存儲過程的示例。

使用臨時表

臨時表是在TempDB中創(chuàng)建的表。臨時表的名稱都以“#”開頭。臨時表的范圍為創(chuàng)建臨時表的連接。因為,臨時表不能在兩個連接之間共享,一旦連接關(guān)閉,臨時表就會被丟棄。如果臨時表被創(chuàng)建于存儲過程之中,則臨時表的范圍在存儲過程之中,或者被該存儲過程調(diào)用的任何存儲過程之中。

如果需要在連接之間共享臨時表,則需要使用全局的臨時表。全局的臨時表以“##”符號開頭,它將一直存在于數(shù)據(jù)庫中,直到SQL Server重新啟動。一旦這類臨時表創(chuàng)建之后,所有的用戶都可以訪問到。在臨時表上不能明確地指明權(quán)限。

臨時表提供了存儲中間結(jié)果的能力。有時候,臨時表還能通過將一個復(fù)雜的查詢分解成兩個查詢而獲得性能的改善。這可以通過首先將第一個查詢的結(jié)果存在臨時表中,然后在第二個查詢中使用臨時表來實現(xiàn)。當(dāng)一個大表中的某個子集在一個在座過程中使用多次時,建議使用臨時表。

在這種情況下,在臨時表中保持?jǐn)?shù)據(jù)的子集,以在隨后的連接中使用,這樣能大大改善性能。還可以在臨時表中創(chuàng)建索引。以上的相關(guān)內(nèi)容就是對學(xué)習(xí)SQL Server游標(biāo)的使用的介紹,望你能有所收獲。


分享名稱:SQLServer游標(biāo)的正確使用與注意事項
網(wǎng)頁鏈接:http://www.5511xx.com/article/dhdjdgd.html