第5章 Transact-SQL_第1頁
第5章 Transact-SQL_第2頁
第5章 Transact-SQL_第3頁
第5章 Transact-SQL_第4頁
第5章 Transact-SQL_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第 5 章 TransactSQL 5.1 【案例 15】TransactSQL 基礎(chǔ)相關(guān)知識1TransactSQL 特點(diǎn)SQL 是“結(jié)構(gòu)化數(shù)據(jù)查詢語言(Structure Query Language)”的英文縮寫,是由 ANSI(American NationalStandards Institute)和 ISO(International Standards Organization)定義的標(biāo)準(zhǔn),許多數(shù)據(jù)庫廠商把 SQL作為自己數(shù)據(jù)庫的基礎(chǔ)操作語言,并且對此標(biāo)準(zhǔn)進(jìn)行了不同程度的擴(kuò)展。20 世紀(jì) 80 年代初,美國國家標(biāo)準(zhǔn)委員會(ANSI)開始制定 SQL 標(biāo)準(zhǔn),并于 1986 年完成,

2、并將這一標(biāo)準(zhǔn)稱為 ANSI SQL86,后又相繼對其進(jìn)行了擴(kuò)充和完善,推出了 ANSI SQL86 和 ANSI SQL92,現(xiàn)在 SQL 已作為關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)檢索語言。TransactSQL 是在包含了大多數(shù) ANSI SQL86 和 ANSI SQL92 功能的基礎(chǔ)上,對標(biāo)準(zhǔn)的 SQL 做了一些擴(kuò)展,對語法也做了一些精簡,增強(qiáng)了可編程性和靈活性。TransactSQL 已成為 SQL Server 2005 的核心,通過它幾乎可以完成 SQL Server 數(shù)據(jù)庫中的所有操作。SQL Server 2005 中的 TransactSQL 具有如下特點(diǎn)。 集數(shù)據(jù)定義語言 DDL、數(shù)據(jù)操縱語

3、言 DML、數(shù)據(jù)控制語言 DCL 為一體。 使用交互使用方式和嵌入到高級語言中方式。 語句的操作過程由系統(tǒng)自動完成,無須提供過程,是非過程式語言。 簡單,容易理解和掌握。2常量常量是指在程序運(yùn)行過程中其值始終固定不變的量,也稱為文字值或標(biāo)量值,在 SQL Server 2005 的TransactSQL 中,常量在使用之前必須定義。定義常量的格式取決于它所表示的值的數(shù)據(jù)類型。SQL Server 2005中可用的常量類型及常量的表示說明如表 511 所示。3變量變量是在程序運(yùn)行過程中其值可以變化的量,利用變量可以存儲程序執(zhí)行過程中涉及的數(shù)據(jù),如表名、用戶密碼、用戶輸入的字符串以及數(shù)值數(shù)據(jù)等。變

4、量由變量名和變量值構(gòu)成,其類型與常量一樣,要注意變量名不能與命令和函數(shù)相同。在 Microsoft SQL Server 2005 系統(tǒng)中有兩種類型的變量。(1)系統(tǒng)全局變量系統(tǒng)全局變量以兩個符號開頭,是 SQL Server 系統(tǒng)提供并賦值的變量。用戶不能建立全局變量,也不能l用 SET 語句來修改全局變量的值。通常將全局變量的值賦給局部變量,以便保存和處理。常用 SQL Server 2005系統(tǒng)的全局變量及其含義如表 512 所示。(2)局部變量局部變量是作用域局限在一定范圍(一個批處理)內(nèi)的 T_SQL 對象。通常情況下,局部變量在一個批處理(也可以是存儲過程或觸發(fā)器)中被聲明,用來保

5、存臨時信息,作用域是其被聲明時所在的批處理,在該批處理內(nèi)可以設(shè)置該變量的值,引用該變量被賦予的值,當(dāng)這個批處理結(jié)束后,這個局部變量的生命周期也就隨之結(jié)束。聲明局部變量,使用 DECLARE 語句,其語法如下。DECLARElocal_variableAS data_type|cursor_variable_name CURSOR|table_variable_namen主要參數(shù)說明如下:local_variable 是變量的名稱,它必須以開頭;data_type 是任何由系統(tǒng)提供的或用戶定義的數(shù)據(jù)類型,變量不能是 text、ntext 或 image 數(shù)據(jù)類型;table_type_defin

6、ition 用于定義表數(shù)據(jù)類型。表聲明包括列定義、名稱、數(shù)據(jù)類型和約束;允許的約束類型只包括 PRIMARY KEY、UNIQUE KEY、NULL 和 CHECK;ln 表示可以指定多個變量并對變量賦值的占位符。聲明表變量時,表變量必須是 DECLARE 語句中聲明的變量。局部變量賦值,使用 SET 或 SELECT 語句,賦值的語法格式如下:SET local_variable=expressionSELECT local_variable=expressionn其中,local_variable 是除 cursor、text、ntext、image 外的任何類型變量名:expressio

7、n 是任何有效的 SQLServer 表達(dá)式?!景咐?151】 將局部變量 a 聲明為 char 類型,長度為 100,并為其賦值為 http:/,使用語句如下:DECLAREa char(100)SET a=http:/PRINT a執(zhí)行上述語句,則局部變量 a 被賦值為http:/,效果如圖 513 所示。如果要存儲的數(shù)據(jù)比 允 許 的 字 符 數(shù) 多 , 數(shù) 據(jù) 就會 被 截斷 。 例 如 , 局 部 變 量 a 被 定 義 為 char 類 型 , 長 度 為 3, 為 其 賦 值為,則 SQL Server 2005 將該字符串截斷為www。4算術(shù)運(yùn)算符運(yùn)算符實(shí)現(xiàn)運(yùn)算功能,它將數(shù)據(jù)按

8、照運(yùn)算符的功能定義實(shí)施轉(zhuǎn)換,產(chǎn)生新的結(jié)果。SQL Server 2005 中支持的運(yùn)算符分為:算術(shù)運(yùn)算符、賦值運(yùn)算符、位運(yùn)算符、比較運(yùn)算符、邏輯運(yùn)算符、字符串運(yùn)算符和單目運(yùn)算符。算術(shù)運(yùn)算符用來在兩個表達(dá)式上執(zhí)行數(shù)學(xué)運(yùn)算,這兩個表達(dá)式可以是任意兩個數(shù)字?jǐn)?shù)據(jù)類型的表達(dá)式,一般得到的結(jié)果是數(shù)值型。SQL Server 2005 中的主要算術(shù)運(yùn)算符如表 513 所示。5賦值運(yùn)算符在 TSQL 中,賦值運(yùn)算符只有等號“=”,主要的用途是給變量賦值,如下語句所示,語句執(zhí)行后的效果如圖514 所示。DECLARE a varchar(20)SET a =http:/圖 513聲明、賦值、輸出變量效果圖 51

9、4賦值運(yùn)算符6位運(yùn)算符位運(yùn)算符在兩個表達(dá)式之間執(zhí)行位操作,這兩個表達(dá)式可以是任意兩個整數(shù)數(shù)據(jù)類型的表達(dá)式。位運(yùn)算符的符號及其含義如表 514 所示。、 、 。7比較運(yùn)算符比較運(yùn)算符用來測試兩個表達(dá)式是否相同。除了 TEXT、NTEXT 或 IMAGE 數(shù)據(jù)類型的表達(dá)式外,比較運(yùn)算符可以用于所有的表達(dá)式。運(yùn)算符包括:=(等于)、(大于)、(小于)、 (大于或等于)、(小于或等于)、 (不等于)!=(不等于)、?。ú恍∮冢。ú淮笥冢?邏輯運(yùn)算符邏輯運(yùn)算符用于對表達(dá)式或操作數(shù)進(jìn)行比較或測試,其運(yùn)算結(jié)果返回的是布爾類型的值,即 TRUE 或 FALSE。TRUE 表示條件成立,F(xiàn)ALSE 表示條件不

10、成立。在 TransactSQL 中可使用的邏輯運(yùn)算符有:AND、OR、NOT。9字符串運(yùn)算符連接運(yùn)算符(+)用于將兩個字符串合并為一個字符串,通常也稱為字符串運(yùn)算符。在 SQL Server 中,對字符串的其他操作通過字符串函數(shù)進(jìn)行。字符串運(yùn)算符的操作數(shù)類型有:char、varchar 和 text。例如:用字符串連接運(yùn)算符將兩個字符串連接起來:SQL+Server 2000,此表達(dá)式的運(yùn)算結(jié)果為:SQL Server 2000。10單目運(yùn)算符一元運(yùn)算符只對一個表達(dá)式執(zhí)行操作,這個表達(dá)式可以是數(shù)字?jǐn)?shù)據(jù)類型中的任何一種,單目運(yùn)算符及含義如表 515 所示。11運(yùn)算符的優(yōu)先級用運(yùn)算符把操作數(shù)連接

11、起來所組成的運(yùn)算式,在 TSQL 中稱為“表達(dá)式”,當(dāng)表達(dá)式中出現(xiàn)多個運(yùn)算符,在計算表達(dá)式值時,就會碰到先算哪個,后算哪個的問題,這稱為運(yùn)算符的優(yōu)先級。SQL Server 2005 中運(yùn)算符的優(yōu)先級如表 516 所示,在一個表達(dá)式中按先高后低的順序進(jìn)行運(yùn)算(即數(shù)字越小其優(yōu)先級越高)。運(yùn)算規(guī)則如下:排在前面的運(yùn)算符的優(yōu)先級高于其后的運(yùn)算符;在一個表達(dá)式中,先計算優(yōu)先級較高的運(yùn)算,后計算優(yōu)先級較低的運(yùn)算;相同優(yōu)先級的運(yùn)算按自左向右的順序依次進(jìn)行;括號可以改變運(yùn)算符的運(yùn)算順序,先計算括號內(nèi)表達(dá)式的值。12表達(dá)式表達(dá)式是由變量、常量、運(yùn)算符、函數(shù)等組成的,它可以在查詢語句中的任何位置使用。根據(jù)表達(dá)式

12、包含的內(nèi)容,可以分為簡單表達(dá)式和復(fù)雜表達(dá)式兩種類型。 簡單表達(dá)式:是指由變量、常量、運(yùn)算符、函數(shù)等組成的表達(dá)式。結(jié)構(gòu)比較單一,通常用來描述一個簡單的條件。 復(fù)雜表達(dá)式:是指由兩個或多個簡單表達(dá)式通過運(yùn)算符連接起來的表達(dá)式。在復(fù)雜表達(dá)式中,如果兩個或多個表達(dá)式有不同的數(shù)據(jù)類型,那么優(yōu)先級低的數(shù)據(jù)類型可以隱式地轉(zhuǎn)換為優(yōu)先級高的數(shù)據(jù)類型。5.2 【案例 16】TransactSQL 函數(shù)相關(guān)知識1數(shù)學(xué)函數(shù)SQL Server 2005 提供的數(shù)學(xué)函數(shù)能對數(shù)據(jù)類型為整數(shù) integer、浮點(diǎn)型 float、實(shí)型 real、貨幣型 money和 smallmoney 的列進(jìn)行運(yùn)算并返回結(jié)果,如果使用出錯

13、,則顯示警告信息。一些常用的數(shù)學(xué)函數(shù)的名稱和含義如表 521 所示。除 RAND()函數(shù)外,所有數(shù)學(xué)函數(shù)都是確定性函數(shù),即在每次使用特定的輸入值及調(diào)用這些函數(shù)時,它們都將返回相同的結(jié)果。只有 RAND()函數(shù),當(dāng)指定種子(種子用于指定 RAND 取值)參數(shù)時 RAND()才是確定性函數(shù)。2字符串函數(shù)字符串函數(shù)也是經(jīng)常使用的一類函數(shù),SQL Server 2005 為了方便用戶進(jìn)行字符型數(shù)據(jù)的各種操作和運(yùn)算,提供了功能全面的字符串函數(shù)。常見的字符串函數(shù)有:字符轉(zhuǎn)換函數(shù)、去空格函數(shù)、取子串函數(shù)、字符串比較函數(shù)、字符串操作函數(shù),具體功能如表 522 所示。3日期和時間函數(shù)在實(shí)際運(yùn)用中,常常會涉及很多

14、日期和時間類型轉(zhuǎn)換的問題。為了幫助用戶正確地處理這些類型的轉(zhuǎn)換和運(yùn)算問題,在 Microsoft SQL Server 2005 系統(tǒng)中提供了 9 個日期和時間函數(shù)。這些函數(shù)能對 datepart 常量進(jìn)行處理,表 523 中列出了日期函數(shù)中 datepart 常量的含義及取值。SQL Server 2005 提供了 9 個日期和時間函數(shù),如表 524 所示。4數(shù)據(jù)類型轉(zhuǎn)換函數(shù)默認(rèn)情況下,SQL Server 2005 會給一些表達(dá)式進(jìn)行自動轉(zhuǎn)換。例如,比較 char 和 datetime 表達(dá)式、smallint和 int 表達(dá)式或不同長度的 char 表達(dá)式,SQL Server 2005

15、 自動對這些表達(dá)式進(jìn)行轉(zhuǎn)換,這種轉(zhuǎn)換稱為隱式轉(zhuǎn)換。如果 SQL Server 2005 沒有自動執(zhí)行數(shù)據(jù)類型的轉(zhuǎn)換,則需要使用 CAST 和 CONVERT 轉(zhuǎn)換函數(shù)將一種數(shù)據(jù)類型的表達(dá)式轉(zhuǎn)換為另一種數(shù)據(jù)類型的表達(dá)式,這種轉(zhuǎn)換稱為顯式轉(zhuǎn)換。CAST 函數(shù)和 CONVERT 函數(shù)可用于獲取各種特殊數(shù)據(jù)格式,并可用于選擇列表、WHERE 子句以及允許使用表達(dá)式的任何位置中。具體格式和功能如表 525 所示。5聚合函數(shù)在 SQL Server 2005 提供的常用的聚合函數(shù)可以返回“整個”、“數(shù)個數(shù)據(jù)行”或者“單一數(shù)據(jù)行”的總計信息,通常聚合函數(shù)都是配合 SELECT 語句查詢行的統(tǒng)計信息。常用的聚

16、合函數(shù)以及參數(shù)說明如表 526 所示,通常這些聚合函數(shù)與 SELECT 語句的 GROUP BY 子句一起使用,所用聚合函數(shù)均為確定函數(shù)。6系統(tǒng)函數(shù)在 SQL Server 2005 中,提供了可以顯示“SQL Server 服務(wù)器”、“數(shù)據(jù)庫”以及“與賬號有關(guān)”的系統(tǒng)函數(shù)。系統(tǒng)函數(shù)可以在表達(dá)式中使用,常用的系統(tǒng)函數(shù)的格式如表 527 所示。5.3 【案例 17】TransactSQL 編程相關(guān)知識1注釋語句在程序中適當(dāng)添加注釋來說明語句的含義可以增強(qiáng)程序的可讀性。注釋是程序中不被執(zhí)行的正文,不參與查詢的編譯,不影響執(zhí)行結(jié)果;同時可以把程序中暫時不用的語句注釋掉,暫時不被執(zhí)行,等需要這些語句時

17、,再將它們恢復(fù)。SQL Server 2005 支持兩種形式的程序注釋語句:一種使用 ANSI 標(biāo)準(zhǔn)的兩個連字符構(gòu)成的注釋符,用于單行注釋;一種使用與 C 語言相同的程序注釋符號,即/*/。/*用于注釋文字的開頭,*/用于注釋文字的結(jié)尾。可在程序中標(biāo)識多行文字為注釋。2塊語句 BEGIN.ENDBEGINEND 可以定義 TransactSQL 語句塊,將多條 SQL 語句封裝起來構(gòu)成一個語句塊,在處理時,整個語句塊被視為一條語句。BEGIN.END 最常見的用法是和 WHILE 或 IFELSE 組合使用。在 BEGIN.END 中允許語句嵌套,嵌套另外的 BEGIN.END 來定義另一程序

18、塊。具體語法格式如下:BEGINEND3判斷語句 IFELSE在許多情況下,語句是否執(zhí)行以及執(zhí)行的順序都依賴于程序運(yùn)行的中間結(jié)果。因此必須根據(jù)某個變量或表達(dá)式的值判斷,決定執(zhí)行哪些語句或跳過哪些語句不執(zhí)行。利用 IFELSE 語句可以判斷,使語句按照某個條件執(zhí)行。根據(jù)條件的“真”或“假”,選擇執(zhí)行某個語句或語句塊。如果條件為真,則執(zhí)行條件表達(dá)式后面的 TransactSQL語句;如果條件為假,使用 ELSE 關(guān)鍵字指定要執(zhí)行的 TransactSQL 語句。具體語法格式如下:IF 布爾表達(dá)式TransactSQL 語句語句塊ELSETransactSQL 語句語句塊4檢測語句 IF EXIST

19、SIFWHENIF EXISTS 語句用于檢測數(shù)據(jù)是否存在,而不考慮與之匹配的總共行數(shù)。對于是否存在某個數(shù)據(jù)的檢測而言,使用 IF EXISTS 要比使用 COUNT(*)0 好,效率會更高。具體語法格式如下:NOT EXISTS (SELECT 子查詢)ELSE5多分支語句 CASE多分支選擇結(jié)構(gòu) CASE,可以用 n 個條件來控制 n+1 個操作,CASE 關(guān)鍵字可根據(jù)表達(dá)式的真假來確定是否返回某個值,進(jìn)行多個分支的選擇。CASE 具有兩種格式:簡單格式,將某個表達(dá)式與一種簡單表達(dá)式進(jìn)行比較以確定結(jié)果;搜索格式,計算一種布爾表達(dá)式以確定結(jié)果。 使用 CASE 語句取代嵌套的 IF 語句的格

20、式。CASE THEN result_算術(shù)表達(dá)式WHENWHENWHENTHEN result_算術(shù)表達(dá)式ELSEEND上述語句中的各參數(shù)說明如下:input_表達(dá)式:使用簡單 CASE 格式時所計算的表達(dá)式,可以是任何有效的表達(dá)式。when_表達(dá)式:用來和 input_表達(dá)式做比較的表達(dá)式,input_表達(dá)式和每個 when_表達(dá)式的數(shù)據(jù)類型必須相同,或者是隱式轉(zhuǎn)換。result_表達(dá)式:當(dāng) input_表達(dá)式=when_表達(dá)式的取值為 TRUE 時,需要返回的表達(dá)式。else_result_表達(dá)式:當(dāng) input_表達(dá)式=when_表達(dá)式的取值為 FALSE 時,需要返回的表達(dá)式。 使用

21、CASE 語句嵌套到任何 SQL 命令的格式如下所示。CASETHEN THEN lELSE END6循環(huán)語句 WHILEWHILE 循環(huán)結(jié)構(gòu),可根據(jù)條件判斷選擇重復(fù)執(zhí)行一條語句或一個語句塊。當(dāng)條件為真時,重復(fù)執(zhí)行循環(huán)語句,當(dāng)條件不滿足時,可在循環(huán)體內(nèi)設(shè)置 BREAK 和 CONTINUE 關(guān)鍵字來控制循環(huán)語句。具體語句格式如下。WHILE TransactSQL 語句TransactSQL 語句塊BREAKTransactSQL 語句TransactSQL 語句塊CONTINUETransactSQL 語句TransactSQL 語句塊語句說明:當(dāng) WHILE 語句中的條件表達(dá)式成立(布爾表

22、達(dá)式的值為“真”)時,重復(fù)執(zhí)行命令行或語句塊,直到條件表達(dá)式的值為邏輯“假”,結(jié)束執(zhí)行循環(huán)體。llCONTINUE 語句可以讓程序跳過 CONTINUE 語句之后的命令行或語句塊,忽略 CONTINUE 關(guān)鍵字后的任何語句,重新執(zhí)行 WHILE 循環(huán)。BREAK 語句則導(dǎo)致從最內(nèi)層的 WHILE 循環(huán)中退出,結(jié)束 WHILE 語句的執(zhí)行。BREAK,將執(zhí)行出現(xiàn)在 END 關(guān)鍵字后面的任何語句塊,END 關(guān)鍵字為循環(huán)結(jié)束的標(biāo)記。7無條件退出語句 RETURNRETURN 語句可使程序從批處理、存儲過程或觸發(fā)器中無條件退出,存儲過程或批處理中 RETURN 語句后面的所有語句都不再執(zhí)行。當(dāng)在存儲過

23、程中使用該語句時,可以使用該語句指定返回給調(diào)用應(yīng)用程序、批處理或過程的整數(shù)值。如果 RETURN 語句未指定值,則存儲過程的返回值是 0。具體語法格式如下所示。RETURNinteger_expression一般情況下,RETURN 語句后不需要任何表達(dá)式,但如果在應(yīng)用程序或存儲過程中調(diào)用了一個存儲過程,通常 在 被 調(diào) 用 的 存 儲 過 程 中 使 用 RETURN 語 句 返 回 一 個 整 數(shù) 值 , 以 便 向 父 進(jìn) 程 報 告 本 進(jìn) 程 的 執(zhí) 行 狀 態(tài) 。integer_expression 參數(shù)返回一個整數(shù)值。存儲過程可向執(zhí)行調(diào)用的過程或應(yīng)用程序返回一個整數(shù)值。8打印語句

24、 PRINTPRINT 語句用于把消息傳遞到客戶應(yīng)用程序的消息處理程序,通常在屏幕上顯示。其傳遞的消息是小于 256個字符的文本;只能傳輸文本型的字符串,或者是單個的字符型變量;PRINT 語句也可以傳遞全局變量,但只能lll是字符類型的全局變量 version。具體語法格式如下:PRINT 任何 ASCII 文本| 局部變量名 | 全局變量 | 字符串表達(dá)式提示:PRINT 語句向客戶端返回一個用戶自定義的信息,即顯示一個字符串(其最長為 255 個字符)、局部變量或全局變量。如果變量的值不是字符串,必須先用數(shù)據(jù)類型轉(zhuǎn)換函數(shù) CONVERT 將其轉(zhuǎn)換為字符串。其中字符串表達(dá)式是可返回一個字符

25、串的表達(dá)式。表達(dá)式的長度可以超過 8000 個字符,但超過 8000 的字符將不會顯示。在 PRINT 語句中不能執(zhí)行任何級聯(lián)或替代操作。但是,用戶可以使用 SELECT 語句來構(gòu)造變量中的字符串,然后將此變量傳遞給 PRINT 語句。9錯誤處理語句 TRYCATCHTSQL 語句組可以包含在 TRY 塊中。如果 TRY 塊內(nèi)部發(fā)生錯誤,則會將控制傳遞給 CATCH 塊中包含的另一個語句組。TRYCATCH 構(gòu)造捕捉所有嚴(yán)重級別大于 10 但不終止數(shù)據(jù)庫連接的錯誤。其語句格式如下所示。BEGIN TRYTransactSQL 語句TransactSQL 語句塊END TRYBEGIN CATC

26、HTransactSQL 語句TransactSQL 語句塊END CATCH5.4 【案例 18】數(shù)據(jù)庫的并發(fā)控制相關(guān)知識1事務(wù)的類型實(shí)際應(yīng)用中,不同類型的用戶經(jīng)常在同一時刻、以不同的目的訪問數(shù)據(jù)庫。而且用戶越多,他們同時查詢和修改數(shù)據(jù)時產(chǎn)生問題的可能性也就越大。即使只有兩個用戶同時訪問數(shù)據(jù)庫也有可能產(chǎn)生問題,這主要取決于操作性質(zhì)。例如,在銀行的轉(zhuǎn)賬業(yè)務(wù)中,從賬號 A 中提取一萬元,存入賬號 B 中,這兩個操作必須完整的被執(zhí)行,或者全不執(zhí)行,不允許有中間狀態(tài)存在。換句話說,像銀行轉(zhuǎn)賬這類業(yè)務(wù)是不允許只完成一部分的,只從賬號 A 中提取一萬元,或者只向賬號 B 中存入一萬元都是錯誤的。數(shù)據(jù)庫的

27、一致性狀態(tài)是指所有數(shù)據(jù)都滿足數(shù)據(jù)完整性約束條件的狀態(tài)。SQL Server 2005 用事務(wù)控制單個用戶的行為來解決這類問題。一個事務(wù)由一個或多個完成一組相關(guān)行為的SQL 語句組成,每個 SQL 語句都用來完成特定的任務(wù)。在 SQL Server 2005 中可以使用 4 種事務(wù)類型,如表 541所示。2ACID 檢驗一組行為要成為一個事務(wù),必須通過 ACID 檢驗。ACID 是下面 4 個事務(wù)屬性的每個單詞的頭一個字母的組合。(1)原子性(Atomicity)指事務(wù)的全有或全無性質(zhì)。一個事務(wù)中要么所有的操作都執(zhí)行,要么一個都不執(zhí)行。如果只執(zhí)行一些語句,返回這些執(zhí)行結(jié)果,而事務(wù)在完成之前就失敗

28、。只有在所有的語句和行為都正確完成的情況下,事務(wù)才能完成并把結(jié)果應(yīng)用于數(shù)據(jù)庫。(2)一致性(Consistency)事務(wù)在完成時,必須使所有的數(shù)據(jù)都保持一致的狀態(tài)。在相關(guān)數(shù)據(jù)庫中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。事務(wù)結(jié)束時,所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如 B 樹索引或雙向鏈表)都必須是正確的。(3)孤立性(Islation)事務(wù)過程中暫時不一致的數(shù)據(jù)都不能被其他事務(wù)應(yīng)用,直到數(shù)據(jù)再次一致。換句話說,當(dāng)事務(wù)使數(shù)據(jù)不一致時,沒有用戶能訪問其他用戶事務(wù)中的不一致數(shù)據(jù)。另外,其他事務(wù)不能影響孤立事務(wù)。(4)持久性(Durability)一旦完成了事務(wù)提交,它們就變成永久的。事務(wù)所完成的

29、工作得到永久的保存。如果提交一個事務(wù)以后計算機(jī)癱瘓,重新啟動計算機(jī),該事務(wù)的結(jié)果依然存在。3事務(wù)處理控制語句在 SQL Server 中,對事務(wù)的管理包含 3 個方面:事務(wù)控制語句,是用戶或者程序員把一系列 TransactSQL語句作為邏輯上的一個語句來處理;鎖機(jī)制(Locking),封鎖正被一個事務(wù)修改的數(shù)據(jù),防止其他用戶訪問到“不一致”的數(shù)據(jù);事務(wù)日志(Transaction Log),使事務(wù)具有可恢復(fù)性。事務(wù)控制語句包括三種:BEGIN TRANSACTION。COMMIT TRANSACTION。ROLLBACK TRANSACTION。在 SQL Server 中,通常事務(wù)是指以

30、BEGIN TRANSACTION 開始,到 ROLLABCK TRANSACTION 或一個相匹配的COMMIT TRANSACTION 之間的所有語句序列。COMMIT 表示提交事務(wù)中的一切操作,使得對數(shù)據(jù)庫的改變生效。ROLLBACK 表示要撤銷(Undo)該事務(wù)已做的一切操作,回滾到事務(wù)開始的狀態(tài)。4鎖機(jī)制SQL Server 2005 的關(guān)鍵特性之一是支持多用戶可以共享同一數(shù)據(jù)庫,但是,當(dāng)某些用戶同時對數(shù)據(jù)庫進(jìn)行修改時,會產(chǎn)生一定的并發(fā)問題。使用事務(wù)便可以解決用戶存取數(shù)據(jù)的這個問題,保持?jǐn)?shù)據(jù)庫的完整性和一致性。然而,在事務(wù)的執(zhí)行期間,數(shù)據(jù)庫可能暫時處于一個不一致的狀態(tài)。如果在數(shù)據(jù)庫不

31、一致狀態(tài)時讀取數(shù)據(jù),就有可能產(chǎn)生不一致問題。如果防止其他用戶修改另一個還沒完成的事務(wù)中的數(shù)據(jù),就必須在事務(wù)中使用鎖,對所修改的對象(表、字段)進(jìn)行封鎖。SQL Server 2005 中提供了多種鎖模式,主要包括:排他鎖、共享鎖、更新鎖、意向鎖、鍵范圍鎖、架構(gòu)鎖和大容量更新鎖,由鎖的性質(zhì)可知:讀操作(例如 SELECT)獲得共享鎖;寫操作(INSERT、DELETE)獲得排他鎖;而更新(Update)操作可分解為一個讀操作和一個寫操作,故首先獲得更新鎖,然后再升級為排他鎖。關(guān)于SQL Server 2005 中鎖的說明如表 542 所示。5使用 SSMS 查看鎖信息如果要了解 SQL Serv

32、er 2005 服務(wù)器上使用鎖的情況,可以使用 SQL Server Management Studio 工具,具體操作步驟如下所述。 打開 SQL Server Management Studio 窗口,再展開“管理”結(jié)點(diǎn),然后雙擊“活動監(jiān)視器”結(jié)點(diǎn),從打開的活動監(jiān)視器窗口中查看鎖的信息,如圖 542 所示。 在“活動監(jiān)視器”窗口中顯示了 3 種類型的信息,如下所述。如果在右側(cè)列表中,右擊進(jìn)程選擇“詳細(xì)信息”命令,可查看最后一個使用 TransactSQL 命令的批處理。lll進(jìn)程信息:顯示服務(wù)器上每個當(dāng)前運(yùn)行的進(jìn)程的信息,默認(rèn)類型。按進(jìn)程分類的鎖:在“所選進(jìn)程”列表中列出了當(dāng)前在服務(wù)器上持

33、有鎖的進(jìn)程。用戶可以通過選擇查看。按對象分類的鎖:在“所選進(jìn)程”列表中列出了當(dāng)前在服務(wù)器上被鎖信息的對象。圖 542活動監(jiān)視器窗口llllll6游標(biāo)概述在 SQL Server 2005 中,游標(biāo)(Cursor)類似于 C 語言指針結(jié)構(gòu),是一種數(shù)據(jù)訪問機(jī)制,允許用戶訪問單獨(dú)的數(shù)據(jù)行,而不是對整個行集進(jìn)行操作。用戶可以通過單獨(dú)處理每行逐條收集信息并對數(shù)據(jù)逐行進(jìn)行操作,也可以使用這些數(shù)據(jù)生成 SQL 代碼并立即執(zhí)行或輸出。在 SQL Server 2005 中,游標(biāo)主要包括游標(biāo)結(jié)果集和游標(biāo)位置兩部分,游標(biāo)結(jié)果集是由定義游標(biāo)的 SELECT語句返回的行的集合,游標(biāo)位置則是指向這個結(jié)構(gòu)集中的某一行的指

34、針。SQL Server 2005 中的游標(biāo)具有以下特點(diǎn):游標(biāo)返回一個完整的結(jié)果集,但允許程序設(shè)計語言只調(diào)用結(jié)果集中的一行。允許定位在結(jié)果集的特定行。從結(jié)果集的當(dāng)前位置檢索一行或多行。支持對結(jié)果集中當(dāng)前位置的行進(jìn)行數(shù)據(jù)修改。可以為其他用戶對顯示在結(jié)果集中的數(shù)據(jù)庫數(shù)據(jù)所做的更改提供不同級別的可見性支持。提供腳本、存儲過程和觸發(fā)器中使用的訪問結(jié)果集中數(shù)據(jù)的 TSQL 語句。7聲明游標(biāo)游標(biāo)在使用之前首先要聲明,定義 TransactSQL 服務(wù)器游標(biāo)的屬性,聲明游標(biāo)的語法格式如下。DECLARE游標(biāo)名稱 CURSORLOCAL GLOBALFORWARD_ONLY SCROLLSTATIC KEYSET DYNAMIC FAST_FORWARDREAD_ONLY SCROLL_LOCKS OPTIMISTIC”TYPE_WARNINGFOR 查詢語句FOR UPDATE OF 列名n【案例 181】在“選課管理”數(shù)據(jù)庫中為“學(xué)生基本檔案”表創(chuàng)建一個普通的游標(biāo),定義名稱為 Stu_cursor,語句如下所示。DECLAREStu_cur

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論