第8章Transact-SQL編程_第1頁
第8章Transact-SQL編程_第2頁
第8章Transact-SQL編程_第3頁
第8章Transact-SQL編程_第4頁
第8章Transact-SQL編程_第5頁
已閱讀5頁,還剩116頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第8章 Transact-SQL編程1234掌握掌握T-SQLT-SQL的編程基礎(chǔ)的編程基礎(chǔ)熟練掌握函數(shù)的使用和創(chuàng)建熟練掌握函數(shù)的使用和創(chuàng)建理解事務(wù)的概念理解事務(wù)的概念學(xué)學(xué)習(xí)習(xí)目目標(biāo)標(biāo)理解理解T-SQLT-SQL語言的含義語言的含義5掌握游標(biāo)的創(chuàng)建掌握游標(biāo)的創(chuàng)建主要內(nèi)容主要內(nèi)容8.1 8.1 批處理、腳本、注釋批處理、腳本、注釋8.2 8.2 常量、變量與數(shù)據(jù)類型常量、變量與數(shù)據(jù)類型8.3 8.3 運(yùn)算符與表達(dá)式運(yùn)算符與表達(dá)式8.4 8.4 流程控制語句流程控制語句8.5 8.5 系統(tǒng)內(nèi)置函數(shù)系統(tǒng)內(nèi)置函數(shù)8.6 8.6 用戶自定義函數(shù)用戶自定義函數(shù)8.7 8.7 事務(wù)事務(wù)8.8 8.8 鎖鎖8

2、.9 8.9 游標(biāo)游標(biāo)8.1 8.1 批處理、腳本、注釋批處理、腳本、注釋 當(dāng)由單獨(dú)的SQL語句不能完成任務(wù)時(shí),可以通過使用批處理、腳本、存儲(chǔ)過程、觸發(fā)器等多條T-SQL語句來完成。 1. 批處理 批處理是同時(shí)從應(yīng)用程序發(fā)送到 SQL Server 服務(wù)器并得以執(zhí)行的一個(gè)或多個(gè)SQL語句的集合,SQL Server 將批處理的語句編譯為單個(gè)可執(zhí)行單元,稱為執(zhí)行計(jì)劃。執(zhí)行計(jì)劃中的語句每次執(zhí)行一條。建立批處理時(shí),使用GO語句作為批處理的結(jié)束標(biāo)記。8.1 8.1 批處理、腳本、注釋批處理、腳本、注釋2. 腳本 腳本是存儲(chǔ)在文件中的一系列SQL語句,即一系列按順序提交的批處理。SQL腳本中可以包含一個(gè)

3、或多個(gè)批處理。腳本文件的擴(kuò)展名為.sql,使用腳本文件可以建立起可重復(fù)使用的模塊化代碼文件。還可以在不同計(jì)算機(jī)之間傳送SQL語句,腳本可以在查詢分析器中執(zhí)行,也可以在ISQL或OSQL實(shí)用程序中執(zhí)行。腳本文件也可以用記事本查看。8.1 8.1 批處理、腳本、注釋批處理、腳本、注釋3. 注釋 注釋是程序代碼中不執(zhí)行的文本字符串(也稱為注解)。在SQL Server中,可以使用兩種類型的注釋字符:一種用于單行注釋的注釋符“-”,另一種是塊注釋,注釋符號(hào)為“/* */”。 8.1 8.1 批處理、腳本、注釋批處理、腳本、注釋3. 注釋 注釋是程序代碼中不執(zhí)行的文本字符串(也稱為注解)。在SQL Se

4、rver中,可以使用兩種類型的注釋字符:一種用于單行注釋的注釋符“-”,另一種是塊注釋,注釋符號(hào)為“/* */”。 8.2 8.2 常量、變量與數(shù)據(jù)類型常量、變量與數(shù)據(jù)類型8.2.1 常量 常量是指在程序運(yùn)行過程中值不變的量,常量又稱為標(biāo)量值,是表示一個(gè)特定數(shù)據(jù)值的符號(hào)。SQL中的常量分為4種,分別為數(shù)字常量、字符串常量、日期和時(shí)間常量以及符號(hào)常量。常量的格式取決于它所表示的值的數(shù)據(jù)類型。.1 常量常量1. 數(shù)字常量數(shù)字常量包括整型常量和實(shí)型常量。整數(shù)型常量又分為二進(jìn)制整型常量、十六進(jìn)制整型常量和十進(jìn)制整型常量。十六進(jìn)制整型常量的表示為:前綴0 x后跟十六進(jìn)制數(shù)字串,如0 xE

5、BF。十進(jìn)制整數(shù)型常量即不帶小數(shù)點(diǎn)的十進(jìn)制數(shù),如:198。浮點(diǎn)型常量又稱為實(shí)型常量,有定點(diǎn)表示和浮點(diǎn)表示兩種方式。定點(diǎn)表示如:+145.678、-2340.89,56.09,浮點(diǎn)表示為:1026E4、0.8E+6、+21E-3。.1 常量常量2. 字符串常量 字符串常量括在單引號(hào)內(nèi),并包含字母、數(shù)字字符(az、AZ 和09)以及特殊字符,如感嘆號(hào) (!)、at 符 () 和數(shù)字號(hào) (#)。例如liujun就是字符串常量。8.2.1 8.2.1 常量常量3. 日期和時(shí)間常量 日期時(shí)間常量使用特定格式的字符日期值來表示,并被單引號(hào)括起來。SQL Server可以識(shí)別字母日期格式,如

6、April 15, 1998;可以識(shí)別數(shù)字日期格式,如4/15/1999、1998-12-4;可以識(shí)別未分隔的字符串格式,如20121225;可以識(shí)別時(shí)間常量,如 14:30:24。大多數(shù)據(jù)庫系統(tǒng)都提供了時(shí)間和日期的轉(zhuǎn)換函數(shù),以使其系統(tǒng)中時(shí)間和日期的格式得以統(tǒng)一。注意:通常時(shí)間和日期的使用都必須結(jié)合轉(zhuǎn)換函數(shù)一起使用,以保證進(jìn)行操作時(shí)時(shí)間和日期的格式是相同的。8.2.1 8.2.1 常量常量4.貨幣常量貨幣常量是以“$”作為前綴的一個(gè)整型或?qū)嵭统A繑?shù)據(jù)。如:$12、-$67.89。貨幣常量是以“$”作為前綴的一個(gè)整型或?qū)嵭统A繑?shù)據(jù)。如:$12、-$67.89。8.2.1 8.2.1 常量常量4.

7、貨幣常量貨幣常量是以“$”作為前綴的一個(gè)整型或?qū)嵭统A繑?shù)據(jù)。如:$12、-$67.89。貨幣常量是以“$”作為前綴的一個(gè)整型或?qū)嵭统A繑?shù)據(jù)。如:$12、-$67.89。8.2.2 8.2.2 變量變量1.全局變量 全局變量是SQL Server系統(tǒng)提供并賦值的變量。用戶不能建立全局變量,也不能修改全局變量。全局變量可以看做是組特殊的函數(shù),它們的名稱是以開始,而且不需要任何參數(shù)。如ERROR 返回執(zhí)行的上一個(gè)T-SQL語句的錯(cuò)誤號(hào)。如果上一條SQL語句被成功執(zhí)行,則ERROR返回值為0。 變量用于臨時(shí)存放數(shù)據(jù),變量中的數(shù)據(jù)隨著程序的執(zhí)行而變化,是SQL Server用來在語句之間傳遞數(shù)據(jù)的方式之

8、一。SQL 中有兩種形式的變量,一種是系統(tǒng)提供的全局變量,另外一種是用戶自己定義的局部變量。8.2.2 8.2.2 變量變量2. 局部變量 局部變量用于保存單個(gè)數(shù)據(jù)值。可以作為計(jì)數(shù)器計(jì)算循環(huán)執(zhí)行的次數(shù)或控制循環(huán)執(zhí)行的次數(shù),也可以用于保存由存儲(chǔ)過程代碼返回的數(shù)據(jù)值。此外,還可以使用TABLE數(shù)據(jù)類型的局部變量來代替臨時(shí)表。局部變量以“”開頭,由標(biāo)識(shí)符組成,標(biāo)識(shí)符允許的最大長度為128個(gè)字符。(1)局部變量聲明 局部變量在使用前要先用DECLARE語句聲明,其聲明的語法格式為:DECLARE 局部變量名 數(shù)據(jù)類型,n所有變量在聲明后均初始化為NULL。8.2.2 8.2.2 變量變量(2)局部變量

9、賦值語句當(dāng)聲明局部變量后,可用SET或SELECT語句為其賦值,語法格式如下: SET 局部變量=表達(dá)式,n SELECT 局部變量=表達(dá)式,n 【例8.1】創(chuàng)建局部變量va1、va2并賦值,然后輸出變量的值。DECLARE va1 CHAR(10) ,va2 CHAR(30)SET va1=努力 /*一個(gè)SET語句只能為一個(gè)變量賦值*/SET va2=va1+學(xué)習(xí)SELECT var1, var2GO8.2.2 8.2.2 變量變量(3)表數(shù)據(jù)類型變量的定義與賦值。語法格式如下:DECLARE table_variable_name AS TABLE ( | ,. ) 【例8.3】聲明一個(gè)表

10、數(shù)據(jù)類型變量并向變量中插入數(shù)據(jù)。DECLARE var_table AS TABLE ( num CHAR(12) NOT NULL PRIMARY KEY,name CHAR(8) NOT NULL,sex CHAR(2) NULL)/*聲明變量*/8.2.2 8.2.2 變量變量(4)局部變量的作用域局部變量的作用域從聲明該變量的地方開始,到聲明該變量的批處理結(jié)尾。INSERT INTO var_table SELECT 學(xué)號(hào),姓名,性別 FROM 學(xué)生/*插入數(shù)據(jù)*/SELECT * FROM var_table/*查看內(nèi)容*/.3 數(shù)據(jù)類型數(shù)據(jù)類型 在SQL Serve

11、r 2008中,根據(jù)字段、局部變量、表達(dá)式和參數(shù)對(duì)應(yīng)數(shù)據(jù)的特性,都有一個(gè)相關(guān)的數(shù)據(jù)類型。SQL Server 2008中支持兩類的數(shù)據(jù)類型。一類是系統(tǒng)數(shù)據(jù)類型又稱為基本數(shù)據(jù)類型。主要包括整數(shù)類型、精確數(shù)值類型、浮點(diǎn)類型、貨幣類型、字符類型、日期時(shí)間類型等。各數(shù)據(jù)類型的詳細(xì)說明參見第4章。另一類是用戶自定義數(shù)據(jù)類型,用戶自定義數(shù)據(jù)類型可以看做是系統(tǒng)類型的別名。在多表操作的情況下,當(dāng)多個(gè)表中的列要存儲(chǔ)相同類型的數(shù)據(jù)時(shí),往往要確保這些列具有完全相同的數(shù)據(jù)類型、長度和為空性(數(shù)據(jù)類型是否允許空值)。用戶自定義數(shù)據(jù)類型并不是真正的數(shù)據(jù)類型,它只是提供了一種提高數(shù)據(jù)庫內(nèi)部元素和基本數(shù)據(jù)類型之間一致性的機(jī)制

12、。8.2.3 8.2.3 數(shù)據(jù)類型數(shù)據(jù)類型1.創(chuàng)建用戶自定義數(shù)據(jù)類型 創(chuàng)建用戶自定義數(shù)據(jù)類型,可以通過圖形界面的方式,也可以通過T-SQL語句創(chuàng)建。(1)使用圖形界面方式創(chuàng)建 創(chuàng)建用戶自定義數(shù)據(jù)類型,可以通過圖形界面的方式,也可以通過T-SQL語句創(chuàng)建。 啟動(dòng)【SQL Server Management Studio】,在【對(duì)象資源管理器】中展開【數(shù)據(jù)庫】【學(xué)生成績管理系統(tǒng)】【可編程性】,右擊【類型】,選擇【新建】選項(xiàng),再選擇【新建用戶定義數(shù)據(jù)類型】,彈出【新建用戶定義數(shù)據(jù)類型】窗口。8.2.3 8.2.3 數(shù)據(jù)類型數(shù)據(jù)類型(2)使用T-SQL語句創(chuàng)建 在SQL Server 2008中,使用

13、CREATE TYPE語句來實(shí)現(xiàn)用戶數(shù)據(jù)類型的定義。語法格式如下:CREATE TYPE schema_name. type_nameFROM base_type ( precision , scale ) NULL | NOT NULL ; 根據(jù)上述語法,定義描述學(xué)號(hào)字段的數(shù)據(jù)類型的語句如下:CREATE TYPE xuehao FROM CHAR(10) NOT NULL8.2.3 8.2.3 數(shù)據(jù)類型數(shù)據(jù)類型刪除用戶自定義數(shù)據(jù)類型可以使用圖形界面方式,也可以執(zhí)行T-SQL語句來實(shí)現(xiàn)。2.2.刪除用戶自定義數(shù)據(jù)類型刪除用戶自定義數(shù)據(jù)類型(1 1)使用圖形界面方式刪除)使用圖形界面方式刪除

14、使用圖形界面方式刪除用戶自定義數(shù)據(jù)類型,具體操作步驟為: 啟動(dòng)【SQL Server Management Studio】,依次展開【數(shù)據(jù)庫】【學(xué)生成績管理系統(tǒng)】【可編程性】【類型】,在【用戶定義數(shù)據(jù)類型】中選擇類型【dbo.student_num】,右擊鼠標(biāo),在彈出的快捷菜單中選擇【刪除】菜單項(xiàng),打開【刪除對(duì)象】窗口后單擊【確定】按鈕即可。8.2.3 8.2.3 數(shù)據(jù)類型數(shù)據(jù)類型(2 2)使用)使用T-SQLT-SQL語句刪除語句刪除使用T-SQL刪除自定義數(shù)據(jù)類型可以使用DROP TYPE語句。語法格式為:DROP TYPE schema_name. type_name ; 例如,刪除前面

15、定義的xuehao類型的語句為:DROP TYPE xuehao8.2.3 8.2.3 數(shù)據(jù)類型數(shù)據(jù)類型3.3.用戶自定義數(shù)據(jù)類型的使用用戶自定義數(shù)據(jù)類型的使用 在定義類型后,接著應(yīng)考慮使用這種類型的字段,例如,對(duì)學(xué)生表中的學(xué)號(hào)使用用戶自定義的數(shù)據(jù)類型xuehao如圖8.4所示。Xuehao為定義好的數(shù)據(jù)類型圖8.4 使用用戶自定義數(shù)據(jù)類型8.2.3 8.2.3 數(shù)據(jù)類型數(shù)據(jù)類型 SQL Server 2008還提供了一種新的用戶自定義數(shù)據(jù)類型,稱為用戶自定義表數(shù)據(jù)類型(User-defined Table Types)。這種數(shù)據(jù)類型也由用戶自行定義,可以作為參數(shù)提供給語句、存儲(chǔ)過程或者函數(shù)。

16、創(chuàng)建自定義表數(shù)據(jù)類型也使用CREATE TYPE語句,語法格式如下:CREATE TYPE schema_name. type_nameAS TABLE ( ,.n ) ; 8.2.3 8.2.3 數(shù)據(jù)類型數(shù)據(jù)類型 【例8.4】 創(chuàng)建用戶自定義表數(shù)據(jù)類型,包含CJB表中的所有列。CREATE TYPE CJB_tabletypeAS TABLE (學(xué)號(hào)CHAR(6) NOT NULL,課程號(hào)CHAR(3) NOT NULL,成績intNOT NULL,PRIMARY KEY(學(xué)號(hào), 課程號(hào))8.3 8.3 運(yùn)算符與表達(dá)式運(yùn)算符與表達(dá)式 SQL Server 2008提供以下幾類運(yùn)算符:算數(shù)運(yùn)算

17、符、賦值運(yùn)算符、邏輯運(yùn)算符、字符串運(yùn)算符、比較運(yùn)算符、位運(yùn)算符和一元運(yùn)算符。通過運(yùn)算符連接構(gòu)成表達(dá)式。.1 運(yùn)算符運(yùn)算符 算術(shù)運(yùn)算符在兩個(gè)表達(dá)式上執(zhí)行數(shù)學(xué)運(yùn)算,這兩個(gè)表達(dá)式可以是任何數(shù)值數(shù)據(jù)類型。算術(shù)運(yùn)算符有+(加)、-(減)、*(乘)、/(除)和%(求模)5種運(yùn)算。+(加)和-(減)、運(yùn)算符還可用于對(duì)日期時(shí)間類型的值進(jìn)行算術(shù)運(yùn)算。1 1算術(shù)運(yùn)算符算術(shù)運(yùn)算符2. 2. 位運(yùn)算符位運(yùn)算符 位運(yùn)算符在兩個(gè)表達(dá)式之間執(zhí)行位操作,這兩個(gè)表達(dá)式的類型可為整型或與整型兼容的數(shù)據(jù)類型(如字符型等,但不能為IMAGE類型)。位運(yùn)算符如表8.1所示。.1 運(yùn)算符運(yùn)算符 &運(yùn)算類似

18、于邏輯運(yùn)算中的與運(yùn)算,| 運(yùn)算類似于邏輯運(yùn)算中的或運(yùn)算, 運(yùn)算類似于邏輯運(yùn)算中的異或,運(yùn)算規(guī)則是“相異為1”。表8.1 位運(yùn)算符運(yùn) 算 符運(yùn) 算 規(guī) 則&兩個(gè)位均為1時(shí),結(jié)果為1,否則為0|只要一個(gè)位為1,則結(jié)果為1,否則為0兩個(gè)位值不同時(shí),結(jié)果為1,否則為0.1 運(yùn)算符運(yùn)算符3. 3. 比較運(yùn)算符比較運(yùn)算符 比較運(yùn)算符(又稱關(guān)系運(yùn)算符)如表8.2所示,用于測(cè)試兩個(gè)表達(dá)式的值是否相同,其運(yùn)算結(jié)果為邏輯值,可以為TRUE、FALSE 及 UNKNOWN三者之一。運(yùn) 算 符含 義運(yùn) 算 符含 義=相等大于、!=不等于小于!=大于等于!不大于表8.2 比較運(yùn)算符.1

19、運(yùn)算符運(yùn)算符4. 4. 邏輯運(yùn)算符邏輯運(yùn)算符 邏輯運(yùn)算符用于對(duì)某個(gè)條件進(jìn)行測(cè)試,運(yùn)算結(jié)果為TRUE或FALSE。SQL Server提供的邏輯運(yùn)算符如表8.3所示。這里的邏輯運(yùn)算符在SELECT語句的WHERE子句中使用過。表8.3 邏輯運(yùn)算符運(yùn) 算 符運(yùn) 算 規(guī) 則AND如果兩個(gè)操作數(shù)值都為TRUE,則運(yùn)算結(jié)果為 TRUEOR如果兩個(gè)操作數(shù)中有一個(gè)為TRUE,則運(yùn)算結(jié)果為TRUENOT若一個(gè)操作數(shù)值為TRUE,則運(yùn)算結(jié)果為FALSE,否則為TRUEALL如果每個(gè)操作數(shù)值都為TRUE,則運(yùn)算結(jié)果為TRUEANY在一系列操作數(shù)中只要有一個(gè)為 TRUE,則運(yùn)算結(jié)果為TRUEBETWEEN如果操作數(shù)

20、在指定的范圍內(nèi),則運(yùn)算結(jié)果為TRUEEXISTS如果子查詢包含一些行,則運(yùn)算結(jié)果為TRUEIN如果操作數(shù)值等于表達(dá)式列表中的一個(gè),則運(yùn)算結(jié)果為TRUELIKE如果操作數(shù)與一種模式相匹配,則運(yùn)算結(jié)果為TRUESOME如果在一系列操作數(shù)中,有些值為TRUE,則運(yùn)算結(jié)果為TRUE.1 運(yùn)算符運(yùn)算符(1 1)ANYANY、SOMESOME、ALLALL、ININ的使用的使用 可以將ALL或ANY關(guān)鍵字與比較運(yùn)算符組合進(jìn)行子查詢。SOME的用法與ANY相同。以“”比較運(yùn)算符為例:ALL表示大于集合中的每一個(gè)值,即大于最大值。例如,ALL(5, 2, 3)表示大于5。因此,使用ALL的子查

21、詢也可用MAX集函數(shù)實(shí)現(xiàn)。ANY表示至少大于集合中的一個(gè)值,即大于最小值。例如,ANY (7, 2, 3)表示大于2。因此,使用ANY的子查詢也可用MIN集函數(shù)實(shí)現(xiàn)。=ANY運(yùn)算符與IN等效。ALL與NOT IN等效。.1 運(yùn)算符運(yùn)算符【例8.5】 查詢成績高于“陳立葉”最高成績的學(xué)生姓名,課程名及成績。USE 學(xué)生成績管理系統(tǒng)GOSELECT 姓名, 課程名稱, 成績FROM 學(xué)生, 成績, 課程WHERE 成績 ALL( SELECT 成績FROM 學(xué)生, 成績WHERE 學(xué)生.學(xué)號(hào)= 成績.學(xué)號(hào) AND 學(xué)生.姓名= 陳立葉)AND 學(xué)生.學(xué)號(hào)=成績.學(xué)號(hào)AND 課程.課

22、程編號(hào)=成績.課程編號(hào)AND 姓名陳立葉.1 運(yùn)算符運(yùn)算符(2 2)BETWEENBETWEEN的使用的使用語法格式:表達(dá)式 BETWEEN 起始值 AND 終止值說明如下:測(cè)試表達(dá)式是否介于起始值和終止值之間,如果是,則返回 TRUE,否則返回FALSE。等價(jià)于表達(dá)式=起始值 AND表達(dá)式, =, =, , !=, !, ! 比較運(yùn)算符4=(賦值)9(位異或)、&(位與)、|(位或) 5表8.4 運(yùn)算符優(yōu)先順序.2 表達(dá)式表達(dá)式表達(dá)式是符號(hào)與運(yùn)算符的組合,即常量、變量、列名、復(fù)雜計(jì)算、運(yùn)算符和函數(shù)的組合,一個(gè)表達(dá)式通??梢缘玫揭粋€(gè)值。與常量和變量一樣,表達(dá)式的

23、值也具有某種數(shù)據(jù)類型,可能的數(shù)據(jù)類型有字符類型、數(shù)值類型、日期時(shí)間類型。根據(jù)表達(dá)式的值的類型,表達(dá)式可分為字符型表達(dá)式、數(shù)值型表達(dá)式和日期時(shí)間型表達(dá)式。表達(dá)式也可以用運(yùn)算符將兩個(gè)或更多的簡單表達(dá)式連接起來組成復(fù)雜的表達(dá)式。SQL標(biāo)準(zhǔn)中規(guī)定了4種用于表達(dá)式的符號(hào):加號(hào)(+)、減號(hào)(-)、乘號(hào)(*)和除號(hào)(/)。在SQL語言中,這4種符號(hào)的優(yōu)先權(quán)與數(shù)學(xué)中的優(yōu)先權(quán)相同,乘除的優(yōu)先權(quán)高于加減的優(yōu)先權(quán),乘除具有相同的優(yōu)先權(quán),加減之間也具有相同的優(yōu)先權(quán)。它們都可以在同一表達(dá)式中使用,具有相同優(yōu)先權(quán)的符號(hào)按照從左到右的順序來計(jì)算。8.4 8.4 流程控制語句流程控制語句8.4.1 BEGIN8.4.1 BE

24、GINENDEND語句語句在條件和循環(huán)等流程控制語句中,要執(zhí)行兩個(gè)或兩個(gè)以上的Transact-SQL語句時(shí),就需要使用BEGINEND語句,這些語句可以作為一個(gè)單元來執(zhí)行。其語法形式為:BEGIN 語句1 語句2 ENDBEGINEND語句通常用于下列情況:l WHILE循環(huán)需要包含語句塊。l CASE語句的元素需要包含語句塊。l IF或ELSE子句需要包含語句塊。8.4.2 PRINT8.4.2 PRINT語句語句SQL Server向客戶程序返回信息的方法除了使用SELECT語句外,還可以使用PRINT語句,它的語法格式為:PRINT 字符串|局部變量|全局變量【例8.11】PRINT語

25、句舉例。DECLARE STR CHAR(20)SET STR=歡迎使用PRINT語句PRINT STRGO 如:PRINT VERSION 用于顯示當(dāng)前的版本信息8.4.3 8.4.3 IFIFELSEELSE語句語句在程序中,經(jīng)常需要根據(jù)特定條件指示SQL Server執(zhí)行不同的操作和運(yùn)算,進(jìn)行流程控制。SQL Server利用IFELSE命令使程序有不同的條件分支,從而完成各種不同條件環(huán)境下的操作。其語法形式為:IF 布爾表達(dá)式 語句1 ELSE 語句2 該語句的功能是首先判斷表達(dá)式的值,若表達(dá)式的值為TRUE,則執(zhí)行語句1,否則執(zhí)行語句2。8.4.3 8.4.3 IFIFELSEELS

26、E語句語句【例8.13】使用IFELSE語句實(shí)現(xiàn)以下功能:如果所有學(xué)生的成績都小于60,則將所有學(xué)生的成績?cè)谠瓉淼幕A(chǔ)上增加10分,否則顯示小于60分的學(xué)生的學(xué)號(hào)。IF (SELECT MAX(成績) FROM 成績)60 BEGIN UPDATE 成績 SET 成績=成績+10 PRINT 調(diào)整后的成績?yōu)椋?SELECT * FROM 成績 ENDELSE BEGIN PRINT 成績小于分的學(xué)生為: SELECT * FROM 成績 WHERE 成績60 END8.4.4 CASE8.4.4 CASE語句語句1 1簡單簡單CASECASE語句語句 CASE語句是一個(gè)特殊的SQL表達(dá)式,它能

27、夠?qū)崿F(xiàn)多重選擇的情況。CASE語句不能單獨(dú)執(zhí)行,而只能作為個(gè)可以單獨(dú)執(zhí)行的語句的一部分來使用。CASE語句分為簡單CASE語句和搜索CASE語句兩種類型。 簡單CASE語句將一個(gè)測(cè)試表達(dá)式與一組簡單表達(dá)式進(jìn)行比較,如果某個(gè)簡單表達(dá)式與測(cè)試表達(dá)式的值相等,則返回相應(yīng)結(jié)果表達(dá)式的值。8.4.4 CASE8.4.4 CASE語句語句 簡單CASE語句的語法格式為:CASE 測(cè)試表達(dá)式WHEN 測(cè)試值1 THEN 結(jié)果表達(dá)式1WHEN 測(cè)試值2 THEN 結(jié)果表達(dá)式2 ELSE 結(jié)果表達(dá)式nEND 8.4.4 CASE8.4.4 CASE語句語句 【例8.14】使用簡單CASE語句實(shí)現(xiàn)以下功能:分別輸

28、出課程號(hào)和課程名稱,而且在課程名稱后添加備注。USE 學(xué)生成績管理系統(tǒng)GOSELECT 課程編號(hào),課程名稱,備注=CASE 課程名稱 WHEN SQL Server 2008 THEN 數(shù)據(jù)庫應(yīng)用技術(shù) WHEN ASP.NET程序設(shè)計(jì) THEN WEB程序設(shè)計(jì) WHEN 計(jì)算機(jī)基礎(chǔ) THEN 計(jì)算機(jī)導(dǎo)論 WHEN網(wǎng)絡(luò)營銷 THEN 電子商務(wù)ENDFROM 課程GO8.4.4 CASE8.4.4 CASE語句語句2 2 搜索搜索CASECASE語句語句 與簡單CASE語句相比較,在搜索CASE語句中,CASE關(guān)鍵字后面不跟任何表達(dá)式,各個(gè)WHEN子句后都是布爾表達(dá)式。搜索CASE表達(dá)式的語法格式

29、為:CASEWHEN布爾表達(dá)式1 THEN結(jié)果表達(dá)式1 WHEN布爾表達(dá)式2 THEN結(jié)果表達(dá)式2 n ELSE 結(jié)果表達(dá)式nEND8.4.4 CASE8.4.4 CASE語句語句 【例8.15】成績表中成績用等級(jí)來替換,為空值的顯示“尚未選課”,60分的 為“不及格”,60到70分的為“及格”,70到80分為“中等”,80到90分的為“良好”,90分以上的顯示為“優(yōu)秀”,并將列標(biāo)題更改為“等級(jí)”。SELECT 學(xué)生.學(xué)號(hào), 姓名,等級(jí)= CASE WHEN 成績=60 AND 成績=70 AND 成績=80 AND 成績=90 THEN 優(yōu)秀END FROM 學(xué)生, 成績WHERE 學(xué)生.學(xué)

30、號(hào)=成績.學(xué)號(hào).5 WAITFOR WAITFOR語句語句 WAITFOR語句可以暫停程序的執(zhí)行,在達(dá)到指定的時(shí)間或時(shí)間間隔后繼續(xù)執(zhí)行程序。語法格式:WAITFOR DELAY 時(shí)間或 WAITFOR TIME 時(shí)間說明如下:l DELAY 選項(xiàng)用來指定一段時(shí)間間隔。l TIME選項(xiàng)用來指定某個(gè)具體的時(shí)間。.5 WAITFOR WAITFOR語句語句 【例8.16】設(shè)置在輸出所屬系部為信息工程系的班級(jí)信息后5秒鐘輸出所屬系部為電子工程系的班級(jí)信息。USE 學(xué)生成績管理系統(tǒng)GOSELECT * FROM 班級(jí) WHERE 所屬系部 =信息工程系GOWAITFOR

31、DELAY 00:00:05SELECT * FROM 班級(jí) WHERE 所屬系部 =電子工程系GO 8.4.6 WHILE8.4.6 WHILE語句語句 在程序中當(dāng)需要多次重復(fù)處理某項(xiàng)工作時(shí),就需使用WHILE循環(huán)語句。WHILE語句在設(shè)定的條件成立時(shí)會(huì)重復(fù)執(zhí)行SQL語句或程序塊??梢允褂?BREAK 和 CONTINUE 關(guān)鍵字在循環(huán)內(nèi)部控制 WHILE 循環(huán)中語句的執(zhí)行。WHILE 語句也可以嵌套執(zhí)行。WHILE語句的語法格式為:WHILE 布爾表達(dá)式 BEGIN 語句序列1 BREAK 語句序列2 CONTINUE 語句序列3END8.4.6 WHILE8.4.6 WHILE語句語句

32、BREAK語句一般用在循環(huán)語句中,用于退出本層循環(huán)。當(dāng)程序中有多層循環(huán)嵌套時(shí),使用BREAK語句只能退出其所在的這一層循環(huán)。CONTINUE語句一般用在循環(huán)語句中,用于結(jié)束本次循環(huán),重新轉(zhuǎn)到下一次循環(huán)條件的判斷。8.4.6 WHILE8.4.6 WHILE語句語句 【例8.18】本次考試成績較差,假定要提分,確保每人筆試都通過。提分規(guī)則很簡單,如果沒有全部通過,每人再加2分,再看是否都通過,如此反復(fù)提分,直到所有人都通過為止 ,并輸出提分次數(shù)。DECLARE count INTDECLARE num INT SET num=0SET count=(SELECT COUNT(學(xué)號(hào)) FROM 成

33、績 WHERE 成績60)WHILE count=0BEGIN UPDATE 成績SET 成績=成績+2 SET count= (SELECT COUNT(學(xué)號(hào)) FROM 成績WHERE 成績=60 SET retrunstr=取得學(xué)分 ELSE SET retrunstr=未取得學(xué)分RETURN retrunstr ENDGO.1 用戶自定義函數(shù)的定義與調(diào)用用戶自定義函數(shù)的定義與調(diào)用使用剛才定義的xuefen函數(shù)來查看課程編號(hào)為“101001”的課程,學(xué)生獲得學(xué)分的情況。在查詢編輯器中輸入如下代碼:USE 學(xué)生成績管理系統(tǒng)GOSELECT 學(xué)號(hào),成績,dbo.xuefen(

34、成績) AS 學(xué)分情況FROM 成績WHERE 課程編號(hào)=101001GO.1 用戶自定義函數(shù)的定義與調(diào)用用戶自定義函數(shù)的定義與調(diào)用【例8.21】創(chuàng)建用戶自定義標(biāo)量值函數(shù)pingjun,該函數(shù)通過輸入某課程號(hào),計(jì)算該課程的平均分。如 :PRINT dbo.pingjun(101001)就會(huì)顯示101001課程的平均分。CREATE FUNCTION pingjun1(kch CHAR(10) RETURNS INTASBEGIN DECLARE pjf INT SET pjf=(SELECT AVG(成績) FROM 成績 WHERE 課程編號(hào)=kch) RETURN pjf

35、END調(diào)用該函數(shù),顯示101001課程的平均分SELECT dbo.pingjun1(101001) AS 101001課程的平均分.1 用戶自定義函數(shù)的定義與調(diào)用用戶自定義函數(shù)的定義與調(diào)用(1)定義內(nèi)嵌表值函數(shù)2.2.內(nèi)嵌表值函數(shù)內(nèi)嵌表值函數(shù)內(nèi)嵌表值函數(shù)是一個(gè)返回值為表的函數(shù),語法格式如下:CREATE FUNCTION schema_name. function_name /*定義函數(shù)名部分*/( parameter_name AS parameter_data_type = default ,.n )RETURNS TABLE WITH ,.n AS RETURN ( s

36、elect_stmt ) ; .1 用戶自定義函數(shù)的定義與調(diào)用用戶自定義函數(shù)的定義與調(diào)用RETURNS子句僅包含關(guān)鍵字TABLE,表示此函數(shù)返回一個(gè)表。內(nèi)嵌表值函數(shù)的函數(shù)體僅有一個(gè)RETURN語句,并通過參數(shù)select-stmt指定的SELECT語句返回內(nèi)嵌表值。語法格式中的其他參數(shù)項(xiàng)與標(biāo)量函數(shù)的定義類似。從上述定義歸納出定義內(nèi)嵌表值函數(shù)的一般形式為:CREATE FUNCTION 函數(shù)名(參數(shù)名 類型) RETURNS TABLE WITH ENCRYPTIONAS RETURN(SELECT 語句).1 用戶自定義函數(shù)的定義與調(diào)用用戶自定義函數(shù)的定義與調(diào)用

37、表值函數(shù)遵循的原則:l RETURNS子句僅包含關(guān)鍵字table。不必定義返回變量的格式,因?yàn)樗蒖ETURN 子句中的 SELECT 語句的結(jié)果集的格式設(shè)置。l function_body 不由BEGIN和END分隔。l RETURN子句在括號(hào)中包含單個(gè)SELECT語句。SELECT語句的結(jié)果集構(gòu)成函數(shù)所返回的表。內(nèi)嵌表值函數(shù)中使用的SELECT語句受到與視圖中使用的SELECT語句相同的限制。.1 用戶自定義函數(shù)的定義與調(diào)用用戶自定義函數(shù)的定義與調(diào)用【例822】在學(xué)生成績管理系統(tǒng)中創(chuàng)建一個(gè)內(nèi)嵌表值函數(shù)XUESHENG,該函數(shù)可以根據(jù)輸入的系部名稱返回該系學(xué)生的基本信息。CR

38、EATE FUNCTION XUESHENG(inputxbmc NVARCHAR(30) RETURNS TABLE AS RETURN (SELECT 學(xué)號(hào), 姓名,學(xué)生.班級(jí)編號(hào) FROM 學(xué)生 JOIN 班級(jí) ON 學(xué)生.班級(jí)編號(hào)=班級(jí).班級(jí)編號(hào) WHERE 所屬系部=inputxbmc)GO.1 用戶自定義函數(shù)的定義與調(diào)用用戶自定義函數(shù)的定義與調(diào)用(2)調(diào)用內(nèi)嵌表值函數(shù)建立好內(nèi)嵌表值函數(shù)后,就可以象使用表或視圖一樣來使用它。內(nèi)嵌表值函數(shù)只能通過SELECT語句調(diào)用。通過函數(shù)查看信息工程系的學(xué)生信息。SELECT * FROM DBO.XUESHENG(信息工程系)GO

39、 .1 用戶自定義函數(shù)的定義與調(diào)用用戶自定義函數(shù)的定義與調(diào)用3.3.多語句表值函數(shù)多語句表值函數(shù) 用戶自定義多語句表值函數(shù)的返回值也是表TABLE,與內(nèi)嵌表值不同的是,多語句表值函數(shù)的RETURNS子句指定的TABLE類型中帶有列及數(shù)據(jù)類型。多語句表值函數(shù)需要由BEGIN和END限定函數(shù)體,在RETURNS子句中必須定義表的名稱和表的格式。.1 用戶自定義函數(shù)的定義與調(diào)用用戶自定義函數(shù)的定義與調(diào)用(1)定義多語句表值函數(shù)語法格式如下:CREATE FUNCTION function_name ( parameter_name AS parameter_data_

40、type =default ,.n )/*定義函數(shù)參數(shù)部分*/RETURNS return_variable TABLE /*定義作為返回值的表*/ WITH ,.n /*定義函數(shù)的可選項(xiàng)*/ AS BEGIN function_body /*定義函數(shù)體*/RETURN END ; : = /*定義表*/( ,.n ) .1 用戶自定義函數(shù)的定義與調(diào)用用戶自定義函數(shù)的定義與調(diào)用從上述定義歸納出定義內(nèi)嵌表值函數(shù)的一般形式為;CREATE FUNCTION 函數(shù)名(參數(shù)名 類型) RETURNS 自定義變量 TABLE (定義表結(jié)構(gòu))AS Insert into 語句 /*向表中輸

41、入數(shù)據(jù)*/RETURN.1 用戶自定義函數(shù)的定義與調(diào)用用戶自定義函數(shù)的定義與調(diào)用【例823】在學(xué)生成績管理系統(tǒng)庫中創(chuàng)建一個(gè)多語句表值函數(shù)chengji,該函數(shù)可以根據(jù)輸入的課程名稱返回選修該課程的學(xué)生姓名和成績。USE 學(xué)生成績管理系統(tǒng)GOCREATE FUNCTION chengji( inputkc as CHAR(20) )RETURNS chji TABLE ( /*為chengji 函數(shù)定義的表結(jié)構(gòu),名稱變量為chji */ 課程名稱 CHAR(20), 姓名 CHAR(8), 成績 TINYINT ).1 用戶自定義函數(shù)的定義與調(diào)用用戶自定義函數(shù)的定

42、義與調(diào)用ASBEGIN INSERT chji /*該變量是上面定義的表名稱變量*/ SELECT c.課程名稱,s.姓名 ,k.成績 FROM 學(xué)生 AS s INNER JOIN 成績 AS k ON s.學(xué)號(hào) =k.學(xué)號(hào) INNER JOIN 課程 AS c ON c.課程編號(hào)=k.課程編號(hào) AND c.課程名稱=inputkc RETURNENDGO.1 用戶自定義函數(shù)的定義與調(diào)用用戶自定義函數(shù)的定義與調(diào)用(2)調(diào)用多語句表值函數(shù)多語句表值函數(shù)的調(diào)用與內(nèi)嵌表值函數(shù)的調(diào)用方法相同。調(diào)用多語句表值函數(shù)查詢SQL Server 2008課程的信息。SELECT * FROM

43、dbo.chengji(SQL Server 2008) .2 用戶函數(shù)的管理用戶函數(shù)的管理1.查看用戶自定義函數(shù)的屬性在SQL Server 2008中,根據(jù)不同需要,可以使用SP_HELPTEXT、SP_HELP等系統(tǒng)存儲(chǔ)過程來查看用戶自定義函數(shù)的不同信息。使用SP_HELPTEXT查看用戶定義函數(shù)的文本信息,其語法格式為:SP_HELPTEXT 用戶自定義函數(shù)名使用SP_HELP查看用戶自定義函數(shù)的一般信息,其語法格式為:SP_HELP 用戶自定義函數(shù)名.2 用戶函數(shù)的管理用戶函數(shù)的管理2.修改用戶自定義函數(shù)使用SQL命令修改用戶自定義函數(shù),使用ALTER

44、 FUNCTION 命令可以修改用戶自定義函數(shù)。修改由CREATE FUNCTION 語句創(chuàng)建的現(xiàn)有用戶定義函數(shù),不會(huì)更改權(quán)限,也不影響相關(guān)的函數(shù)、存儲(chǔ)過程或觸發(fā)器。其語法格式如下:ALTER FUNCTION owner_name. function_name ( parameter_name AS scalar_parameter_data_type = default ,.n ) RETURNS scalar_return_data_type AS BEGIN function_body RETURN scalar_expressionEND其中的參數(shù)與建立用戶自定義函數(shù)中的參數(shù)意義相同

45、。.2 用戶函數(shù)的管理用戶函數(shù)的管理2.修改用戶自定義函數(shù)【例8.25】修改用戶自定義函數(shù)chengji,將該函數(shù)加密。USE 學(xué)生成績管理系統(tǒng)GOALTER FUNCTION chengji( inputkc as CHAR(20) )RETURNS chji TABLE ( /*為chengji 函數(shù)定義的表結(jié)構(gòu),名稱變量為chji */ 課程名稱 CHAR(20), 姓名 CHAR(8), 成績 TINYINT )WITH ENCRYPTION.2 用戶函數(shù)的管理用戶函數(shù)的管理ASBEGIN INSERT chji /*該變量是上面定義的表名稱變量*/ S

46、ELECT c.課程名稱,s.姓名 ,k.成績 FROM 學(xué)生 AS s INNER JOIN 成績 AS k ON s.學(xué)號(hào) =k.學(xué)號(hào) INNER JOIN 課程 AS c ON c.課程編號(hào)=k.課程編號(hào) AND c.課程名稱=inputkc RETURNENDGO使用系統(tǒng)存儲(chǔ)過程SP_HELPTEXT chengji再次查看該函數(shù)的定義,WITH ENCRYPTION.2 用戶函數(shù)的管理用戶函數(shù)的管理3.使用T-SQL命令刪除用戶自定義函數(shù)使用DROP命令可以一次刪除多個(gè)用戶自定義函數(shù),其語法格式為:DROP FUNCTION 所有者名稱.函數(shù)名稱,n【例8.26】刪除

47、在學(xué)生成績管理系統(tǒng)庫上建立的chengji函數(shù)。USE 學(xué)生成績管理系統(tǒng)GODROP FUNCTION dbo. chengjiGO8.7 8.7 事務(wù)事務(wù)在數(shù)據(jù)庫中,多個(gè)用戶可能在同一時(shí)刻去訪問或修改同一部分?jǐn)?shù)據(jù),這樣可能會(huì)導(dǎo)致數(shù)據(jù)庫中數(shù)據(jù)不一致,為了避免這種情況的出現(xiàn),可以采用事務(wù)來處理。事務(wù)是最小的工作單元。這個(gè)工作單元要么成功完成所有操作,要么就是失敗,并失敗后所有的操作都將撤銷。.1 事務(wù)概述事務(wù)概述事務(wù)必須具備以下四個(gè)屬性,簡稱ACID 屬性:原子性(Atomicity):事務(wù)是一個(gè)完整的操作。事務(wù)的各步操作是不可分的(原子的);要么都執(zhí)行,要么都不執(zhí)行。一致性(C

48、onsistency):當(dāng)事務(wù)完成時(shí),數(shù)據(jù)必須處于一致狀態(tài)。隔離性(Isolation):對(duì)數(shù)據(jù)進(jìn)行修改的所有并發(fā)事務(wù)是彼此隔離的,這表明事務(wù)必須是獨(dú)立的,它不應(yīng)以任何方式依賴于或影響其他事務(wù)。永久性(Durability):事務(wù)完成后,它對(duì)數(shù)據(jù)庫的修改被永久保持,事務(wù)日志能夠保持事務(wù)的永久性。.1 事務(wù)概述事務(wù)概述事務(wù)的分類:顯示事務(wù):用BEGIN TRANSACTION明確指定事務(wù)的開始,這是最常用的事務(wù)類型。隱性事務(wù):通過設(shè)置SET IMPLICIT_TRANSACTIONS ON 語句,將隱性事務(wù)模式設(shè)置為打開,下一個(gè)語句自動(dòng)啟動(dòng)一個(gè)新事務(wù)。當(dāng)該事務(wù)完成時(shí),再下一個(gè) T

49、-SQL 語句又將啟動(dòng)一個(gè)新事務(wù)。自動(dòng)提交事務(wù):這是 SQL Server 的默認(rèn)模式,它將每條單獨(dú)的 T-SQL 語句視為一個(gè)事務(wù),如果成功執(zhí)行,則自動(dòng)提交;如果錯(cuò)誤,則自動(dòng)回滾。可以作為隱式事務(wù)的開始的與具有:ALTER TABLE、CREATE、 DELETE、DROP、FETCH、GRANT、INSERT、OPEN、REVOKE、SELECT、TRUNCATE TABLE、UPDATE。 結(jié)束隱式事務(wù),必須使用COMMIT TRANSACTION或ROLLBACK TRANSACTION語句。.2 事務(wù)運(yùn)用事務(wù)運(yùn)用根據(jù)事務(wù)的來源,SQL Server 2008中的事務(wù)可

50、以分為兩類:系統(tǒng)提供的事務(wù)和用戶定義的事務(wù)。系統(tǒng)提供的事務(wù)是在執(zhí)行某些T-SQL語句時(shí),一條語句就構(gòu)成了一個(gè)事務(wù),這些語句包括ALTER TABLE、CREATE、DELETE、DROP、FETCH、GRANT、INSERT、OPEN、REVOKE、SELECT、UPDATE、TRUNCATE TABLE。例如,執(zhí)行如下創(chuàng)建表的語句:CREATE TABLE xxx(f1 INT NOT NULL,f2 CHAR(10) NOT NULL,f3 VARCHAR(30) NULL)該語句本身就是一個(gè)事務(wù)。在實(shí)際應(yīng)用中,大量使用的是用戶自定義事務(wù)。返回.2 事務(wù)運(yùn)用事務(wù)運(yùn)用使用用戶

51、自定義事務(wù)由以下幾個(gè)步驟:1.1.開始事務(wù)開始事務(wù)在SQL Server中,顯式地開始一個(gè)事務(wù)可以使用BEGIN TRANSACTION語句。語法格式:BEGIN TRAN | TRANSACTION transaction_name | tran_name_variable WITH MARK dEscription transaction_name 分配給事務(wù)的名稱,必須遵循標(biāo)識(shí)符命名規(guī)則。tran_name_variable 用戶定義的、含有有效事務(wù)名稱的變量名稱。.2 事務(wù)運(yùn)用事務(wù)運(yùn)用2.2.結(jié)束事務(wù)結(jié)束事務(wù)COMMIT TRANSCATION語句是提交語句,它將事務(wù)開

52、始以來所執(zhí)行的所有數(shù)據(jù)都修改成為數(shù)據(jù)庫的永久部分,也標(biāo)志一個(gè)事務(wù)的結(jié)束,其語法格式為:COMMIT TRAN | TRANSACTION transaction_name | tran_name_variable ; 標(biāo)志一個(gè)事務(wù)的結(jié)束也可以使用COMMIT WORK語句。語法格式為:COMMIT WORK此語句的功能與COMMIT TRANSACTION相同,但COMMIT TRANSACTION接受用戶定義的事務(wù)名稱,而COMMIT WORK不帶參數(shù)。.2 事務(wù)運(yùn)用事務(wù)運(yùn)用3.3.撤銷事務(wù)撤銷事務(wù)若要結(jié)束一個(gè)事務(wù),可以使用ROLLBACK TRANSACTION語句。它使得

53、事務(wù)回滾到起點(diǎn),撤銷自最近一條BEGIN TRANSACTION語句以后對(duì)數(shù)據(jù)庫的所有更改,同時(shí)也標(biāo)志了一個(gè)事務(wù)的結(jié)束。語法格式:ROLLBACK TRAN | TRANSACTION transaction_name | tran_name_variable ; ROLLBACK TRANSACTION語句不能在COMMIT語句之后。另外,一條ROLLBACK WORK語句也能撤銷一個(gè)事務(wù),功能與ROLLBACK TRANSACTION語句一樣,但ROLLBACK TRANSACTION語句接受用戶定義的事務(wù)名稱。語法格式:ROLLBACK WORK ; .2 事務(wù)運(yùn)用事務(wù)運(yùn)

54、用4.4.回滾事務(wù)回滾事務(wù)ROLLBACK TRANSACTION語句除了能夠撤銷整個(gè)事務(wù),還可以使事務(wù)回滾到某個(gè)點(diǎn),不過在這之前需要使用SAVE TRANSACTION語句來設(shè)置一個(gè)保存點(diǎn)。SAVE TRANSACTION的語法格式:SAVE TRAN | TRANSACTION savepoint_name | savepoint_variable ; SAVE TRANSACTION語句會(huì)向已命名的保存點(diǎn)回滾一個(gè)事務(wù)。如果在保存點(diǎn)被設(shè)置后,當(dāng)前事務(wù)對(duì)數(shù)據(jù)進(jìn)行了更改,則這些更改會(huì)在回滾中被撤銷。語法格式為ROLLBACK TRAN | TRANSACTION savepoint_name

55、| savepoint_variable ; .2 事務(wù)運(yùn)用事務(wù)運(yùn)用【例8.27】定義一個(gè)事務(wù),向?qū)W生成績管理系統(tǒng)數(shù)據(jù)庫的學(xué)生表添加一行數(shù)據(jù),然后刪除該行數(shù)據(jù);但執(zhí)行后,新插入的數(shù)據(jù)行并沒有刪除,因?yàn)槭聞?wù)中使用了ROLLBACK語句將操作回滾到保存點(diǎn)My_sav,即刪除前的狀態(tài)。BEGIN TRANSACTION My_tranUSE 學(xué)生成績管理系統(tǒng)INSERT INTO 學(xué)生(學(xué)號(hào),姓名,性別,出生日期,班級(jí)編號(hào),年級(jí))VALUES(1001010204, 胡新華,男, 1991-06-27, 10010102, 2010)SAVE TRANSACTION My_savDE

56、LETE FROM 學(xué)生 WHERE 學(xué)號(hào)=1001010204ROLLBACK TRAN My_savCOMMIT WORKGO執(zhí)行完上述語句后使用SELECT語句查詢XSB表中的記錄:SELECT * FROM 學(xué)號(hào) WHERE 學(xué)號(hào)=10010102048.8 8.8 鎖鎖鎖用來提供數(shù)據(jù)庫的并發(fā)性控制。 如果沒有鎖,SQL Server就沒有防止多個(gè)用戶同時(shí)更新同一數(shù)據(jù)的機(jī)制。一個(gè)鎖就是在多用戶環(huán)境中對(duì)某一種正在被使用的資源的一個(gè)限制,它阻止其他用戶訪問或修改資源中的數(shù)據(jù)。SQL Server為了保證用戶操作的一致性,自動(dòng)對(duì)資源設(shè)置和釋放鎖。例如,當(dāng)用戶正在更新一個(gè)表時(shí),沒有任何其他用戶

57、能夠修改甚至查看已經(jīng)更新過的記錄。當(dāng)所有的與該用戶相關(guān)的更新操作都完成后,鎖便會(huì)釋放,同時(shí)記錄變成可訪問的。8.8 8.8 鎖鎖SQL Server中常用的有以下幾種鎖:(1)共享鎖(2)獨(dú)占鎖(3)更新鎖(4)意向鎖(5)鍵范圍鎖(6)架構(gòu)鎖(7)大容量更新鎖8.9 8.9 游標(biāo)游標(biāo)一個(gè)對(duì)表進(jìn)行操作的T-SQL語句通常都可產(chǎn)生或處理一組記錄,但是許多應(yīng)用程序,尤其是T-SQL嵌入到的主語言,通常不能把整個(gè)結(jié)果集作為一個(gè)單元來處理,這些應(yīng)用程序就需要一種機(jī)制來保證每次處理結(jié)果集中的一行或幾行,游標(biāo)(CURSOR)就提供了這種機(jī)制。游標(biāo)是處理數(shù)據(jù)的一種方法,可以看作是一個(gè)表中的記錄的指針,作用于

58、SELECT 語句生成的記錄集,能夠?qū)崿F(xiàn)在記錄集中逐行向前或者向后訪問數(shù)據(jù)。使用游標(biāo),可以在記錄集中的任意位置顯示、修改和刪除當(dāng)前記錄的數(shù)據(jù)。 SQL Server對(duì)游標(biāo)的使用要遵循“聲明游標(biāo)打開游標(biāo)讀取數(shù)據(jù)關(guān)閉游標(biāo)刪除游標(biāo)”的過程。.1 游標(biāo)的基本操作游標(biāo)的基本操作1.聲明游標(biāo)游標(biāo)在使用之前需要聲明。T-SQL語言中使用DECLARE CURSOR語句聲明游標(biāo),該語句有兩種格式,分別支持SQL-92標(biāo)準(zhǔn)和T-SQL擴(kuò)展的游標(biāo)聲明(1)SQL-92標(biāo)準(zhǔn)語法DECLARE cursor_name INSENSITIVE SCROLL CURSOR FOR select_state

59、ment FOR READ ONLY | UPDATE OF column_name ,.n ;.1 游標(biāo)的基本操作游標(biāo)的基本操作說明如下。l cursor_name:游標(biāo)名,它是與某個(gè)查詢結(jié)果集相聯(lián)系的符號(hào)名,要符合SQL Server標(biāo)識(shí)符命名規(guī)則。l INSENSITIVE:指定系統(tǒng)將創(chuàng)建供所定義的游標(biāo)使用的數(shù)據(jù)的臨時(shí)復(fù)本 ,對(duì)游標(biāo)的所有請(qǐng)求都從tempdb中的該臨時(shí)表中得到應(yīng)答。 l SCROLL:說明所聲明的游標(biāo)可以前滾、后滾,可使用所有的提取選項(xiàng)(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)。l select_statement:

60、SELECT語句,由該查詢產(chǎn)生與所聲明的游標(biāo)相關(guān)聯(lián)的結(jié)果集。該SELECT語句中不能出現(xiàn)COMPUTE、COMPUTE BY、INTO或FOR BROWSE關(guān)鍵字。l READ ONLY:說明所聲明的游標(biāo)為只讀的。UPDATE指定游標(biāo)中可以更新的列,若有參數(shù)OF column_name ,n ,則只能修改給出的這些列。.1 游標(biāo)的基本操作游標(biāo)的基本操作以下是一個(gè)符合SQL-92標(biāo)準(zhǔn)的游標(biāo)聲明:DECLARE XS_CUR1 CURSORFORSELECT 學(xué)號(hào),姓名,性別FROM 學(xué)生 WHERE 年級(jí)= 2010FOR READ ONLY.1 游標(biāo)的基本操作游

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論