日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

解讀SQL Server游標(biāo)使用實(shí)例_Mssql數(shù)據(jù)庫教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:在SQL Server中通過.NET遠(yuǎn)程的執(zhí)行SQL文件
在項(xiàng)目開發(fā)過程中,操作數(shù)據(jù)庫的過程中經(jīng)常會遇到對表結(jié)構(gòu)、存儲過程等進(jìn)行修改,這時(shí)一般的操作都是通過直接在SQL Server中的企業(yè)管理器進(jìn)行操作,或者查詢分析器里來執(zhí)行相關(guān)的語句

問題

在我的T-SQL代碼中,我經(jīng)常使用基于集合的運(yùn)算。我被告知這些運(yùn)算的類型正是SQL Server設(shè)計(jì)所處理的,并且它應(yīng)該比串行處理要快些。我知道游標(biāo)的存在但是我不確定如何使用它們。您能提供一些游標(biāo)的例子嗎?您能否給一些關(guān)于何時(shí)使用游標(biāo)的指導(dǎo)?我假定微軟由于某種原因創(chuàng)建了它們,所以它們必須有以高效方式使用的地方。

專家解答

在某些圈子中,游標(biāo)從未被使用過,在其他圈子中,它們是一種最后手段,而在其它組中它們經(jīng)常被使用。在每個(gè)組中,它們由于不同原因而使用游標(biāo)。無論你對游標(biāo)使用原因有什么樣的立場,可能它們在一個(gè)特定環(huán)境中具有用武之地而在另一個(gè)環(huán)境中卻沒有用處。所以它歸結(jié)于你對這個(gè)技術(shù)的理解,然后歸結(jié)于隨及而來對問題的理解導(dǎo)致做出一個(gè)決定,這個(gè)決定就是基于游標(biāo)的過程是否恰當(dāng)。讓我們先來做以下幾件事情:

l 看一個(gè)游標(biāo)實(shí)例

l 分解游標(biāo)的組成部分

l 分析使用游標(biāo)的優(yōu)缺點(diǎn)

游標(biāo)實(shí)例

以下是一個(gè)游標(biāo)實(shí)例,講述了備份在串行狀態(tài)下如何執(zhí)行。

以下為引用的內(nèi)容:
  DECLARE@nameVARCHAR(50)--databasename
  DECLARE@pathVARCHAR(256)--pathforbackupfiles
  DECLARE@fileNameVARCHAR(256)--filenameforbackup
  DECLARE@fileDateVARCHAR(20)--usedforfilename
  SET@path='C:Backup'
  SELECT@fileDate=CONVERT(VARCHAR(20),GETDATE(),112)
  DECLAREdb_cursorCURSORFOR
  SELECTname
  FROMmaster.dbo.sysdatabases
  WHEREnameNOTIN('master','model','msdb','tempdb')
  OPENdb_cursor
  FETCHNEXTFROMdb_cursorINTO@name
  WHILE@@FETCH_STATUS=0
  BEGIN
  SET@fileName=@path @name '_' @fileDate '.BAK'
  BACKUPDATABASE@nameTODISK=@fileName
  FETCHNEXTFROMdb_cursorINTO@name
  END
  CLOSEdb_cursor
  DEALLOCATEdb_cursor

 

游標(biāo)組成

根據(jù)以上的實(shí)例,游標(biāo)包括這些組成部分:

l DECLARE語句 – 聲明在代碼塊中使用的變量

l SETSELECT語句 – 把這些變量初始化為某個(gè)具體的值

l DECLARE CURSOR語句 – 在游標(biāo)中填充將要求取的值。

注意 – DECLARE CURSOR FOR語句和SELECT語句中具有相同數(shù)量的變量。變量數(shù)目可能是一個(gè)或者很多個(gè)并且有相關(guān)聯(lián)的列。

l OPEN語句 – 打開游標(biāo),開始進(jìn)行數(shù)據(jù)處理

l FETCH NEXT語句 – 從游標(biāo)中把具體的值分配給變量

注意: 這個(gè)邏輯用于WHILE語句之前的初始對象,接著作為WHILE語句的一部分在這個(gè)過程的每個(gè)循環(huán)中再次執(zhí)行。

l WHILE語句 – 作為開始的條件,繼續(xù)處理數(shù)據(jù)

l BEGIN...END語句 – 代碼塊的開始和結(jié)束

注意:按照不同的數(shù)據(jù)處理,可以使用不同的BEGIN...END語句

l 數(shù)據(jù)處理 – 在這個(gè)例子中,邏輯是用來把一個(gè)數(shù)據(jù)庫備份到具體的路徑和文件名,但是這可以只與任何DML或者管理邏輯有關(guān)。

l CLOSE語句 – 釋放當(dāng)前的數(shù)據(jù)和相關(guān)聯(lián)的鎖,但是允許游標(biāo)重新打開。

l DEALLOCATE語句 – 破壞游標(biāo)

游標(biāo)分析

以下分析旨在更深入了解基于游標(biāo)的邏輯是否有利:

l 聯(lián)機(jī)事務(wù)處理(OLTP)- 在大多數(shù)的聯(lián)機(jī)事務(wù)處理環(huán)境中,基于集合的邏輯適合簡短的事務(wù)。我們的團(tuán)隊(duì)已經(jīng)遇到第三方應(yīng)用,這個(gè)應(yīng)用在它所有的過程中使用游標(biāo),這將導(dǎo)致一些問題,但這是一個(gè)很罕見的現(xiàn)象。通常情況下,基于集合的邏輯足夠靈活而且游標(biāo)很少被用到。

l 報(bào)表 – 基于報(bào)表的設(shè)計(jì)和潛在設(shè)計(jì),通常情況下游標(biāo)是不需要的。盡管如此,我們的團(tuán)隊(duì)遇到報(bào)表要求,而參照完整性沒有存在于潛在的數(shù)據(jù)庫中,同時(shí)需要使用游標(biāo)來正確計(jì)算報(bào)表值。當(dāng)需要下游過程的合計(jì)數(shù)據(jù)時(shí),我們面臨相同的狀況,一個(gè)基于游標(biāo)的方法可以用一種可接受的方式快速形成和執(zhí)行來滿足要求。

 

l 串行化過程 – 如果你需要以串行化方式完成一個(gè)過程,那么游標(biāo)是一個(gè)可行的選項(xiàng)。

l 管理員任務(wù) – 很多管理員任務(wù)需要在串行狀態(tài)下執(zhí)行,這與基于游標(biāo)的邏輯很相符,但是基于其他系統(tǒng)的對象存在來滿足這種需要。在某些情況下,游標(biāo)用來完成這一進(jìn)程。

l 大型數(shù)據(jù)集 – 在大型數(shù)據(jù)集的情況下,你可能會遇到以下任何一種情況:

基于游標(biāo)的邏輯可能沒有足夠大的規(guī)模滿足需求。

在服務(wù)器上具有大型數(shù)據(jù)集的運(yùn)算而內(nèi)存又很小,數(shù)據(jù)可能會被分頁或獨(dú)占SQL Server,這將是很費(fèi)時(shí)間的,可能會導(dǎo)致爭奪和內(nèi)存的問題。

有些固有的工具把數(shù)據(jù)存儲到一個(gè)隱藏的文件中,所以在內(nèi)存中處理數(shù)據(jù)可能會也可能不會是實(shí)際的情況。

如果數(shù)據(jù)能夠在一個(gè)中間數(shù)據(jù)庫中處理,那么對生產(chǎn)環(huán)境的影響只有在最后數(shù)據(jù)被處理時(shí),所以服務(wù)器上所有的資源可用于ETL過程,然后引入最后的數(shù)據(jù)。

SSIS支持批處理數(shù)據(jù),這將解決把大量數(shù)據(jù)分解成更多可管理的大小和比用按行方法執(zhí)行效果更好的總體需求。

根據(jù)游標(biāo)或者SSIS邏輯如何編碼,它可能基于檢查點(diǎn)或者在游標(biāo)的每一行做標(biāo)記來在失敗時(shí)重新啟動。盡管如此,用可能并非事實(shí)的基于集合的方法直到獲得數(shù)據(jù)的整個(gè)集合是完整的。同樣地,解決行的問題會更加困難。

游標(biāo)的替代

下面列出了可以替代能夠滿足相同需求的基于游標(biāo)的邏輯:

l 基于集合的邏輯

l SSIS或者數(shù)據(jù)轉(zhuǎn)換服務(wù)

l WHILE循環(huán)

l COALSCE

l sp_MSforeachdb

l sp_MSforeachtable

l CASE表達(dá)

l 用GO命令重復(fù)一批數(shù)據(jù)

分享:解析Microsoft SQL Server數(shù)據(jù)庫日志截?cái)?/a>
參考 壓縮日志及數(shù)據(jù)庫文件大小 /*--注意事項(xiàng) 請按步驟進(jìn)行,未進(jìn)行前面的步驟,請不要做后面的步驟,否則可能損壞你的數(shù)據(jù)庫. 一般情況下不建議做第4,6兩步。 第4步不安全,

相關(guān)Mssql數(shù)據(jù)庫教程