正常面向集合的思維方式是:
而對(duì)于游標(biāo)來(lái)說(shuō):
這也是為什么游標(biāo)是邪惡的,它會(huì)使開(kāi)發(fā)人員變懶,懶得去想用面向集合的查詢(xún)方式實(shí)現(xiàn)某些功能.
同樣的,在性能上,游標(biāo)會(huì)吃更多的內(nèi)存,減少可用的并發(fā),占用寬帶,鎖定資源,當(dāng)然還有更多的代碼量……
從游標(biāo)對(duì)數(shù)據(jù)庫(kù)的讀取方式來(lái)說(shuō),不難看出游標(biāo)為什么占用更多的資源,打個(gè)比方:
當(dāng)你從ATM取錢(qián)的時(shí)候,是一次取1000效率更高呢,還是取10次100?
既然游標(biāo)這么“邪惡”,為什么還要學(xué)習(xí)游標(biāo)我個(gè)人認(rèn)為存在既是合理.歸結(jié)來(lái)說(shuō),學(xué)習(xí)游標(biāo)原因我歸納為以下2點(diǎn)
1.現(xiàn)存系統(tǒng)有一些游標(biāo),我們查詢(xún)必須通過(guò)游標(biāo)來(lái)實(shí)現(xiàn)
2.作為一個(gè)備用方式,當(dāng)我們窮盡了while循環(huán),子查詢(xún),臨時(shí)表,表變量,自建函數(shù)或其他方式扔來(lái)無(wú)法實(shí)現(xiàn)某些查詢(xún)的時(shí)候,使用游標(biāo)實(shí)現(xiàn).
T-SQL中游標(biāo)的生命周期以及實(shí)現(xiàn)在T-SQL中,游標(biāo)的生命周期由5部分組成
1.定義一個(gè)游標(biāo)在T-SQL中,定義一個(gè)游標(biāo)可以是非常簡(jiǎn)單,也可以相對(duì)復(fù)雜,取決于游標(biāo)的參數(shù).而游標(biāo)的參數(shù)設(shè)置取決于你對(duì)游標(biāo)原理的了解程度.
游標(biāo)其實(shí)可以理解成一個(gè)定義在特定數(shù)據(jù)集上的指針,我們可以控制這個(gè)指針遍歷數(shù)據(jù)集,或者僅僅是指向特定的行,所以游標(biāo)是定義在以Select開(kāi)始的數(shù)據(jù)集上的:
T-SQL中的游標(biāo)定義在MSDN中如下:
復(fù)制代碼代碼如下:
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
[;]
看起來(lái)很讓人頭痛是吧.下面仔細(xì)講一下如何定義游標(biāo):
游標(biāo)分為游標(biāo)類(lèi)型和游標(biāo)變量,對(duì)于游標(biāo)變量來(lái)說(shuō),遵循T-SQL變量的定義方法(啥,不知道T-SQL變量定義的規(guī)則?參考我前面的博文).游標(biāo)變量支持兩種方式賦值,定義時(shí)賦值和先定義后賦值,定義游標(biāo)變量像定義其他局部變量一樣,在游標(biāo)前加”@”,注意,如果定義全局的游標(biāo),只支持定義時(shí)直接賦值,并且不能在游標(biāo)名稱(chēng)前面加“@”,兩種定義方式如下:
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注