




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、存儲過程,觸發(fā)器和函數(shù)存儲過程,觸發(fā)器和函數(shù)存儲過程,觸發(fā)器和函數(shù)存儲過程,觸發(fā)器和函數(shù)v T-SQL編程基礎(chǔ)編程基礎(chǔ)v 存儲過程存儲過程v 觸發(fā)器觸發(fā)器v 自定義函數(shù)自定義函數(shù)v 小結(jié)小結(jié)FT-SQL語言基礎(chǔ)語言基礎(chǔ)主要數(shù)據(jù)類型:主要數(shù)據(jù)類型: smallint,int,numeric,decimal,char, varchar,nchar,nvarchar ,datetime運(yùn)算符及優(yōu)先級運(yùn)算符及優(yōu)先級常用函數(shù)常用函數(shù)變量:變量: 局部變量(內(nèi)存變量,字段變量)局部變量(內(nèi)存變量,字段變量) 全局變量(系統(tǒng)變量)全局變量(系統(tǒng)變量)內(nèi)容回顧內(nèi)容回顧v全局變量由系統(tǒng)定義并維護(hù),通過在名稱前面
2、加“”符號v局部變量的首字母為單個“”。全局變量和局部變量全局變量和局部變量(1)局部變量局部變量v局部變量使用DECLARE語句定義DECLARE local_variable data_type ,.nv變量名最大長度為30個字符。一條DECLARE語句可以定義多個變量,各變量之間使用逗號隔開。v例如DECLARE name varchar(30),type int局部變量的賦值局部變量的賦值 用SELECT為局部變量賦值SELECT variable_name=expression , nFROM WHERE v例如 DECLARE int_var int SELECT int_var
3、=12 /*給int_var賦值*/ SELECT int_var /*將int_var的值輸出到屏幕上*/例1 使用SELECT語句從S表中檢索出學(xué)生編號為“95001”的行,再將學(xué)生的名字賦給變量stuname。DECLARE stuname varchar(40) SELECT stuname=snameFROM SWHERE Sno=95001局部變量沒有被賦值前,其值是NULL,若要在程序中引用它,必須先賦值。 用用SET給局部變量賦值給局部變量賦值vSET語句格式為:SET local_variable=expressionv使用SET初始化變量的方法與SELECT語句相同,但一個
4、SET語句只能為一個變量賦值。例2 計(jì)算S表的記錄數(shù)并賦值給局部變量rows。DECLARE rows intSET rows=(SELECT COUNT(*) FROM S)SELECT rows(2)全局變量全局變量v全局變量通常被服務(wù)器用來跟蹤服務(wù)器范圍和特定會話期間的信息,不能顯式地被賦值或聲明。v全局變量不能由用戶定義,也不能被應(yīng)用程序用來在處理器之間交叉?zhèn)鬟f信息。 9.1.2 9.1.2 常量與變量常量與變量在在SQL ServerSQL Server中,可以使用兩種類型的注釋:中,可以使用兩種類型的注釋: 以以“ - - - - ”開頭開頭 ANSIANSI標(biāo)準(zhǔn)的注釋符,用于單行
5、注釋。標(biāo)準(zhǔn)的注釋符,用于單行注釋。 / /* * 注釋內(nèi)容注釋內(nèi)容 * */ / 用于單行或多行注釋。用于單行或多行注釋。T-SQL編程基礎(chǔ)編程基礎(chǔ) 注 釋 輸出語句輸出語句 PRINTPRINTl作用:是在屏幕上顯示指定信息。作用:是在屏幕上顯示指定信息。l語法:語法:PRINT PRINT 常量常量 | | 變量變量| | 表達(dá)式表達(dá)式| | 函數(shù)函數(shù) SELECTSELECTl作用:以列表結(jié)構(gòu)形式在屏幕上顯示指定信息。作用:以列表結(jié)構(gòu)形式在屏幕上顯示指定信息。l語法:語法:SELECT SELECT 常量常量 | | 變量變量| | 表達(dá)式表達(dá)式 | | 函數(shù)函數(shù) AS AS 別名別名,
6、 n, n示例示例: :PRINT PRINT 服務(wù)器的名稱:服務(wù)器的名稱: + SERVERNAME+ SERVERNAMESELECT SERVERNAME AS SELECT SERVERNAME AS 服務(wù)器名稱服務(wù)器名稱T-SQL編程基礎(chǔ)編程基礎(chǔ)l批批是包含一個或多個是包含一個或多個 Transact-SQL Transact-SQL 語句的集合,從語句的集合,從應(yīng)用程序一次性地發(fā)送到服務(wù)器執(zhí)行。應(yīng)用程序一次性地發(fā)送到服務(wù)器執(zhí)行。SQL Server SQL Server 將將批處理語句編譯成一個可執(zhí)行單元,此單元稱為執(zhí)行批處理語句編譯成一個可執(zhí)行單元,此單元稱為執(zhí)行計(jì)劃。計(jì)劃。l一
7、般是將一些邏輯相關(guān)的業(yè)務(wù)操作語句放置在同一批一般是將一些邏輯相關(guān)的業(yè)務(wù)操作語句放置在同一批中,這完全由代碼編寫者決定。中,這完全由代碼編寫者決定。lGOGO是批處理結(jié)束標(biāo)志。是批處理結(jié)束標(biāo)志。 批處理批處理T-SQL編程基礎(chǔ)編程基礎(chǔ)lCREATECREATE 語句不能在批處理中與其他語句組合使用。語句不能在批處理中與其他語句組合使用。l不能在同一個批處理中更改表,然后引用新列。不能在同一個批處理中更改表,然后引用新列。l不能在同一個批中刪除一個數(shù)據(jù)庫對象又重建它。不能在同一個批中刪除一個數(shù)據(jù)庫對象又重建它。l不能在同一個批中將規(guī)則或默認(rèn)綁定給列又使用它們。不能在同一個批中將規(guī)則或默認(rèn)綁定給列又
8、使用它們。l如果如果 EXECUTEEXECUTE 語句是批處理中的第一句,則不需要語句是批處理中的第一句,則不需要 EXECUTE EXECUTE 關(guān)鍵字。關(guān)鍵字。(1) 批處理使用應(yīng)遵守的規(guī)則批處理使用應(yīng)遵守的規(guī)則T-SQL編程基礎(chǔ)編程基礎(chǔ) 批處理批處理l編譯錯誤使執(zhí)行計(jì)劃無法編譯,會導(dǎo)致批處理中的任何語編譯錯誤使執(zhí)行計(jì)劃無法編譯,會導(dǎo)致批處理中的任何語句都無法執(zhí)行。句都無法執(zhí)行。l運(yùn)行時錯誤產(chǎn)生以下兩種影響之一:運(yùn)行時錯誤產(chǎn)生以下兩種影響之一:u停止執(zhí)行批處理中當(dāng)前語句和它之后的語句。停止執(zhí)行批處理中當(dāng)前語句和它之后的語句。u停止執(zhí)行當(dāng)前語句,繼續(xù)執(zhí)行其它所有語句。停止執(zhí)行當(dāng)前語句,繼續(xù)
9、執(zhí)行其它所有語句。 l在遇到運(yùn)行時錯誤之前執(zhí)行的語句不受影響。在遇到運(yùn)行時錯誤之前執(zhí)行的語句不受影響。(2)批處理運(yùn)行時錯誤的影響)批處理運(yùn)行時錯誤的影響T-SQL編程基礎(chǔ)編程基礎(chǔ) 批處理批處理l語法:語法: BEGINBEGIN 執(zhí)行的執(zhí)行的SQLSQL語句語句 ENDENDl說明:定義一組語句,通常在說明:定義一組語句,通常在IFIF、ELSEELSE或或WHILEWHILE后面。后面。 (1 1)復(fù)合語句()復(fù)合語句(BEGINENDBEGINEND)(2 2) 判斷語句(判斷語句(IFELSEIFELSE)語法:語法:IFIF 條件表達(dá)式條件表達(dá)式 SQLSQL語句語句1 1 ELSE
10、ELSE SQL SQL語句語句2 2 說明:當(dāng)條件為真時,執(zhí)行一條或一組語句。說明:當(dāng)條件為真時,執(zhí)行一條或一組語句。 T-SQL編程基礎(chǔ)編程基礎(chǔ)流程控制語句流程控制語句示例:求英語課程的平均分?jǐn)?shù)。如果在示例:求英語課程的平均分?jǐn)?shù)。如果在8080以上,則顯示以上,則顯示 “ “成績達(dá)成績達(dá)到預(yù)期目標(biāo)到預(yù)期目標(biāo)”,并查詢高于平均分的學(xué)號和分?jǐn)?shù);否則,顯示還,并查詢高于平均分的學(xué)號和分?jǐn)?shù);否則,顯示還需繼續(xù)努力需繼續(xù)努力”,并查詢低于平均分的學(xué)號和分?jǐn)?shù)。,并查詢低于平均分的學(xué)號和分?jǐn)?shù)。 USEUSE 教學(xué)成績管理數(shù)據(jù)庫教學(xué)成績管理數(shù)據(jù)庫 GOGO SET NOCOUNT ON SET NOCOU
11、NT ON - - - - 不顯示統(tǒng)計(jì)信息不顯示統(tǒng)計(jì)信息 DECLARE DECLARE 平均分平均分 FLOATFLOAT SELECTSELECT 平均分平均分=AVG(=AVG(分?jǐn)?shù)分?jǐn)?shù)) ) FROMFROM 教學(xué)成績表教學(xué)成績表 WHEREWHERE 課程編號課程編號= = ( ( SELECTSELECT 編號編號 FROM FROM 課程信息表課程信息表 WHEREWHERE 名稱名稱=英語英語) ) PRINTPRINT 英語課程平均分?jǐn)?shù)英語課程平均分?jǐn)?shù) + STR( + STR(平均分平均分,5,1),5,1)IFIF ( (平均分平均分 80) 80) BEGINBEGIN
12、 PRINTPRINT 成績達(dá)到預(yù)期目標(biāo)成績達(dá)到預(yù)期目標(biāo)! ! SELECTSELECT 學(xué)號學(xué)號, ,分?jǐn)?shù)分?jǐn)?shù) FROMFROM 教學(xué)成績表教學(xué)成績表 WHEREWHERE 分?jǐn)?shù)分?jǐn)?shù)平均分平均分 ANDAND 課程編號課程編號= = ( ( SELECTSELECT 編號編號 FROM FROM 課程信息表課程信息表 WHEREWHERE 名稱名稱=英語英語) ) ENDEND ELSEELSE BEGINBEGIN PRINTPRINT 還需繼續(xù)努力!低于平均分的學(xué)生:還需繼續(xù)努力!低于平均分的學(xué)生: SELECTSELECT 學(xué)號學(xué)號, ,分?jǐn)?shù)分?jǐn)?shù) FROMFROM 教學(xué)成績表教學(xué)成績表
13、 WHEREWHERE 分?jǐn)?shù)分?jǐn)?shù)=90 =90 ANDAND 分?jǐn)?shù)分?jǐn)?shù)=100 =80 =80 ANDAND 分?jǐn)?shù)分?jǐn)?shù)90 =70 =70 AND AND 分?jǐn)?shù)分?jǐn)?shù)80 =60 =60 ANDAND 分?jǐn)?shù)分?jǐn)?shù)70 70 THENTHEN 及格及格 ELSEELSE 不及格不及格 ENDEND SELECTSELECT * * FROMFROM #CJB #CJB GOGO示例示例2 2:根據(jù)分?jǐn)?shù)計(jì)算出成績等級。:根據(jù)分?jǐn)?shù)計(jì)算出成績等級。 USEUSE 教學(xué)成績管理數(shù)據(jù)庫教學(xué)成績管理數(shù)據(jù)庫 GOGO SET NOCOUNT ONSET NOCOUNT ON SELECTSELECT 學(xué)號學(xué)號,
14、,分?jǐn)?shù)分?jǐn)?shù), ,成績成績 INTOINTO #CJB #CJB FROMFROM 教學(xué)成績表教學(xué)成績表 UPDATEUPDATE #CJB #CJB SETSET 成績成績= = CASE CASE FLOORFLOOR( (分?jǐn)?shù)分?jǐn)?shù)/10)/10) WHENWHEN 10 10 THENTHEN 優(yōu)秀優(yōu)秀 WHENWHEN 9 9 THENTHEN 優(yōu)秀優(yōu)秀 WHEN WHEN 8 8 THENTHEN 良好良好 WHENWHEN 7 7 THENTHEN 中等中等 WHENWHEN 6 6 THENTHEN 及格及格 ELSEELSE 不及格不及格 ENDEND SELECTSELECT
15、* * FROMFROM #CJB #CJB GOGOl語法:語法: WHILE WHILE 條件表達(dá)式條件表達(dá)式 SQLSQL語句語句 | | SQLSQL語句組語句組l說明:說明: 設(shè)置重復(fù)執(zhí)行設(shè)置重復(fù)執(zhí)行 SQL SQL 語句或語句組的條件,只要指定語句或語句組的條件,只要指定的條件為真,就重復(fù)執(zhí)行語句。在循環(huán)內(nèi)部可使用如下的條件為真,就重復(fù)執(zhí)行語句。在循環(huán)內(nèi)部可使用如下控制語句:控制語句: uBREAK BREAK : :跳出循環(huán)之后執(zhí)行跳出循環(huán)之后執(zhí)行uCONTINUE CONTINUE : :轉(zhuǎn)到循環(huán)開始之處執(zhí)行轉(zhuǎn)到循環(huán)開始之處執(zhí)行(4 4)循環(huán)語句()循環(huán)語句(WHILEWHIL
16、E)T-SQL編程基礎(chǔ)編程基礎(chǔ) 流程控制語句流程控制語句USEUSE 教學(xué)成績管理數(shù)據(jù)庫教學(xué)成績管理數(shù)據(jù)庫GOGOSET NOCOUNT ONSET NOCOUNT ONSELECTSELECT 學(xué)號學(xué)號, ,分?jǐn)?shù)分?jǐn)?shù) INTOINTO #CJB #CJB FROMFROM 教學(xué)成績表教學(xué)成績表 WHEREWHERE 課程編號課程編號=900002=900002DECLAREDECLARE n int n intWHILEWHILE(1=1) (1=1) BEGINBEGIN SELECTSELECT n=COUNT( n=COUNT(* *) ) FROMFROM #CJB #CJB WHE
17、REWHERE 分?jǐn)?shù)分?jǐn)?shù)60 AND 55 55 IFIF (n0) (n0) UPDATEUPDATE #CJB #CJB SETSET 分?jǐn)?shù)分?jǐn)?shù)= =分?jǐn)?shù)分?jǐn)?shù)+5 +5 WHEREWHERE 分?jǐn)?shù)分?jǐn)?shù)9595 ELSEELSE BREAKBREAK ENDENDSELECTSELECT * * FROMFROM #CJB #CJB ORDER BYORDER BY 分?jǐn)?shù)分?jǐn)?shù)GOGO 編寫編寫存儲過程存儲過程、自定義函數(shù)自定義函數(shù)和和觸發(fā)器觸發(fā)器是是SQL Server程序設(shè)計(jì)的靈魂,應(yīng)用好它程序設(shè)計(jì)的靈魂,應(yīng)用好它們,將使數(shù)據(jù)庫的管理和應(yīng)用更加方便和們,將使數(shù)據(jù)庫的管理和應(yīng)用更加方便和靈活
18、。靈活。存儲過程,觸發(fā)器和函數(shù)存儲過程,觸發(fā)器和函數(shù)v T-SQL編程基礎(chǔ)編程基礎(chǔ)v 存儲過程存儲過程v 觸發(fā)器觸發(fā)器v 自定義函數(shù)自定義函數(shù)v 小小 結(jié)結(jié)在數(shù)據(jù)庫實(shí)際應(yīng)用中,存在有帶變量數(shù)據(jù)在數(shù)據(jù)庫實(shí)際應(yīng)用中,存在有帶變量數(shù)據(jù)處理需求,如:處理需求,如:某班學(xué)生信息表某班學(xué)生信息表、某老師帶過某老師帶過的學(xué)生的學(xué)生、某班某門課不及格學(xué)生某班某門課不及格學(xué)生等。如何更好等。如何更好實(shí)現(xiàn)這樣的應(yīng)用功能?實(shí)現(xiàn)這樣的應(yīng)用功能?可采用可采用SQL Server中應(yīng)用最廣泛、最靈活的中應(yīng)用最廣泛、最靈活的存儲過程技術(shù)存儲過程技術(shù)來實(shí)現(xiàn)。來實(shí)現(xiàn)。存儲過程存儲過程 存儲過程存儲過程是存儲在是存儲在SQL S
19、erverSQL Server服務(wù)器中的一組服務(wù)器中的一組預(yù)編譯預(yù)編譯的的T-SQLT-SQL語句語句 ,用于完成某項(xiàng)任務(wù)。,用于完成某項(xiàng)任務(wù)。 存儲過程是一個獨(dú)立的存儲過程是一個獨(dú)立的數(shù)據(jù)庫對象數(shù)據(jù)庫對象,可被應(yīng)用,可被應(yīng)用程序調(diào)用,以減少重復(fù)編寫代碼。程序調(diào)用,以減少重復(fù)編寫代碼。SQL ServerSQL Server系統(tǒng)系統(tǒng)為用戶提供一組實(shí)用的為用戶提供一組實(shí)用的系統(tǒng)存儲過程系統(tǒng)存儲過程,同時支持用,同時支持用戶戶自定義的存儲過程自定義的存儲過程。 存儲過程存儲過程存儲過程存儲過程 由系統(tǒng)提供,用以管理和顯示有關(guān)數(shù)據(jù)庫和用戶的由系統(tǒng)提供,用以管理和顯示有關(guān)數(shù)據(jù)庫和用戶的信息。存儲在信息
20、。存儲在mastermaster數(shù)據(jù)庫中并數(shù)據(jù)庫中并以以sp_sp_為前綴為前綴,在任何,在任何數(shù)據(jù)庫中都可以調(diào)用。數(shù)據(jù)庫中都可以調(diào)用。 存放在存放在用戶數(shù)據(jù)庫用戶數(shù)據(jù)庫中以中以dt_dt_為前綴的存儲過程也是為前綴的存儲過程也是一種系統(tǒng)存儲過程。一種系統(tǒng)存儲過程。 這類存儲過程一般在用戶創(chuàng)建數(shù)這類存儲過程一般在用戶創(chuàng)建數(shù)據(jù)庫時由系統(tǒng)自動生成,主要用于處理用戶數(shù)據(jù)庫中系據(jù)庫時由系統(tǒng)自動生成,主要用于處理用戶數(shù)據(jù)庫中系統(tǒng)自動生成的一些系統(tǒng)表,起到實(shí)時維護(hù)的作用統(tǒng)自動生成的一些系統(tǒng)表,起到實(shí)時維護(hù)的作用 系統(tǒng)存儲過程系統(tǒng)存儲過程存儲過程存儲過程v 以sp_為前綴的系統(tǒng)存儲過程存儲過程存儲過程v 以
21、dt_為前綴的系統(tǒng)存儲過程存儲過程存儲過程存儲過程的概念 用戶自定義存儲過程用戶自定義存儲過程由數(shù)據(jù)庫開發(fā)人員或管理員編寫的完成特定任務(wù)的存由數(shù)據(jù)庫開發(fā)人員或管理員編寫的完成特定任務(wù)的存儲過程,存儲在創(chuàng)建時的數(shù)據(jù)庫中。儲過程,存儲在創(chuàng)建時的數(shù)據(jù)庫中。我們將重點(diǎn)學(xué)習(xí)自定義存儲過程的創(chuàng)建和使用方法。我們將重點(diǎn)學(xué)習(xí)自定義存儲過程的創(chuàng)建和使用方法。存儲過程-單個 SELECT 語句SELECT 語句塊可以包含可以包含SELECT語句與邏輯控制語句存儲過程中的語句存儲過程中的語句 存儲過程存儲過程 創(chuàng)建存儲過程(創(chuàng)建存儲過程(SSMSSSMS)存儲過程存儲過程創(chuàng)建存儲過程的模板,只需創(chuàng)建存儲過程的模板,
22、只需修改相應(yīng)的參數(shù)就可創(chuàng)建存修改相應(yīng)的參數(shù)就可創(chuàng)建存儲過程儲過程存儲過程存儲過程 創(chuàng)建存儲過程(創(chuàng)建存儲過程(SSMSSSMS) 創(chuàng)建存儲過程(創(chuàng)建存儲過程(T-SQLT-SQL語句)語句)CREATE PROCDURECREATE PROCDURE 存儲過程名存儲過程名 參數(shù)參數(shù) 參數(shù)的數(shù)據(jù)類型參數(shù)的數(shù)據(jù)類型 = =默認(rèn)值默認(rèn)值 OUTPUTOUTPUT ,.n ,.nASAS 任意數(shù)量的任意數(shù)量的T-SQLT-SQL 語句語句 FCREATE PROCEDURE CREATE PROCEDURE 語句中可以聲明一個或多個變量作為參數(shù)語句中可以聲明一個或多個變量作為參數(shù) 參數(shù)分兩種:參數(shù)分兩
23、種:u輸入?yún)?shù)輸入?yún)?shù): :用來向存儲過程中傳入值,執(zhí)行存儲過程時必須用來向存儲過程中傳入值,執(zhí)行存儲過程時必須提供參數(shù)的值,除非定義了參數(shù)的默認(rèn)值。提供參數(shù)的值,除非定義了參數(shù)的默認(rèn)值。 u輸出參數(shù)輸出參數(shù): :由由“ OUTPUT OUTPUT ”標(biāo)記,存放存儲過程執(zhí)行后的返回標(biāo)記,存放存儲過程執(zhí)行后的返回值并提供給調(diào)用者使用。值并提供給調(diào)用者使用。存儲過程存儲過程 創(chuàng)建不帶參數(shù)的存儲過程創(chuàng)建不帶參數(shù)的存儲過程示例:示例:查詢計(jì)算機(jī)系學(xué)生的考試成績,列出學(xué)查詢計(jì)算機(jī)系學(xué)生的考試成績,列出學(xué)生的姓名、課程名和成績生的姓名、課程名和成績。CREATE PROCEDURE student_gra
24、de1AS SELECT Sname, Cname,Grade FROM s,sc,c WHERE s.sno = sc.sno and o = o and Sdept = 計(jì)算機(jī)系計(jì)算機(jī)系 存儲過程存儲過程存儲過程存儲過程存儲過程的執(zhí)行(存儲過程的執(zhí)行(SSMSSSMS) EXECEXEC UTEUTE 存儲過程名存儲過程名 參數(shù)參數(shù)1 1,參數(shù),參數(shù)n n 如果存儲過程是如果存儲過程是批處理中的第一批處理中的第一條語句,該關(guān)鍵條語句,該關(guān)鍵字可省略。字可省略。存儲過程的執(zhí)行(存儲過程的執(zhí)行(T-SQL)T-SQL)存儲過程存儲過程查詢某個指定系學(xué)生的考試情況,列出學(xué)生的姓查詢某個指定系學(xué)生
25、的考試情況,列出學(xué)生的姓名、所在系、課程名和考試成績。名、所在系、課程名和考試成績。CREATE PROCEDURE student_grade2 dept char(20)AS SELECT Sname,Sdept,Cname,Grade FROM s,sc,c WHERE s.sno = sc.sno and o = o and Sdept = dept 創(chuàng)建帶創(chuàng)建帶輸入?yún)?shù)輸入?yún)?shù)的存儲過程的存儲過程存儲過程存儲過程示例:示例:查詢某個學(xué)生某門課程的考試成績,列出學(xué)生查詢某個學(xué)生某門課程的考試成績,列出學(xué)生的姓名、課程名和成績。的姓名、課程名和成績。CREATE PROCEDURE st
26、udent_grade2 s_name char(10), c_name char(20) AS SELECT Sname, Cname, Grade FROM s,sc,c WHERE s.sno = sc.sno and o = o and sname = s_name and cname = c_name 創(chuàng)建帶多個輸入?yún)?shù)的存儲過程創(chuàng)建帶多個輸入?yún)?shù)的存儲過程 存儲過程存儲過程參數(shù)的傳遞方式參數(shù)的傳遞方式 v按參數(shù)位置傳遞值 EXEC student_grade2 劉晨, 數(shù)學(xué) v按參數(shù)名傳遞值 EXEC Student_grade2 student_name = 劉晨, course
27、_name=數(shù)學(xué) 示例:示例:查詢某個學(xué)生某門課程的考試成績,若沒有查詢某個學(xué)生某門課程的考試成績,若沒有指定課程,則默認(rèn)課程為指定課程,則默認(rèn)課程為“數(shù)據(jù)庫數(shù)據(jù)庫”。CREATE PROCEDURE student_grade2 s_name char(10), c_name char(20)=數(shù)據(jù)庫數(shù)據(jù)庫AS SELECT Sname, Cname, Grade FROM s,sc,c WHERE s.sno = sc.sno and o = o and sname = s_name and cname = c_name 創(chuàng)建帶多個輸入?yún)?shù)并有默認(rèn)值的存儲過程創(chuàng)建帶多個輸入?yún)?shù)并有默認(rèn)值的
28、存儲過程 存儲過程存儲過程調(diào)用參數(shù)有默認(rèn)值的存儲過程調(diào)用參數(shù)有默認(rèn)值的存儲過程EXEC student_grade2 李勇v 等價于執(zhí)行:EXEC student_grade2 李勇, 數(shù)據(jù)庫 創(chuàng)建帶輸入?yún)?shù)和一個輸出參數(shù)的存儲過程創(chuàng)建帶輸入?yún)?shù)和一個輸出參數(shù)的存儲過程 v 統(tǒng)計(jì)指定課程的平均成績,并將統(tǒng)計(jì)的結(jié)果用輸出參數(shù)返回。CREATE PROCEDURE AvgGrade cn char(20), avg_grade int outputAS SELECT avg_grade = AVG(Grade) FROM SC,C WHERE C.Cno = SC.Cno and Cname =
29、cn 執(zhí)行存儲過程v declare avg_grade int v exec AvgGrade 數(shù)據(jù)庫,avg_grade outputv select avg_grade 平均成績創(chuàng)建帶輸入?yún)?shù)和多個輸出參數(shù)的存儲過程創(chuàng)建帶輸入?yún)?shù)和多個輸出參數(shù)的存儲過程 v 統(tǒng)計(jì)指定課程的平均成績和選課人數(shù),將統(tǒng)計(jì)的結(jié)果用輸出參數(shù)返回。CREATE PROCEDURE Avg_Count cn char(20), avg_grade int output, total int outputAS SELECT avg_grade = AVG(Grade), total = COUNT(*) FROM SC
30、 ,C WHERE C.Cno = SC.Cno and Cname = cn 執(zhí)行存儲過程:v declare avg_grade int, total intv exec Avg_Count 數(shù)學(xué),avg_grade output,total outputv select avg_grade 平均成績,total 選課人數(shù)存儲過程的執(zhí)行F 要使用輸出參數(shù),必須在要使用輸出參數(shù),必須在CREATE PRODECURECREATE PRODECURE 語語句和句和EXECUTEEXECUTE語句中指定語句中指定OUTPUTOUTPUT關(guān)鍵字。在執(zhí)行存關(guān)鍵字。在執(zhí)行存儲過程時,如果忽略儲過程時,
31、如果忽略O(shè)UTPUTOUTPUT關(guān)鍵字,存儲過程仍然關(guān)鍵字,存儲過程仍然會執(zhí)行但不返回值會執(zhí)行但不返回值創(chuàng)建刪除數(shù)據(jù)的存儲過程創(chuàng)建刪除數(shù)據(jù)的存儲過程 v刪除考試成績不及格學(xué)生的修課記錄。CREATE PROCEDURE p_DeleteSCASDELETE FROM sc WHERE grade 60 創(chuàng)建修改數(shù)據(jù)的存儲過程創(chuàng)建修改數(shù)據(jù)的存儲過程 v將指定課程的學(xué)分增加2分。CREATE PROCEDURE p_UpdateCredit cn varchar(20)AS UPDATE course SET credit=credit+2 WHERE cname = cn 存儲過程存儲過程存儲過
32、程的修改(存儲過程的修改(SSMS)SSMS)ALTER PROCDUREALTER PROCDURE 存儲過程名存儲過程名 參數(shù)參數(shù) 參數(shù)的數(shù)據(jù)類型參數(shù)的數(shù)據(jù)類型 = =默認(rèn)值默認(rèn)值 OUTPUT ,.n OUTPUT ,.nAS AS 任意數(shù)量的任意數(shù)量的T-SQLT-SQL 語句語句 存儲過程存儲過程存儲過程的修改(存儲過程的修改(T-SQL)T-SQL)存儲過程存儲過程存儲過程的刪除(存儲過程的刪除(SSMS)SSMS)示例示例: :刪除刪除 補(bǔ)課表補(bǔ)課表 存儲過程。存儲過程。 USE USE 教學(xué)成績管理數(shù)據(jù)庫教學(xué)成績管理數(shù)據(jù)庫 GO GO DROP PROC DROP PROC 補(bǔ)
33、考表補(bǔ)考表DROP DROP PROCPROC EDUREEDURE 存儲過程存儲過程名名 ,. ,. 存儲過程存儲過程存儲過程的修改(存儲過程的修改(T-SQL)T-SQL)一旦創(chuàng)建并存儲后可被任意一旦創(chuàng)建并存儲后可被任意多次調(diào)用多次調(diào)用,支持程序,支持程序模塊模塊化化的設(shè)計(jì)。的設(shè)計(jì)。 第一次被調(diào)用后就駐留內(nèi)存,再次調(diào)用時不再需要編第一次被調(diào)用后就駐留內(nèi)存,再次調(diào)用時不再需要編譯,譯,執(zhí)行速率較高執(zhí)行速率較高 。存儲過程存儲過程存儲在后端數(shù)據(jù)庫存儲在后端數(shù)據(jù)庫中不需要通過網(wǎng)絡(luò)傳輸,中不需要通過網(wǎng)絡(luò)傳輸,可可減少網(wǎng)絡(luò)流量減少網(wǎng)絡(luò)流量 。即使對于沒有直接執(zhí)行存儲過程中語句權(quán)限的用戶,即使對于沒有
34、直接執(zhí)行存儲過程中語句權(quán)限的用戶,也可授予他執(zhí)行該存儲過程的權(quán)限,可作為也可授予他執(zhí)行該存儲過程的權(quán)限,可作為安全機(jī)制安全機(jī)制使用使用 。 存儲過程的優(yōu)點(diǎn)存儲過程的優(yōu)點(diǎn): :存儲過程存儲過程增加復(fù)雜性增加復(fù)雜性。當(dāng)業(yè)務(wù)邏輯比較復(fù)雜時不建議使用存儲。當(dāng)業(yè)務(wù)邏輯比較復(fù)雜時不建議使用存儲過程,這樣會增加復(fù)雜性。過程,這樣會增加復(fù)雜性??梢浦残缘涂梢浦残缘汀#ú煌臄?shù)據(jù)庫系統(tǒng))。(不同的數(shù)據(jù)庫系統(tǒng)) 存儲過程的缺點(diǎn)存儲過程的缺點(diǎn): :存儲過程存儲過程存儲過程,觸發(fā)器和函數(shù)存儲過程,觸發(fā)器和函數(shù)v T-SQL編程基礎(chǔ)編程基礎(chǔ)v 存儲過程存儲過程v 觸發(fā)器觸發(fā)器v 自定義函數(shù)自定義函數(shù)v 小結(jié)小結(jié) 觸發(fā)器
35、觸發(fā)器是特殊類型的存儲過程,主要由操作事是特殊類型的存儲過程,主要由操作事件件( (INSERTINSERT、UPDATEUPDATE、DELETEDELETE) ) 觸發(fā)而被自動執(zhí)行。觸發(fā)而被自動執(zhí)行。 觸發(fā)器可以實(shí)現(xiàn)比約束更復(fù)雜的數(shù)據(jù)完整性觸發(fā)器可以實(shí)現(xiàn)比約束更復(fù)雜的數(shù)據(jù)完整性,經(jīng)常用于經(jīng)常用于加強(qiáng)加強(qiáng)數(shù)據(jù)的數(shù)據(jù)的完整性約束完整性約束和和業(yè)務(wù)規(guī)則業(yè)務(wù)規(guī)則。 觸發(fā)器本身是一個特殊的觸發(fā)器本身是一個特殊的事務(wù)單位事務(wù)單位。 觸發(fā)器觸發(fā)器觸發(fā)器觸發(fā)器u 與表相關(guān)聯(lián)與表相關(guān)聯(lián):必須定義在表上。:必須定義在表上。 u 自動觸發(fā)自動觸發(fā):由:由INSERTINSERT、DELETEDELETE、UPD
36、ATEUPDATE操作觸發(fā)操作觸發(fā)u 不能直接調(diào)用,也不能傳遞或接受參數(shù)不能直接調(diào)用,也不能傳遞或接受參數(shù)u 是事務(wù)的一部分是事務(wù)的一部分:觸發(fā)器和觸發(fā)語句作為可在觸:觸發(fā)器和觸發(fā)語句作為可在觸 發(fā)器內(nèi)回滾的單個事務(wù)。發(fā)器內(nèi)回滾的單個事務(wù)。 觸發(fā)器的特點(diǎn)觸發(fā)器的特點(diǎn)觸發(fā)器觸發(fā)器u 按觸發(fā)時刻分按觸發(fā)時刻分- AFTERAFTER觸發(fā)器:執(zhí)行觸發(fā)操作和處理完約束后激發(fā),觸發(fā)器:執(zhí)行觸發(fā)操作和處理完約束后激發(fā), 只能定義于表上,同一個表上可定義多個。只能定義于表上,同一個表上可定義多個。- INSTEADINSTEAD觸發(fā)器:由觸發(fā)器的程序代替觸發(fā)語句的執(zhí)行,在處觸發(fā)器:由觸發(fā)器的程序代替觸發(fā)語句
37、的執(zhí)行,在處 理約束之前激發(fā),可在表或視圖上創(chuàng)建,同理約束之前激發(fā),可在表或視圖上創(chuàng)建,同 一個表或視圖只可定義一個。一個表或視圖只可定義一個。u 按觸發(fā)語句分按觸發(fā)語句分- INSERTINSERT觸發(fā)器、觸發(fā)器、 UPDATEUPDATE觸發(fā)器、觸發(fā)器、 DELETEDELETE觸發(fā)器觸發(fā)器 觸發(fā)器的類型觸發(fā)器的類型觸發(fā)器觸發(fā)器 觸發(fā)器觸發(fā)器被被觸發(fā)時觸發(fā)時,系統(tǒng)自動在內(nèi)存中創(chuàng)建系統(tǒng)自動在內(nèi)存中創(chuàng)建deleteddeleted表表或或insertedinserted表表。只讀,不允許修改只讀,不允許修改;觸發(fā)器執(zhí)行完成后,觸發(fā)器執(zhí)行完成后,自動刪除自動刪除。 insertedinserte
38、d表表 和和 deleted deleted 表表觸發(fā)器觸發(fā)器修改操作修改操作inserted表表deleted表表增加增加(INSERT)(INSERT)記錄記錄存放新增的記錄存放新增的記錄-刪除刪除(DELETE)(DELETE)記錄記錄-存放被刪除的記錄存放被刪除的記錄修改修改(UPDATE)(UPDATE)記錄記錄存放更新后的記錄存放更新后的記錄存放更新前的記錄存放更新前的記錄DeletedDeleted表和表和InsertedInserted表表在對具有觸發(fā)器的表(觸發(fā)器表)進(jìn)行操作時,其操作過程:v 執(zhí)行INSERT操作,插入到觸發(fā)器表中的新行被自動的插入到Inserted 表中。
39、v 執(zhí)行DELETE操作,從觸發(fā)器表中刪除的行被自動的插入到Deleted 表中。v 執(zhí)行UPDATE操作,先從觸發(fā)器表中刪除舊行,然后再插入新行。其中被刪除的舊行被插入到Deleted 表中,插入的新行被插入到Inserted 表中。 觸發(fā)器觸發(fā)器 觸發(fā)器的創(chuàng)建(觸發(fā)器的創(chuàng)建(SSMSSSMS)創(chuàng)建觸發(fā)器的模板,只需修改創(chuàng)建觸發(fā)器的模板,只需修改相應(yīng)的參數(shù)就可創(chuàng)建觸發(fā)器相應(yīng)的參數(shù)就可創(chuàng)建觸發(fā)器CREATE TRIGGERCREATE TRIGGER 觸發(fā)器名觸發(fā)器名ONON 表名或視圖名表名或視圖名 FORFOR | | AFTERAFTER | | INSTEAD OFINSTEAD OF
40、 INSERTINSERT , , UPDATEUPDATE , , DELETEDELETEAS AS IF UPDATEIF UPDATE( (列名列名1) 1) ANDAND| |OROR UPDATEUPDATE( (列名列名2)2) .n .n SQL SQL語句語句觸發(fā)器觸發(fā)器 觸發(fā)器的創(chuàng)建(觸發(fā)器的創(chuàng)建(T-SQLT-SQL)F 主要參數(shù)說明主要參數(shù)說明u AFTERAFTER: :執(zhí)行指定操作語句和處理完約束后激發(fā)觸發(fā)器。執(zhí)行指定操作語句和處理完約束后激發(fā)觸發(fā)器。u FORFOR: :如果僅指定如果僅指定 FOR FOR 關(guān)鍵字,則關(guān)鍵字,則 AFTER AFTER 是默認(rèn)設(shè)置
41、。是默認(rèn)設(shè)置。u INSTEAD OFINSTEAD OF: :指定語句激發(fā)觸發(fā)器并被代替執(zhí)行。指定語句激發(fā)觸發(fā)器并被代替執(zhí)行。u DELETEDELETE、INSERTINSERT、UPDATEUPDATE:指定激活觸發(fā)器的數(shù)據(jù)修改:指定激活觸發(fā)器的數(shù)據(jù)修改語句,必須至少指定一個選項(xiàng),若指定的選項(xiàng)多于一個,語句,必須至少指定一個選項(xiàng),若指定的選項(xiàng)多于一個,需用逗號分隔這些選項(xiàng)。需用逗號分隔這些選項(xiàng)。u ASAS:指定觸發(fā)器要執(zhí)行的操作。:指定觸發(fā)器要執(zhí)行的操作。u IF UPDATEIF UPDATE( (列名列名1) 1) ANDAND| |OROR UPDATEUPDATE( (列名列名
42、2)2): :指定何指定何列數(shù)據(jù)修改時激發(fā)觸發(fā)器。不能用于列數(shù)據(jù)修改時激發(fā)觸發(fā)器。不能用于DELETEDELETE語句。語句。觸發(fā)器觸發(fā)器F 創(chuàng)建觸發(fā)器時需要指定如下內(nèi)容創(chuàng)建觸發(fā)器時需要指定如下內(nèi)容: :u 觸發(fā)器名稱:觸發(fā)器名。觸發(fā)器名稱:觸發(fā)器名。u 何處觸發(fā):表名或視圖名。何處觸發(fā):表名或視圖名。u 何時激發(fā):何時激發(fā):FOR|AFTER |INSTEAD OF FOR|AFTER |INSTEAD OF 。u 何種數(shù)據(jù)修改語句觸發(fā):何種數(shù)據(jù)修改語句觸發(fā):INSERT|UPDATE|DELETE INSERT|UPDATE|DELETE 。u 何列數(shù)據(jù)修改時觸發(fā)何列數(shù)據(jù)修改時觸發(fā): IF
43、 UPDATE(: IF UPDATE(列名)列名)u 如何觸發(fā):如何觸發(fā):SQLSQL語句指定觸發(fā)器觸發(fā)時所作的操作。語句指定觸發(fā)器觸發(fā)時所作的操作。觸發(fā)器觸發(fā)器定義觸發(fā)器定義觸發(fā)器例1:在S表創(chuàng)建UPDATE觸發(fā)器Create trigger t1_son sfor update as print the table s was updated例2 創(chuàng)建觸發(fā)器,實(shí)現(xiàn)如下約束: 當(dāng)刪除S表中學(xué)生信息時,級聯(lián)刪除相應(yīng)的選課信息。更具通用性的觸發(fā)器更具通用性的觸發(fā)器CREATE TRIGGER S_del_trigger ON student FOR DELETE AS DELETE FROM
44、sc WHERE sc.Sno in (select sno from deleted) CREATE TRIGGER S_del_trigger ON student FOR DELETE AS declare sno char(8)Select sno =deleted.sno from deleted DELETE FROM sc WHERE sc.Sno =sno定義觸發(fā)器定義觸發(fā)器例3定義一個觸發(fā)器,實(shí)現(xiàn)教師工資表sal_Teach中的以下約束: “教授的實(shí)發(fā)工資不得低于4000元,如果低于4000元,自動改為4000元”。方法一:create trigger t1 on sal_t
45、eachafter insert,updateas declare sal float,job char(8),eno char(4)select eno=eno,sal=sal,job=job from inserted if sal4000 and job=教授 update sal_teach set sal=4000 where eno=eno1.3 1.3 定義觸發(fā)器定義觸發(fā)器方法二:create trigger t2 on sal_teachfor insert,updateas update sal_teach set sal=4000 from sal_teach,insert
46、ed where inserted.eno= sal_teach.eno and sal_teach.Job=教授 and sal_teach.sal4000刪除觸發(fā)器定義刪除觸發(fā)器定義v通過使用DROP TRIGGER語句,即可從當(dāng)前數(shù)據(jù)庫表中刪除觸發(fā)器。 vDROP TRIGGER語句的命令格式為: DROP TRIGGER 觸發(fā)器名 查看觸發(fā)器查看觸發(fā)器v若要查看某一特定表上現(xiàn)有的觸發(fā)器,使用存儲過程:sp_helptrigger 數(shù)據(jù)表名v若要查看已經(jīng)建好的觸發(fā)器代碼。使用存儲過程:sp_helptext 觸發(fā)器名, 修改觸發(fā)器(修改觸發(fā)器(SSMSSSMS)觸發(fā)器觸發(fā)器 修改觸發(fā)器(
47、修改觸發(fā)器(T-SQLT-SQL) ALTER TRIGGERALTER TRIGGER 觸發(fā)器名觸發(fā)器名ONON 表名或視圖名表名或視圖名 FORFOR | | AFTERAFTER | | INSTEAD OFINSTEAD OF INSERTINSERT , , UPDATEUPDATE , , DELETEDELETEASAS IF UPDATEIF UPDATE( (列名列名1) 1) ANDAND| |OROR UPDATEUPDATE( (列名列名2)2) .n .n SQLSQL語句語句觸發(fā)器觸發(fā)器 禁用或啟用觸發(fā)器(禁用或啟用觸發(fā)器(SSMSSSMS)觸發(fā)器觸發(fā)器ALTER
48、TABLEALTER TABLE 表名表名 ENABLEENABLE | | DISABLEDISABLE TRIGGERTRIGGER ALL ALL | | 觸發(fā)器名觸發(fā)器名,n n 禁用或啟用觸發(fā)器(禁用或啟用觸發(fā)器(T-SQLT-SQL)觸發(fā)器觸發(fā)器 刪除觸發(fā)器(刪除觸發(fā)器(SSMSSSMS)觸發(fā)器觸發(fā)器F 如果刪除表,則表中所有的觸發(fā)器將被自動刪除。如果刪除表,則表中所有的觸發(fā)器將被自動刪除。 DROP TRIGGERDROP TRIGGER 觸發(fā)器名觸發(fā)器名 刪除觸發(fā)器(刪除觸發(fā)器(T-SQLT-SQL)觸發(fā)器觸發(fā)器F 觸發(fā)器使用限制觸發(fā)器使用限制: :u CREATE TRIGG
49、ER CREATE TRIGGER 必須是必須是批處理中的第一條語句批處理中的第一條語句。 u 在同一個表中約束的執(zhí)行優(yōu)先于觸發(fā)器,若在操作中觸發(fā)器在同一個表中約束的執(zhí)行優(yōu)先于觸發(fā)器,若在操作中觸發(fā)器與約束發(fā)生沖突,觸發(fā)器將不執(zhí)行。與約束發(fā)生沖突,觸發(fā)器將不執(zhí)行。u 不能在臨時表上建立觸發(fā)器,但是在觸發(fā)器定義中可以引用不能在臨時表上建立觸發(fā)器,但是在觸發(fā)器定義中可以引用臨時表。臨時表。u 觸發(fā)器中不允許以下觸發(fā)器中不允許以下 T-SQL T-SQL 語句:語句:ALTER DATABASEALTER DATABASECREATE DATABASECREATE DATABASEDISK INIT
50、DISK INITDISK RESIZEDISK RESIZEDROP DATABASEDROP DATABASELOAD DATABASELOAD DATABASELOAD LOGLOAD LOGRECONFIGURERECONFIGURERESTORE DATABASERESTORE DATABASERESTORE LOGRESTORE LOG觸發(fā)器觸發(fā)器存儲過程,觸發(fā)器和函數(shù)存儲過程,觸發(fā)器和函數(shù)v T-SQL編程基礎(chǔ)編程基礎(chǔ)v 存儲過程存儲過程v 觸發(fā)器觸發(fā)器v 自定義函數(shù)自定義函數(shù)v 小結(jié)小結(jié) 函數(shù)函數(shù)是由一個或多個是由一個或多個 Transact-SQL Transact-SQL
51、語句組成的子語句組成的子程序,可用于封裝代碼以便重復(fù)使用。程序,可用于封裝代碼以便重復(fù)使用。 在在SQL ServerSQL Server中,除了系統(tǒng)內(nèi)置的函數(shù)外,用戶還中,除了系統(tǒng)內(nèi)置的函數(shù)外,用戶還可以可以自定義函數(shù)自定義函數(shù),用以補(bǔ)充和擴(kuò)展系統(tǒng)支持的內(nèi)置函數(shù)。,用以補(bǔ)充和擴(kuò)展系統(tǒng)支持的內(nèi)置函數(shù)。 函數(shù)必須有返回值,根據(jù)函數(shù)返回值形式的不同,函數(shù)必須有返回值,根據(jù)函數(shù)返回值形式的不同,自定義函數(shù)分為:自定義函數(shù)分為:標(biāo)量值函數(shù)標(biāo)量值函數(shù)、內(nèi)聯(lián)表值函數(shù)內(nèi)聯(lián)表值函數(shù)、多語句多語句表值函數(shù)表值函數(shù)三種三種 關(guān)于自定義函數(shù)關(guān)于自定義函數(shù)自定義函數(shù)自定義函數(shù) 標(biāo)量值函數(shù)標(biāo)量值函數(shù)返回一個返回一個確定
52、類型的標(biāo)量值確定類型的標(biāo)量值,其返,其返回值類型為回值類型為除除TEXTTEXT、 NTEXTNTEXT、 IMAGEIMAGE、CURSORCURSOR、 TIMESTAMP TIMESTAMP 和和TABLE TABLE 類型外的其它數(shù)據(jù)類型。類型外的其它數(shù)據(jù)類型。 函數(shù)體語句定義在函數(shù)體語句定義在BEGIN-ENDBEGIN-END語句內(nèi),其中包語句內(nèi),其中包含了可以返回值的含了可以返回值的T-SQL T-SQL 命令。命令。(1 1)標(biāo)量值函數(shù))標(biāo)量值函數(shù)自定義函數(shù)自定義函數(shù) 關(guān)于自定義函數(shù)關(guān)于自定義函數(shù) 內(nèi)聯(lián)表值函數(shù)內(nèi)聯(lián)表值函數(shù)的返回值是一個的返回值是一個表表。 內(nèi)聯(lián)表值函數(shù)內(nèi)聯(lián)表值
53、函數(shù)沒有沒有由由BEGIN-END BEGIN-END 語句括起來的函語句括起來的函數(shù)體,只有數(shù)體,只有一個一個 SELECT SELECT 語句語句。其返回的表位于。其返回的表位于RETURNRETURN 子句中的子句中的SELECTSELECT 語句從數(shù)據(jù)庫中篩選出來。語句從數(shù)據(jù)庫中篩選出來。 內(nèi)聯(lián)表值函數(shù)功能相當(dāng)于一個內(nèi)聯(lián)表值函數(shù)功能相當(dāng)于一個參數(shù)化的視圖參數(shù)化的視圖。 自定義函數(shù)自定義函數(shù)(1 1)內(nèi)聯(lián)表值函數(shù))內(nèi)聯(lián)表值函數(shù) 關(guān)于自定義函數(shù)關(guān)于自定義函數(shù) 是標(biāo)量型和內(nèi)聯(lián)表值型函數(shù)的結(jié)合體。它的返是標(biāo)量型和內(nèi)聯(lián)表值型函數(shù)的結(jié)合體。它的返回值是一個回值是一個表表,但它和標(biāo)量型函數(shù)一樣有一個
54、用,但它和標(biāo)量型函數(shù)一樣有一個用BEGIN-ENDBEGIN-END 語句括起來的函數(shù)體,返回值的表數(shù)據(jù)語句括起來的函數(shù)體,返回值的表數(shù)據(jù)是由函數(shù)體中的語句插入的。是由函數(shù)體中的語句插入的。 它可以進(jìn)行它可以進(jìn)行多次查詢多次查詢,對數(shù)據(jù)進(jìn)行,對數(shù)據(jù)進(jìn)行多次篩選與多次篩選與合并合并,彌補(bǔ)了內(nèi)聯(lián)表值型函數(shù)的不足。,彌補(bǔ)了內(nèi)聯(lián)表值型函數(shù)的不足。 (1 1)多語句表值函數(shù))多語句表值函數(shù)自定義函數(shù)自定義函數(shù) 關(guān)于自定義函數(shù)關(guān)于自定義函數(shù) 創(chuàng)建函數(shù)(創(chuàng)建函數(shù)(SSMSSSMS)自定義函數(shù)自定義函數(shù)創(chuàng)建函數(shù)的模創(chuàng)建函數(shù)的模板,只需修改板,只需修改相應(yīng)的參數(shù)就相應(yīng)的參數(shù)就可創(chuàng)建自定義可創(chuàng)建自定義函數(shù)函數(shù)格式
55、格式1 1: CREATE FUNCTIONCREATE FUNCTION 所有者所有者.自定義函數(shù)名自定義函數(shù)名(參數(shù)參數(shù)n) n) RETURNSRETURNS 返回參數(shù)的類型返回參數(shù)的類型 AS AS BEGINBEGIN 函數(shù)體函數(shù)體 RETURN RETURN 函數(shù)返回的標(biāo)量值函數(shù)返回的標(biāo)量值END END F 該語法格式用于創(chuàng)建標(biāo)量值函數(shù);該語法格式用于創(chuàng)建標(biāo)量值函數(shù);F RETURNRETURN子句返回單個數(shù)據(jù)值,如同使用系統(tǒng)內(nèi)置的函數(shù)一樣。子句返回單個數(shù)據(jù)值,如同使用系統(tǒng)內(nèi)置的函數(shù)一樣。 創(chuàng)建函數(shù)(創(chuàng)建函數(shù)(T-SQLT-SQL)自定義函數(shù)自定義函數(shù)示例:創(chuàng)建一個自定義函數(shù)示例
56、:創(chuàng)建一個自定義函數(shù)is_is_中文字符串中文字符串 ,判斷自變量是否,判斷自變量是否是純中文字符串,返回字符串:是純中文字符串,返回字符串:是是或或否否 。 CREATE FUNCTIONCREATE FUNCTION isis中文字符串中文字符串(字符串字符串 NCHARNCHAR(255)(255) RETURNSRETURNS NCHAR NCHAR(1) (1) ASAS BEGINBEGIN DECLARE DECLARE I I TINYINTTINYINT, J , J TINYINTTINYINT SET SET I= I=LENLEN(字符串字符串) ) SET SET J
57、=1 J=1 WHILE WHILE (J=I) (J=I) BEGINBEGIN IFIF ( (UNICODEUNICODE( (SUBSTRINGSUBSTRING(字符串字符串,J,1)256) ,J,1)256) RETURNRETURN 否否 SET SET J=J+1 J=J+1 ENDEND RETURNRETURN 是是 ENDEND自定義函數(shù)自定義函數(shù)格式格式2 2: CREATE FUNCTIONCREATE FUNCTION 所有者所有者.自定義函數(shù)名自定義函數(shù)名(參數(shù)參數(shù)n n RETURNS TABLE ASRETURNS TABLE AS RETURN RETUR
58、N ( SELECT ( SELECT 查詢語句查詢語句 ) )F 該語法格式用于創(chuàng)建表值函數(shù);該語法格式用于創(chuàng)建表值函數(shù);F 返回值是一個返回值是一個SelectSelect語句查詢結(jié)果的表。語句查詢結(jié)果的表。自定義函數(shù)自定義函數(shù) 創(chuàng)建函數(shù)(創(chuàng)建函數(shù)(T-SQLT-SQL)示例:創(chuàng)建一個自定義函數(shù):示例:創(chuàng)建一個自定義函數(shù): 某班某課不及格表某班某課不及格表 輸入?yún)?shù)班級輸入?yún)?shù)班級名稱和課程名稱,返回:表。名稱和課程名稱,返回:表。 CREATE FUNCTION CREATE FUNCTION 某班某課不及格表某班某課不及格表 (class VARCHAR(16),course VARC
59、HAR(50)(class VARCHAR(16),course VARCHAR(50) RETURNSRETURNS TABLETABLE ASAS RETURNRETURN ( ( SELECT SELECT 學(xué)號學(xué)號, ,姓名姓名, ,課程名稱課程名稱, ,分?jǐn)?shù)分?jǐn)?shù), ,學(xué)年學(xué)期學(xué)年學(xué)期, ,考試類別考試類別 FROMFROM 教學(xué)成績表視圖教學(xué)成績表視圖 WHERE WHERE 班級班級=class AND =class AND 課程名稱課程名稱=course AND =course AND 分?jǐn)?shù)分?jǐn)?shù)60)60)自定義函數(shù)自定義函數(shù)格式格式3 3: CREATE FUNCTIONCRE
60、ATE FUNCTION 所有者所有者.自定義函數(shù)名自定義函數(shù)名(參數(shù)參數(shù),n ,n RETURNSRETURNS 數(shù)據(jù)表名數(shù)據(jù)表名 TABLETABLE ( (列名列名 數(shù)據(jù)類型數(shù)據(jù)類型,n),n) ASAS BEGINBEGIN 有效的語句有效的語句 RETURNRETURN ENDENDF 該語法格式用于創(chuàng)建多語句表值函數(shù);該語法格式用于創(chuàng)建多語句表值函數(shù);F 返回值是一個表。返回值是一個表。自定義函數(shù)自定義函數(shù) 創(chuàng)建函數(shù)(創(chuàng)建函數(shù)(T-SQLT-SQL)F多語句表值函數(shù)的主體中有效的語句是:多語句表值函數(shù)的主體中有效的語句是: 賦值語句。賦值語句。 流程控制語句。流程控制語句。 DEC
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年金屬氫化物-鎳(MHNI)蓄電池項(xiàng)目發(fā)展計(jì)劃
- 嬰幼兒窒息的預(yù)防措施
- 教育驅(qū)動未來塑造
- 工業(yè)分析檢驗(yàn)?zāi)M練習(xí)題
- 2024-2025學(xué)年人教版高二化學(xué)選擇性必修3配套課件 基礎(chǔ)課時16 有機(jī)合成
- 微生物工程習(xí)題庫(含答案)
- 旅游景區(qū)快捷酒店
- 安保經(jīng)理競聘述職報(bào)告
- 信息服務(wù)中介合同范例
- 上海 勞動合同范例
- 全過程造價咨詢服務(wù)實(shí)施方案
- 實(shí)用參考從合規(guī)到績效:宋志平談央企學(xué)習(xí)型董事會建設(shè)
- GB/T 912-2008碳素結(jié)構(gòu)鋼和低合金結(jié)構(gòu)鋼熱軋薄鋼板和鋼帶
- GB/T 26480-2011閥門的檢驗(yàn)和試驗(yàn)
- 中共一大會址
- 云南省煙草買賣合同(標(biāo)準(zhǔn)版)
- 2023個人獨(dú)資企業(yè)清算報(bào)告(精選4篇)
- 衛(wèi)生統(tǒng)計(jì)學(xué)(全套課件)
- 2021年6月浙江省高考讀后續(xù)寫課件-高考英語復(fù)習(xí)備考
- 小學(xué)古詩詞80首(硬筆書法田字格)
-
評論
0/150
提交評論