版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章Transact-SQL程序設(shè)計(jì)
第10章Transact-SQL程序設(shè)計(jì)1本章內(nèi)容10.1Transact-SQL語(yǔ)言基礎(chǔ)10.2表達(dá)式10.3函數(shù)10.4流程控制語(yǔ)句10.5游標(biāo)本章內(nèi)容10.1Transact-SQL語(yǔ)言基礎(chǔ)210.1Transact-SQL語(yǔ)言基礎(chǔ)
10.1.1Transact-SQL語(yǔ)言的編程功能10.1.2標(biāo)識(shí)符10.1.3注釋10.1.4語(yǔ)句塊10.1Transact-SQL語(yǔ)言基礎(chǔ)10.1.1310.1.1Transact-SQL語(yǔ)言的編程功能Transact-SQL語(yǔ)言是在微軟公司的SQLServer中使用的編程語(yǔ)言,它是一個(gè)數(shù)據(jù)定義、操作和控制的語(yǔ)言。(1)基本功能支持ANSISQL-92標(biāo)準(zhǔn):DDL數(shù)據(jù)定義,DML數(shù)據(jù)操縱,DCL數(shù)據(jù)控制,DD數(shù)據(jù)字典。
(2)擴(kuò)展功能加入程序流程控制結(jié)構(gòu)。加入局部變量和系統(tǒng)變量等
10.1.1Transact-SQL語(yǔ)言的編程功能410.1.2標(biāo)識(shí)符10.1.2標(biāo)識(shí)符5(2)后續(xù)字符必須是符合Unicode2.0(統(tǒng)一碼)標(biāo)準(zhǔn)的字母,或者是十進(jìn)制數(shù)字,或是特殊字符@、#、_、$。(3)標(biāo)識(shí)符不能與任何SQLServer保留字匹配。標(biāo)識(shí)符不能包含空格或別的特殊字符。2.對(duì)象命名規(guī)則
所有數(shù)據(jù)庫(kù)對(duì)象的引用由下面四部分構(gòu)成:server_name.[database_name].[schema_name].object_name|database_name.[schema_name].object_name|schema_name.object_name|object_name其中:server_name:指定鏈接的服務(wù)器名稱或遠(yuǎn)程服務(wù)器名稱。(2)后續(xù)字符必須是符合Unicode2.0(統(tǒng)一碼6database_name:如果對(duì)象駐留在SQLServer的本地實(shí)例中,則指定SQLServer數(shù)據(jù)庫(kù)的名稱。如果對(duì)象在鏈接服務(wù)器中,則database_name將指定OLEDB目錄。schema_name:如果對(duì)象在SQLServer數(shù)據(jù)庫(kù)中,則指定包含對(duì)象的架構(gòu)的名稱。如果對(duì)象在鏈接服務(wù)器中,則schema_name將指定OLEDB架構(gòu)名稱。object_name:對(duì)象的名稱。數(shù)據(jù)庫(kù)架構(gòu)是一個(gè)獨(dú)立于數(shù)據(jù)庫(kù)用戶的非重復(fù)命名空間可以將架構(gòu)視為對(duì)象的容器??梢栽跀?shù)據(jù)庫(kù)中創(chuàng)建和更改架構(gòu),并且可以授予用戶訪問(wèn)架構(gòu)的權(quán)限。任何用戶都可以擁有架構(gòu),并且架構(gòu)所有權(quán)可以轉(zhuǎn)移。在SQLServer2005中,每個(gè)對(duì)象都屬于一個(gè)數(shù)據(jù)庫(kù)架構(gòu)。database_name:如果對(duì)象駐留在SQLServ710.1.3注釋
注釋是程序代碼中不執(zhí)行的文本字符串,也稱為備注。注釋通常用于記錄程序名、作者姓名和主要代碼更改的日期,注釋可用于描述復(fù)雜的計(jì)算或解釋編程方法。SQLServer支持兩種類型的注釋字符:--(雙連字符):這些注釋字符可與要執(zhí)行的代碼處在同一行,也可另起一行。對(duì)于多行注釋,必須在每個(gè)注釋行的前面使用雙連字符。/*...*/(正斜杠-星號(hào)字符對(duì)):對(duì)于多行注釋,必須使用開(kāi)始注釋字符“/*”來(lái)開(kāi)始注釋,并使用結(jié)束注釋字符“*/”來(lái)結(jié)束注釋。
10.1.3注釋注釋是程序代碼中不執(zhí)810.1.4語(yǔ)句塊語(yǔ)句塊是由BEGIN和END括起來(lái)的一系列的Transact-SQL語(yǔ)句,作為一個(gè)邏輯單元執(zhí)行。語(yǔ)法格式如下:
BEGIN{sql_statement|statement_block}END其中:{sql_statement|statement_block}是使用語(yǔ)句塊定義的任何有效的Transact-SQL語(yǔ)句或語(yǔ)句組。BEGIN...END語(yǔ)句塊允許嵌套。10.1.4語(yǔ)句塊語(yǔ)句塊是由BEGIN和EN910.2表達(dá)式10.2.1常量10.2.2變量10.2.3運(yùn)算符10.2表達(dá)式10.2.1常量109.1數(shù)據(jù)與表達(dá)式10.2.1常量在程序運(yùn)行中保持常值的數(shù)據(jù),即程序本身不能改變其值的數(shù)據(jù),稱為常量,在程序中經(jīng)常直接使用文字符號(hào)表示。根據(jù)常量的類型不同分為字符串常量、整型常量、日期時(shí)間型常量、實(shí)型常量、貨幣常量、全局唯一標(biāo)識(shí)符。1.字符串常量字符串常量分為ASCII字符串常量、UNICODE字符串常量。ASCII字符串常量:用單引號(hào)括起來(lái),由ASCII構(gòu)成的字符串。如:‘a(chǎn)bcde’。UNICODE字符串常量:以字符N開(kāi)頭,如N'abcde'。
9.1數(shù)據(jù)與表達(dá)式10.2.1常量在程序運(yùn)行119.1數(shù)據(jù)與表達(dá)式字符串常量必須放在單引號(hào)或雙引號(hào)中。由字母、數(shù)字、下劃線、特殊字符(!,@,#)組成。當(dāng)單引號(hào)括住的字符串常量中包含單引號(hào)時(shí),用兩個(gè)單引號(hào)表示字符串中的單引號(hào)。如:I‘mZYT寫(xiě)作’I‘’mZYT‘。UNICODE(統(tǒng)一碼、萬(wàn)國(guó)碼、單一碼)是一種在計(jì)算機(jī)上使用的字符編碼。它為每種語(yǔ)言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求。9.1數(shù)據(jù)與表達(dá)式字符串常量必須放在單129.1數(shù)據(jù)與表達(dá)式9.1數(shù)據(jù)與表達(dá)式133.日期時(shí)間型常量datetime常量使用特定格式的字符日期值表示,用單引號(hào)括起來(lái)。輸入時(shí),可以使用“/”、“.”、“-”作日期/時(shí)間常量的分隔符。默認(rèn)情況下,按照mm/dd/yy(月/日/年)的格式來(lái)處理。
輸入格式datetime值Smalldatetime值Sep3,20081:34:34.1222008-09-0301:34:34.1232008-09-0301:35:009/3/20081PM2008-09-0313:00:00.0002008-09-0313:00:009.3.200813:002008-09-0313:00:00.0002008-09-0313:00:0013:25:191900-01-0113:25:19.0001900-01-0113:25:009/3/20082008-09-0300:00:00.0002008-09-0300:00:009.1.2常量與變量3.日期時(shí)間型常量輸入格式datetime值Smallda144.實(shí)型常量實(shí)型常量有純小數(shù)和指數(shù)形式兩種。如165.234,10E23。5.貨幣常量
用貨幣符號(hào)開(kāi)頭。如$12.5,$54230.25。SQLServer不強(qiáng)制分組,如每隔三個(gè)數(shù)字插一個(gè)逗號(hào)等。6.全局唯一標(biāo)識(shí)符全局唯一標(biāo)識(shí)符(GloballyUniqueIdentificationNumbers,GUID)是16字節(jié)長(zhǎng)的二進(jìn)制數(shù)據(jù)類型,是SQLServer根據(jù)計(jì)算機(jī)網(wǎng)絡(luò)適配器地址和主機(jī)時(shí)鐘產(chǎn)生的唯一號(hào)碼生成的全局唯一標(biāo)識(shí)符。9.1.2常量與變量4.實(shí)型常量9.1.2常量與變量159.1.2常量與變量9.1.2常量與變量16變量用于臨時(shí)存放數(shù)據(jù),變量中的數(shù)據(jù)隨著程序的運(yùn)行而變化,變量有名字與數(shù)據(jù)類型兩個(gè)屬性。變量的命名使用常規(guī)標(biāo)識(shí)符,即以字母、下劃線(_)、at符號(hào)(@)、數(shù)字符號(hào)(#)開(kāi)頭,后續(xù)字母、數(shù)字、at符號(hào)、美元符號(hào)($)、下劃線的字符序列。不允許嵌入空格或其他特殊字符。10.2.2變量9.1.2常量與變量變量用于臨時(shí)存放數(shù)據(jù),變量中的數(shù)據(jù)隨著程序的運(yùn)行而變化,變量17全局變量由系統(tǒng)定義并維護(hù),通過(guò)在名稱前面加“@@”符號(hào)局部變量的首字母為單個(gè)“@”。全局變量和局部變量9.1.2常量與變量全局變量由系統(tǒng)定義并維護(hù),通過(guò)在名稱前面加“@@”符號(hào)全局變181.局部變量局部變量是作用域局限在一定范圍內(nèi)的Transact-SQL對(duì)象。作用域:若局部變量在一個(gè)批處理、存儲(chǔ)過(guò)程、觸發(fā)器中被聲明或定義,則其作用域就在批處理、存儲(chǔ)過(guò)程或觸發(fā)器內(nèi)。(1)局部變量的聲明或定義DECLARE{local_variable[AS]data_type}[,...n]其中:@local_variable:變量的名稱。變量名必須以@開(kāi)頭。data_type:數(shù)據(jù)類型
變量先聲明或定義,然后就可以在Transact-SQL命令中使用。默認(rèn)初值NULL。1.局部變量局部變量是作用域局限在一定范圍內(nèi)的T19(2)局部變量的賦值
用SET或SELECT為局部變量賦值SET@local_variable=expression或SELECT@local_variable=expression或SELECT@local_variable=output_valueFROMtable_nameWHERE...各選項(xiàng)含義如下:
local_variable:是除cursor,text,ntext,image外的任何類型變量名。expression:表達(dá)式是任何有效的SQLServer表達(dá)式。output_value:用于將單個(gè)值返回到變量中。注意:如果output_value為列名,則返回多個(gè)。若SELECT語(yǔ)句返回多個(gè)值,則將返回的最后一個(gè)值賦給變量。若SELECT語(yǔ)句沒(méi)有返回值,變量保留當(dāng)前值;若output_value是不返回值的子查詢,則變量為NULL。
9.1.2常量與變量(2)局部變量的賦值用SET或SELECT為局部變量賦值9209.1.2常量與變量9.1.2常量與變量219.1.2常量與變量9.1.2常量與變量222.全局變量系統(tǒng)全局變量是SQLServer系統(tǒng)提供并賦值的變量。用戶不能建立全局變量,也不能用SET語(yǔ)句改變?nèi)肿兞康闹?。全局變量記錄SQLServer服務(wù)器活動(dòng)狀態(tài)的一組數(shù)據(jù)。例如:@@ERROR表示最后一個(gè)Transact-SQL命令錯(cuò)誤的錯(cuò)誤號(hào);@@SERVERNAME表示本地服務(wù)器的名稱。具體見(jiàn)表10.2常用的SQLServer全局變量全局變量由@@開(kāi)始,由系統(tǒng)定義和維護(hù),用戶只能顯示和讀取,不能修改。2.全局變量系統(tǒng)全局變量是SQLServer系統(tǒng)提供并賦23例如:顯示SQLServer的版本。SELECT@@versionAS版本號(hào)執(zhí)行結(jié)果如圖10.4所示。9.1.2常量與變量例如:顯示SQLServer的版本。9.1.2常量與變24例如:使用@@spid返回當(dāng)前用戶進(jìn)程的ID。SELECT@@spidas'ID',SYSTEM_USERAS'LoginName',USERAS'UserName'運(yùn)行結(jié)果:IDLoginNameUserName53sa dbo
9.1.2常量與變量例如:使用@@spid返回當(dāng)前用戶進(jìn)程的ID。SELECT2510.2.3運(yùn)算符運(yùn)算符用于指定要在一個(gè)或多個(gè)表達(dá)式中執(zhí)行的操作。將變量、常量和函數(shù)連接起來(lái),構(gòu)成表達(dá)式。下表列出了SQLServer2005的運(yùn)算符10.2.3運(yùn)算符運(yùn)算符用于指定要在一個(gè)或多個(gè)表達(dá)式中執(zhí)26優(yōu)先級(jí)運(yùn)算符類別所包含運(yùn)算符1一元運(yùn)算符+(正)、-(負(fù))、~(取反)2算術(shù)運(yùn)算符*(乖)、/(除)、%(取模)3算術(shù)字符串運(yùn)算符+(加)、-(減)、+(連接)4比較運(yùn)算符=(等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、<>(或!=不等于)、!<(不小于)、!>(不大于)5按位運(yùn)算符&(位與)、|(位或)、^(位異或)6邏輯運(yùn)算符NOT(非)7邏輯運(yùn)算符AND(與)8邏輯運(yùn)算符ALL(所有)、ANY(任意一個(gè))、BETWEEN(兩者之間)、EXISTS(存在)、IN(在范圍內(nèi))、LIKE(匹配)、OR(或)、SOME(任意一個(gè))9賦值運(yùn)算符=(賦值)SQLServer2005運(yùn)算符優(yōu)先級(jí)運(yùn)算符類別所包含運(yùn)算符1一元運(yùn)算符+(正)、-(負(fù))、2710.3函數(shù)10.3.1內(nèi)置函數(shù)10.3.2用戶定義函數(shù)10.3函數(shù)10.3.1內(nèi)置函數(shù)28函數(shù)是—組編譯好的Transact-SQL語(yǔ)句,它們可以帶一個(gè)或一組數(shù)值做參數(shù),也可不帶參數(shù),它返回一個(gè)數(shù)值、數(shù)值集合,或執(zhí)行一些操作。函數(shù)能夠重復(fù)執(zhí)行一些操作,從而避免不斷重寫(xiě)代碼。SQLServer2005支持兩種函數(shù)類型:(1)內(nèi)置函數(shù):是一組預(yù)定義的函數(shù),是Transact-SQL語(yǔ)言的一部分,按Transact-SQL參考中定義的方式運(yùn)行且不能修改。(2)用戶定義函數(shù):由用戶定義的Transact-SQL函數(shù)。它將頻繁執(zhí)行的功能語(yǔ)句塊封裝到一個(gè)命名函數(shù)中,該函數(shù)可以由Transact-SQL語(yǔ)句調(diào)用。函數(shù)是—組編譯好的Transact-SQL語(yǔ)句,它們可以帶一299.2.1常用函數(shù)10.3.1內(nèi)置函數(shù)1.字符串函數(shù)字符串函數(shù)用來(lái)實(shí)現(xiàn)對(duì)字符型數(shù)據(jù)的轉(zhuǎn)換、查找、分析等操作,對(duì)字符串輸入值執(zhí)行操作,返回字符串或數(shù)字值。(1)ASCII()函數(shù)返回字符表達(dá)式最左端字符的ASCII碼值。語(yǔ)法格式如下。
ASCII(character_expression)其中:character_expression為char或varchar類型的表達(dá)式。9.2.1常用函數(shù)10.3.1內(nèi)置函數(shù)1.字符串函數(shù)30第10章Transact-SQL程序設(shè)計(jì)課件319.2.1常用函數(shù)(2)CHAR()函數(shù)將int型的ASCII碼轉(zhuǎn)換為字符的字符串函數(shù)。語(yǔ)法格式如下。
CHAR(integer_expression)其中:integer_expression是介于0和255之間的整數(shù)。如果該整數(shù)表達(dá)式不在此范圍內(nèi),將返回NULL值。例如:以下示例為CHAR()函數(shù)的使用。DECLARE@StringTestCHAR(10)SET@StringTest=ASCII('Robin')SELECTCHAR(@StringTest)執(zhí)行結(jié)果為:R9.2.1常用函數(shù)(2)CHAR()函數(shù)329.2.1常用函數(shù)(3)LEFT()函數(shù)返回從字符串左邊開(kāi)始指定個(gè)數(shù)的字符。語(yǔ)法格式如下。
LEFT(character_expression,integer_expression)其中:character_expression:字符或二進(jìn)制數(shù)據(jù)表達(dá)式??梢允浅A?、變量或列??梢允侨魏文軌螂[式轉(zhuǎn)換為varchar或nvarchar的數(shù)據(jù)類型,但text或ntext除外。integer_expression:正整數(shù),指定character_expression將返回的字符數(shù)。如果為負(fù),則會(huì)返回錯(cuò)誤。integer_expression可以是bigint類型。
9.2.1常用函數(shù)(3)LEFT()函數(shù)339.2.1常用函數(shù)例如:以下示例為L(zhǎng)EFT()函數(shù)的使用。DECLARE@StringTestCHAR(10)SET@StringTest='Robin'SELECTLEFT(@StringTest,3)執(zhí)行結(jié)果為:Rob9.2.1常用函數(shù)例如:以下示例為L(zhǎng)EFT()函數(shù)的使用。349.2.1常用函數(shù)(4)LOWER()函數(shù)將大寫(xiě)字符數(shù)據(jù)轉(zhuǎn)換為小寫(xiě)字符數(shù)據(jù)后返回字符表達(dá)式。語(yǔ)法格式如下。LOWER(character_expression)例如:以下示例為L(zhǎng)OWER()函數(shù)的使用DECLARE@StringTestCHAR(10)SET@StringTest='Robin'SELECTLOWER(LEFT(@StringTest,3))執(zhí)行結(jié)果為:rob9.2.1常用函數(shù)(4)LOWER()函數(shù)359.2.1常用函數(shù)(5)LTRIM()函數(shù)刪除起始空格后返回字符表達(dá)式。語(yǔ)法格式如下。LTRIM(character_expression)例如:以下示例為L(zhǎng)TRIM()函數(shù)的使用DECLARE@StringTestCHAR(10)SET@StringTest='Robin'SELECT'Start-'+LTRIM(@StringTest),'Start-'+@StringTest執(zhí)行結(jié)果為:Start-RobinStart-Robin9.2.1常用函數(shù)(5)LTRIM()函數(shù)369.2.1常用函數(shù)(6)RIGHT()函數(shù)返回字符串中從右邊開(kāi)始指定個(gè)數(shù)的字符。語(yǔ)法格式如下。RIGHT(character_expression,integer_expression)例如:以下示例為RIGHT()函數(shù)的使用。DECLARE@StringTestCHAR(10)SET@StringTest='Robin'SELECTRIGHT(@StringTest,3)執(zhí)行結(jié)果為:in9.2.1常用函數(shù)(6)RIGHT()函數(shù)379.2.1常用函數(shù)(7)RTRIM()函數(shù)截?cái)嗨形搽S空格后返回一個(gè)字符串。語(yǔ)法格式如下。RTRIM(character_expression)例如:以下示例為RTRIM()函數(shù)的使用。DECLARE@StringTestCHAR(10)SET@StringTest='Robin'SELECT@StringTest+'-End',RTRIM(@StringTest)+'-End'執(zhí)行結(jié)果為:Robin-EndRobin-End9.2.1常用函數(shù)(7)RTRIM()函數(shù)389.2.1常用函數(shù)9.2.1常用函數(shù)399.2.1常用函數(shù)9.2.1常用函數(shù)409.2.1常用函數(shù)(9)SUBSTRING()函數(shù)求子串函數(shù)。語(yǔ)法格式如下。
SUBSTRING(expression,start,length)其中:expression:是字符串、二進(jìn)制字符串、文本、圖像、列或包含列的表達(dá)式。不能使用包含聚合函數(shù)的表達(dá)式。start:指定子字符串開(kāi)始位置的整數(shù),start可以為bigint類型。length:正整數(shù),指定要返回的expression的字符數(shù)或字節(jié)數(shù)。如果length為負(fù),則會(huì)返回錯(cuò)誤。length可以是bigint類型。9.2.1常用函數(shù)(9)SUBSTRING()函數(shù)419.2.1常用函數(shù)例如:以下示例為SUBSTRING()函數(shù)的使用。DECLARE@StringTestchar(10)SET@StringTest='Robin'SELECTSUBSTRING(@StringTest,3,LEN(@StringTest))執(zhí)行結(jié)果為:bin9.2.1常用函數(shù)例如:以下示例為SUBSTRING()函429.2.1常用函數(shù)(10)UPPER()函數(shù)返回將小寫(xiě)字符數(shù)據(jù)轉(zhuǎn)換為大寫(xiě)字符的表達(dá)式。語(yǔ)法格式如下。
UPPER(character_expression)
例如:以下示例為UPPER()函數(shù)的使用DECLARE@StringTestCHAR(10)SET@StringTest='Robin'SELECTUPPER(@StringTest)執(zhí)行結(jié)果為:ROBIN 9.2.1常用函數(shù)(10)UPPER()函數(shù)439.2.1常用函數(shù)2.日期時(shí)間函數(shù)日期時(shí)間函數(shù)對(duì)日期和時(shí)間輸入值執(zhí)行操作,并返回一個(gè)字符串、數(shù)字值或日期和時(shí)間值。(1)DATEADD()函數(shù)在指定日期加上一段時(shí)間的基礎(chǔ)上,返回新的DATETIME類型值。語(yǔ)法格式如下。DATEADD(datepart,number,date)其中:datepart:指定要返回新值的日期的組成部分。number:用來(lái)增加datepart的值。如果指定一個(gè)不是整數(shù)的值,則將廢棄此值的小數(shù)部分。date:是返回DATETIME或SMALLDATETIME類型值或日期格式字符串的表達(dá)式。
9.2.1常用函數(shù)2.日期時(shí)間函數(shù)449.2.1常用函數(shù)表10.4SQLServer的日期部分日期部分寫(xiě)法取值范圍Yearyy1753~9999Quarterqq1~4Monthmm1~12Dayofyeardy1~366Daydd1~31Weekwk1~54Weekdaydw1~7(Mon~Sun)Hourhh0~23Minutemi0~59Secondss0~59Millisecondms0~9999.2.1常用函數(shù)表10.4SQLServer的459.2.1常用函數(shù)例如:以下示例為DATEADD()函數(shù)的使用。DECLARE@OLDTimeDATETIMESET@OLDTime='12-02-200406:30pm'SELECTDATEADD(hh,4,@OldTime)執(zhí)行結(jié)果為:2004-12-0222:30:00.0009.2.1常用函數(shù)例如:以下示例為DATEADD()函數(shù)的469.2.1常用函數(shù)(2)DATEDIFF()函數(shù)兩時(shí)間之差,返回跨兩個(gè)指定日期的日期邊界數(shù)和時(shí)間邊界數(shù)。語(yǔ)法格式如下。
DATEDIFF(datepart,startdate,enddate)
其中:datepart:指定應(yīng)在日期的哪一部分計(jì)算差額的參數(shù)。startdate:計(jì)算的開(kāi)始日期。startdate是返回DATETIME或SMALLDATETIME類型值或日期格式字符串的表達(dá)式。enddate:計(jì)算的結(jié)束日期。enddate是返回DATETIME或SMALLDATETIME類型值或日期格式字符串的表達(dá)式。9.2.1常用函數(shù)(2)DATEDIFF()函數(shù)479.2.1常用函數(shù)9.2.1常用函數(shù)489.2.1常用函數(shù)(3)DATENAME()返回表示指定日期的指定日期部分的字符串。語(yǔ)法格式如下。
DATENAME(datepart,date)其中:datepart:是指定要返回的日期部分的參數(shù)。date:表達(dá)式,用于返回DATETIME或SMALLDATETIME類型值,或日期格式的字符串。例如:DECLARE@StatementDateDATETIMESET@StatementDate='2006-3-143:00PM'SELECTDATENAME(dw,@StatementDate)執(zhí)行結(jié)果為:星期二9.2.1常用函數(shù)(3)DATENAME()499.2函數(shù)10.3.2用戶定義函數(shù)用戶定義函數(shù)(User-DefinedFunction,UDF)是執(zhí)行計(jì)算并返回一個(gè)值(標(biāo)量值或表)的一段程序。根據(jù)函數(shù)返回值形式的不同將用戶定義函數(shù)分為3種類型。(1)標(biāo)量函數(shù) 標(biāo)量函數(shù)返回一個(gè)確定類型的標(biāo)量值,其函數(shù)值類型為SQLServer的系統(tǒng)數(shù)據(jù)類型(除text、ntext、image、cursor、timestamp、table類型外)。函數(shù)體語(yǔ)句定義在BEGIN…END語(yǔ)句內(nèi)。(2)內(nèi)嵌表值函數(shù) 內(nèi)嵌表值函數(shù)返回的函數(shù)值為一個(gè)表。內(nèi)嵌表值函數(shù)的函數(shù)體不使用BEGIN…END語(yǔ)句,其返回的表是RETURN子句中的SELECT命令查詢的結(jié)果集,其功能相當(dāng)于一個(gè)參數(shù)化的視圖。(3)多語(yǔ)句表值函數(shù) 多語(yǔ)句表值函數(shù)可以看作標(biāo)量函數(shù)和內(nèi)嵌表值函數(shù)的結(jié)合體。其函數(shù)值也是一個(gè)表,但函數(shù)體也用BEGIN…END語(yǔ)句定義,返回值的表中的數(shù)據(jù)由函數(shù)體中的語(yǔ)句插入。9.2函數(shù)10.3.2用戶定義函數(shù)用戶定509.2函數(shù)用戶定義函數(shù)需要注意以下幾點(diǎn):UDF可以嵌入到查詢、約束和計(jì)算列中。定義UDF的代碼不能影響函數(shù)范圍之外的數(shù)據(jù)庫(kù)狀態(tài),也就是說(shuō),UDF代碼不能修改表中的數(shù)據(jù)或調(diào)用會(huì)產(chǎn)生副作用的函數(shù)(例如,RAND)。UDF的代碼只能創(chuàng)建表變量,不能創(chuàng)建或訪問(wèn)臨時(shí)表,也不允許使用動(dòng)態(tài)執(zhí)行。在MicrosoftSQLServer2005系統(tǒng)中,可以分別使用CREATEFUNCTION、ALTERFUNCTION、DROPFUNCTION語(yǔ)句來(lái)實(shí)現(xiàn)用戶定義函數(shù)的創(chuàng)建、修改和刪除。在創(chuàng)建用戶定義函數(shù)時(shí),每個(gè)完全限定用戶函數(shù)名稱必須唯一。用戶定義函數(shù)不能用于執(zhí)行一系列可以改變數(shù)據(jù)庫(kù)狀態(tài)的操作。9.2函數(shù)用戶定義函數(shù)需要注意以下幾點(diǎn):519.2.2用戶定義函數(shù)1.創(chuàng)建用戶定義函數(shù)(1)使用CREATEFUNCTION創(chuàng)建用戶定義函數(shù)標(biāo)量函數(shù)的語(yǔ)法格式:CREATEFUNCTION[owner_name.]function_name([{@parameter_name[AS]scalar_parameter_data_type[=default]}[,...n]])RETURNSscalar_return_data_type[WITH<function_option>[,...n]][AS]BEGINfunction_bodyRETURN[scalar_expression]END<function_option>::={[ENCRYPTION]|[SCHEMABINDING]}9.2.2用戶定義函數(shù)1.創(chuàng)建用戶定義函數(shù)(1)使用C52其中:
owner_name:指定用戶定義函數(shù)的所有者。function_name:用戶定義函數(shù)的名稱。函數(shù)名稱必須符合有關(guān)標(biāo)識(shí)符的規(guī)則,并且在數(shù)據(jù)庫(kù)中以及對(duì)其架構(gòu)來(lái)說(shuō)是唯一的。@parameter_name:用戶定義函數(shù)中的參數(shù)。一個(gè)函數(shù)最多可以有1024個(gè)參數(shù)。執(zhí)行函數(shù)時(shí),如果未定義參數(shù)的默認(rèn)值,則用戶必須提供每個(gè)已聲明參數(shù)的值。通過(guò)將符號(hào)@用作第一個(gè)字符來(lái)指定參數(shù)名稱。參數(shù)名稱必須符合有關(guān)標(biāo)識(shí)符的規(guī)則。參數(shù)是對(duì)應(yīng)于函數(shù)的局部參數(shù);其他函數(shù)中可使用相同的參數(shù)名稱。參數(shù)只能代替常量,而不能用于代替表名、列名或其他數(shù)據(jù)庫(kù)對(duì)象的名稱。scalar_parameter_data_type:指定標(biāo)量參數(shù)的數(shù)據(jù)類型,除了text、ntext、image、cursor、timestamp和table類型外的其他數(shù)據(jù)類型。[=default]:參數(shù)的默認(rèn)值。如果定義了default值,則無(wú)需指定此參數(shù)的值即可執(zhí)行函數(shù)。其中:53scalar_return_data_type:指定標(biāo)量返回值的數(shù)據(jù)類型,除了text、ntext、image、cursor、timestamp和table類型外的其它數(shù)據(jù)類型。scalar_expression:指定標(biāo)量型用戶自定義函數(shù)返回的標(biāo)量值表達(dá)式。function_body:指定一系列的Transact_SQL語(yǔ)句,它們決定了函數(shù)的返回值。encryption:加密選項(xiàng),讓SQLServer對(duì)系統(tǒng)表中有關(guān)CREATEFUNCTION的聲明加密,以防止用戶定義函數(shù)作為SQLServer復(fù)制的一部分被發(fā)布。schemabinding:計(jì)劃綁定選項(xiàng)。將用戶定義函數(shù)綁定到它所引用的數(shù)據(jù)庫(kù)對(duì)象,則函數(shù)所涉及的數(shù)據(jù)庫(kù)對(duì)象從此將不能被刪除或修改,除非函數(shù)被刪除或去掉此選項(xiàng)。應(yīng)注意的是要綁定的數(shù)據(jù)庫(kù)對(duì)象必須與函數(shù)在同一數(shù)據(jù)庫(kù)中。scalar_return_data_type:指定標(biāo)量返回549.2.2用戶定義函數(shù)例如:根據(jù)輸入的某人的年齡,返回其出生年份。USEteachingGOCREATEFUNCTIONbirth_year(@ageint)RETURNSintASBEGINRETURN(YEAR(GETDATE())-@age)END9.2.2用戶定義函數(shù)例如:根據(jù)輸入的某人的年齡,返回其出559.2.2用戶定義函數(shù)內(nèi)嵌表值函數(shù)的語(yǔ)法格式:CREATEFUNCTION[owner_name.]function_name([{@parameter_name[AS]scalar_parameter_data_type[=default]}[,...n]])RETURNSTABLE[WITH<function_option>[,...n]][AS]RETURN(select_stmt)
其中:TABLE:指定表值函數(shù)的返回值為表。只有常量和@local_variables可以傳遞到表值函數(shù)。在內(nèi)聯(lián)表值函數(shù)中,TABLE返回值是通過(guò)單個(gè)SELECT語(yǔ)句定義的。select_stmt:定義內(nèi)聯(lián)表值函數(shù)返回值的單個(gè)SELECT語(yǔ)句,確定返回的表的數(shù)據(jù)。9.2.2用戶定義函數(shù)內(nèi)嵌表值函數(shù)的語(yǔ)法格式:CREATE569.2.2用戶定義函數(shù)例如:在teaching數(shù)據(jù)庫(kù)中創(chuàng)建內(nèi)聯(lián)表值函數(shù),根據(jù)輸入的學(xué)生學(xué)號(hào),返回student表中對(duì)應(yīng)的姓名和年齡。USEteachingGOCREATEFUNCTIONstudent_info(@nochar(4))RETURNSTABLEASRETURN(SELECTSNAME,AGEFROMstudentWHERESNO=@no)9.2.2用戶定義函數(shù)例如:在teaching數(shù)據(jù)庫(kù)中創(chuàng)建579.2.2用戶定義函數(shù)多語(yǔ)句表值函數(shù)的語(yǔ)法格式:CREATEFUNCTION[owner_name.]function_name([{@parameter_name[AS]scalar_parameter_data_type[=default]}[,...n]])RETURNS@return_variableTABLE<table_type_definition>[WITH<function_option>[,...n]][AS]BEGINfunction_bodyRETURNEND<table_type_definition>::=({<column_definition><column_constraint>|<table_constraint>}[,...n])9.2.2用戶定義函數(shù)多語(yǔ)句表值函數(shù)的語(yǔ)法格式:CREAT589.2.2用戶定義函數(shù)其中:
@return_variable:一個(gè)table類型的變量,用于存儲(chǔ)和累積返回的表中的數(shù)據(jù)行。<table_type_definition>:定義Transact-SQL函數(shù)的表數(shù)據(jù)類型。表聲明包含列定義和列約束(或表約束)。表始終放在主文件組中。9.2.2用戶定義函數(shù)其中:599.2.2用戶定義函數(shù)9.2.2用戶定義函數(shù)609.2.2用戶定義函數(shù)具體步驟詳見(jiàn)教材(2)使用圖形工具創(chuàng)建用戶定義函數(shù)
9.2.2用戶定義函數(shù)具體步驟詳見(jiàn)教材(2)使61第10章Transact-SQL程序設(shè)計(jì)課件62第10章Transact-SQL程序設(shè)計(jì)課件639.2.2用戶定義函數(shù)3.修改用戶定義函數(shù)可以使用Transact-SQL命令A(yù)LTERFUNCTION命令修改用戶定義函數(shù),語(yǔ)法格式與CREATEFUNCTION相同,相當(dāng)于重建。也可以使用圖形工具修改用戶定義函數(shù),具體步驟詳見(jiàn)教材9.2.2用戶定義函數(shù)3.修改用戶定義函數(shù)可以使用Tra649.2.2用戶定義函數(shù)3.刪除用戶定義函數(shù)(1)使用Transact-SQL命令刪除使用DROPFUNCTION命令刪除用戶定義函數(shù),其語(yǔ)法如下:DROPFUNCTION{[owner_name.]function_name}[,...n]其中,function_name是要?jiǎng)h除的用戶定義的函數(shù)名稱。例如:刪除teaching數(shù)據(jù)庫(kù)中的用戶定義函數(shù)birth_year。USEteachingGODROPFUNCTIONbirth_yearGO
9.2.2用戶定義函數(shù)3.刪除用戶定義函數(shù)(1)使用Tr659.2.2用戶定義函數(shù)(2)使用圖形工具刪除用戶定義函數(shù)具體步驟詳見(jiàn)教材9.2.2用戶定義函數(shù)(2)使用圖形工具刪除用戶定義函數(shù)6610.4流程控制語(yǔ)句10.4.1批處理10.4.2選擇語(yǔ)句10.4.3循環(huán)語(yǔ)句10.4流程控制語(yǔ)句10.4.1批處理679.3程序控制流語(yǔ)句Transact-SQL語(yǔ)言提供了稱為控制流語(yǔ)言的特殊關(guān)鍵字,這些關(guān)鍵字用于控制Transact-SQL語(yǔ)句、語(yǔ)句塊、用戶定義函數(shù)以及存儲(chǔ)過(guò)程的執(zhí)行流??刂屏髡Z(yǔ)言支持基本的流控制邏輯,它允許按照給定的某種條件執(zhí)行程序流和分支??刂屏髡Z(yǔ)句不能跨多個(gè)批處理、用戶定義函數(shù)或存儲(chǔ)過(guò)程。Transact-SQL提供的控制流有:IF…ELSE分支、CASE多重分支、WHILE循環(huán)結(jié)構(gòu)、GOTO語(yǔ)句、WAITFOR語(yǔ)句和RETURN語(yǔ)句。9.3程序控制流語(yǔ)句Transact-SQL語(yǔ)言提供了稱為689.3程序控制流語(yǔ)句10.4.1批處理批處理是包含—條或多條Transact-SQL語(yǔ)句的集合,被一次性執(zhí)行。
SQLServer將批處理編譯成一個(gè)可執(zhí)行單元,稱為執(zhí)行計(jì)劃。批中如果某處發(fā)生編譯錯(cuò)誤,整個(gè)執(zhí)行計(jì)劃都無(wú)法執(zhí)行。寫(xiě)批處理時(shí),GO語(yǔ)句作為批處理命令的結(jié)束標(biāo)志,當(dāng)編譯器讀取到GO語(yǔ)句時(shí),會(huì)把GO語(yǔ)句前的所有語(yǔ)句當(dāng)作一個(gè)批處理,并將這些語(yǔ)句打包發(fā)送給服務(wù)器。GO語(yǔ)句本身不是Transact-SQL語(yǔ)句的組成部分,只是一個(gè)表示批處理結(jié)束的前端指令。9.3程序控制流語(yǔ)句10.4.1批處理批處理是包含—691.批處理使用規(guī)則(1)CREATEDEFAULT、CREATEFUNCTION、CREATEPROCEDURE、CREATERULE、CREATESCHEMA、CREATETRIGGER和CREATEVIEW語(yǔ)句不能在批處理中與其他語(yǔ)句組合使用,在同一個(gè)批處理中只能提交一個(gè)。(2)不能在刪除一個(gè)對(duì)象之后,在同一批處理中再次引用這個(gè)對(duì)象。(3)不能把規(guī)則和默認(rèn)值綁定到表字段或者自定義字段上后,立即在同一批處理中使用它們。(4)不能定義一個(gè)CHECK約束后,立即在同一個(gè)批處理中使用這個(gè)約束。(5)不能修改表中一個(gè)字段名后,立即在同一個(gè)批處理中引用這個(gè)新字段。(6)使用SET語(yǔ)句設(shè)置的某些SET選項(xiàng)不能應(yīng)用于同一個(gè)批處理中的查詢。(7)若批處理中第一個(gè)語(yǔ)句是執(zhí)行某個(gè)存儲(chǔ)過(guò)程的EXECUTE語(yǔ)句,則EXECUTE關(guān)鍵字可以省略。若該語(yǔ)句不是第一個(gè)語(yǔ)句,則必須寫(xiě)上。1.批處理使用規(guī)則709.3程序控制流語(yǔ)句SQLServer有以下幾種指定批處理的方法。(1)應(yīng)用程序作為一個(gè)執(zhí)行單元發(fā)出的所有SQL語(yǔ)句構(gòu)成一個(gè)批處理,并生成單個(gè)執(zhí)行計(jì)劃。(2)存儲(chǔ)過(guò)程或觸發(fā)器內(nèi)的所有語(yǔ)句構(gòu)成一個(gè)批處理。每個(gè)存儲(chǔ)過(guò)程或觸發(fā)器都編譯為一個(gè)執(zhí)行計(jì)劃。(3)由EXECUTE語(yǔ)句執(zhí)行的字符串是一個(gè)批處理,并編譯為一個(gè)執(zhí)行計(jì)劃。例如,EXEC('SELECT*FROMemployee')(4)由sp_executesql系統(tǒng)存儲(chǔ)過(guò)程執(zhí)行的字符串是一個(gè)批處理,并編譯為一個(gè)執(zhí)行計(jì)劃。例如,executesp_executesqlN'SELECT*fromSales.dbo.employee'注意:應(yīng)用程序發(fā)出的批處理過(guò)程中含有EXECUTE語(yǔ)句,已執(zhí)行字符串或存儲(chǔ)過(guò)程的執(zhí)行計(jì)劃,將和包含EXECUTE語(yǔ)句的執(zhí)行計(jì)劃分開(kāi)執(zhí)行。若sp_executesql存儲(chǔ)過(guò)程所執(zhí)行的字符串生成的執(zhí)行計(jì)劃也與包含sp_executesql調(diào)用的批處理執(zhí)行計(jì)劃分開(kāi)執(zhí)行。若批處理中的語(yǔ)句激發(fā)了觸發(fā)器,則觸發(fā)器執(zhí)行將和原始的批處理執(zhí)行分開(kāi)進(jìn)行。2.指定批處理的方法9.3程序控制流語(yǔ)句SQLServer有以下幾種719.3程序控制流語(yǔ)句(1)批處理結(jié)束語(yǔ)句:GO作為批處理的結(jié)束標(biāo)志,也就是說(shuō)當(dāng)編譯器執(zhí)行到GO時(shí)會(huì)把GO之前的所有語(yǔ)句當(dāng)作一個(gè)批處理來(lái)執(zhí)行。注意:GO命令和Transact-SQL語(yǔ)句不可在同一行,在批處理中的第一條語(yǔ)句后執(zhí)行任何存儲(chǔ)過(guò)程必須包含EXECUTE關(guān)鍵字。局部變量的作用域限制在一個(gè)批處理中,不可在GO命令后引用。EXECUTE命令執(zhí)行標(biāo)量值的用戶定義函數(shù)、系統(tǒng)過(guò)程、用戶定義存儲(chǔ)過(guò)程或擴(kuò)展存儲(chǔ)過(guò)程。同時(shí)支持Transact-SQL批處理內(nèi)的字符串的執(zhí)行。
3.批處理的結(jié)束與退出9.3程序控制流語(yǔ)句(1)批處理結(jié)束語(yǔ)句:GO3.批處理729.3程序控制流語(yǔ)句(2)批處理退出語(yǔ)句:RETURN[整型表達(dá)式]無(wú)條件中止查詢、存儲(chǔ)過(guò)程或批處理的執(zhí)行。注意:存儲(chǔ)過(guò)程或批處理不執(zhí)行位于RETURN之后的語(yǔ)句。當(dāng)存儲(chǔ)過(guò)程使用該語(yǔ)句,則可用該語(yǔ)句指定返回給調(diào)用應(yīng)用程序、批處理或過(guò)程的整數(shù)值。若RETURN語(yǔ)句未指定值,則存儲(chǔ)過(guò)程的返回值是0。當(dāng)用于存儲(chǔ)過(guò)程時(shí),RETURN不能返回空值。9.3程序控制流語(yǔ)句(2)批處理退出語(yǔ)句:RETURN[734.腳本
腳本是存儲(chǔ)在文件中的一系列Transact-SQL語(yǔ)句??砂粋€(gè)或多個(gè)批處理,GO作為批處理結(jié)束語(yǔ)句,如果腳本中無(wú)GO語(yǔ)句,則作為單個(gè)批處理。腳本文件擴(kuò)展名為.sql。4.腳本749.3程序控制流語(yǔ)句10.4.2選擇語(yǔ)句1.條件執(zhí)行語(yǔ)句IF…ELSE 必須IF...ELSE結(jié)構(gòu)根據(jù)條件表達(dá)式的值,以決定執(zhí)行哪些語(yǔ)句。IF...ELSE的語(yǔ)法格式為:IFBoolean_expression{sql_statement|statement_block}--條件表達(dá)式為真時(shí)執(zhí)行[ELSE{sql_statement|statement_block}]--條件表達(dá)式為假時(shí)執(zhí)行其中:
Boolean_expression:返回TRUE或FALSE的表達(dá)式。如果布爾表達(dá)式中含有SELECT語(yǔ)句,則必須用括號(hào)將SELECT語(yǔ)句括起來(lái)。{sql_statement|statement_block}:任何Transact-SQL語(yǔ)句或用語(yǔ)句塊定義的語(yǔ)句分組。注意:IF...ELSE構(gòu)造可用于批處理、存儲(chǔ)過(guò)程和即席查詢。當(dāng)此構(gòu)造用于存儲(chǔ)過(guò)程時(shí),通常用于測(cè)試某個(gè)參數(shù)是否存在。可以在其他IF之后或在ELSE下面,嵌套另一個(gè)IF測(cè)試,嵌套級(jí)數(shù)的限制取決于可用內(nèi)存。9.3程序控制流語(yǔ)句10.4.2選擇語(yǔ)句1.條件執(zhí)行75例如:查詢課程中是否有OS課程,如果有,統(tǒng)計(jì)選課人數(shù)。USEteachingGODECLARE@numsmallintIFEXIST(SELECT*FROMcourseWHERECNAMELIKE'OS%')BEGINSELECT@num=COUNT(*)FROMs_cWHERECNOIN(SELECTCNOFROMcourseWHERECNAMELIKE'OS%')PRINT'選此課程人數(shù)為:'+str(@num)ENDELSEPRINT'數(shù)據(jù)庫(kù)中沒(méi)有此課程'執(zhí)行結(jié)果為:選此課程人數(shù)為:3例如:查詢課程中是否有OS課程,如果有,統(tǒng)計(jì)選課人數(shù)。769.3.2選擇控制2.CASE函數(shù)CASE表達(dá)式用來(lái)計(jì)算條件列表并返回多個(gè)可能結(jié)果表達(dá)式之一。(1)簡(jiǎn)單CASE函數(shù):將某個(gè)表達(dá)式與一組簡(jiǎn)單表達(dá)式進(jìn)行比較以確定結(jié)果。CASEinput_expressionWHENwhen_expressionTHENresult_expression[...n][ELSEelse_result_expression]END其中:
input_expression:計(jì)算的表達(dá)式,可以是任意有效的表達(dá)式。WHENwhen_expression:要與input_expression進(jìn)行比較的簡(jiǎn)單表達(dá)式,是任意有效的表達(dá)式。input_expression及每個(gè)when_expression的數(shù)據(jù)類型必須相同或必須是隱式轉(zhuǎn)換的數(shù)據(jù)類型。THENresult_expression:當(dāng)input_expression=when_expression計(jì)算結(jié)果為T(mén)RUE時(shí)返回的表達(dá)式。ELSEelse_result_expression:比較運(yùn)算計(jì)算結(jié)果不為T(mén)RUE時(shí)返回的表達(dá)式。9.3.2選擇控制2.CASE函數(shù)CASE表達(dá)779.3.2選擇控制例如:顯示每個(gè)學(xué)生選課的數(shù)量。USEteachingGOSELECTSNO,'課程數(shù)量'=CASECOUNT(*)WHEN1THEN'選修了一門(mén)課'WHEN2THEN'選修了兩門(mén)課'WHEN3THEN'選修了三門(mén)課'ELSE'選修了三門(mén)課以上'ENDFROMs_cGROUPBYSNO執(zhí)行結(jié)果如下圖:9.3.2選擇控制例如:顯示每個(gè)學(xué)生選課的數(shù)量。789.3.2選擇控制
(2)CASE搜索函數(shù),CASE計(jì)算一組邏輯表達(dá)式以確定結(jié)果。CASEWHENBoolean_expressionTHENresult_expression[...n][ELSEelse_result_expression]END其中:WHENBoolean_expression是計(jì)算的布爾表達(dá)式,是任意有效的布爾表達(dá)式。9.3.2選擇控制(2)CASE搜索函數(shù),CASE79例如:使用CASE搜索表達(dá)式顯示每個(gè)學(xué)生選課的數(shù)量USEteachingGOSELECTSNO,'課程數(shù)量'=CASEWHENCOUNT(*)=1THEN'選修了一門(mén)課'WHENCOUNT(*)=2THEN'選修了兩門(mén)課'WHENCOUNT(*)=3THEN'選修了三門(mén)課'ENDFROMs_cGROUPBYSNO執(zhí)行結(jié)果如下圖:例如:使用CASE搜索表達(dá)式顯示每個(gè)學(xué)生選課的數(shù)量809.3.2選擇控制3.WAITFOR語(yǔ)句
WAITFOR語(yǔ)句,稱為延遲語(yǔ)句。就是暫停批處理、存儲(chǔ)過(guò)程或事務(wù)的執(zhí)行,轉(zhuǎn)去執(zhí)行一個(gè)指定的時(shí)間間隔或者到一個(gè)指定的時(shí)間。在達(dá)到指定時(shí)間或時(shí)間間隔之前,或者指定語(yǔ)句至少修改或返回一行之前,阻止執(zhí)行批處理、存儲(chǔ)過(guò)程或事務(wù)。
語(yǔ)法格式如下:
WAITFOR{DELAY'time_to_pass'/*設(shè)定等待時(shí)間*/|TIME'time_to_execute'/*設(shè)定等待到某一時(shí)刻*/}9.3.2選擇控制3.WAITFOR語(yǔ)句WA819.3.2選擇控制其中:DELAY:可以繼續(xù)執(zhí)行批處理、存儲(chǔ)過(guò)程或事務(wù)之前必須經(jīng)過(guò)的指定時(shí)段,最長(zhǎng)可為24小時(shí)?!畉ime_to_pass’:等待的時(shí)段??梢允褂胐atetime數(shù)據(jù)可接受的格式之一指定time_to_pass,也可以將其指定為局部變量。不能指定日期,因此,不允許指定datetime值的日期部分,只能指定時(shí)間。TIME:指定的運(yùn)行批處理、存儲(chǔ)過(guò)程或事務(wù)的時(shí)間?!畉ime_to_execute’:WAITFOR語(yǔ)句完成的時(shí)間??梢允褂胐atetime數(shù)據(jù)可接受的格式之一指定time_to_execute,也可以將其指定為局部變量,不能指定日期,因此,不允許指定datetime值的日期部分。注意:執(zhí)行WAITFOR語(yǔ)句時(shí),事務(wù)正在運(yùn)行,并且其他請(qǐng)求不能在同一事務(wù)下運(yùn)行。WAITFOR不更改查詢的語(yǔ)義。如果查詢不能返回任何行,WAITFOR將一直等待,或等到滿足TIMEOUT條件(如果已指定)。9.3.2選擇控制其中:829.3.2選擇控制例如:延遲30秒執(zhí)行查詢USEteachingGOWAITFORDELAY'00:00:30'SELECT*FROMstudent例如:在時(shí)刻21:20:00執(zhí)行查詢。USEteachingGOWAITFORTIME'21:20:00'SELECT*FROMstudent9.3.2選擇控制例如:延遲30秒執(zhí)行查詢839.3.2選擇控制4.跳轉(zhuǎn)語(yǔ)句GOTOGOTO語(yǔ)句將執(zhí)行語(yǔ)句無(wú)條件跳轉(zhuǎn)到標(biāo)簽處,并從標(biāo)簽位置繼續(xù)處理。GOTO語(yǔ)句和標(biāo)簽可在過(guò)程、批處理或語(yǔ)句塊中的任何位置使用。語(yǔ)法格式如下:
GOTOlabel其中,label為GOTO語(yǔ)句處理的起點(diǎn)。label必須符合標(biāo)識(shí)符規(guī)則。9.3.2選擇控制4.跳轉(zhuǎn)語(yǔ)句GOTOGOTO849.3.2選擇控制5.RETURN語(yǔ)句從查詢或過(guò)程中無(wú)條件退出。RETURN的執(zhí)行是即時(shí)且完全的,可在任何時(shí)候用于從過(guò)程、批處理或語(yǔ)句塊中退出。RETURN之后的語(yǔ)句是不執(zhí)行的。語(yǔ)法格式如下:
RETURN[integer_expression]其中:integer_expression是返回的整數(shù)值。存儲(chǔ)過(guò)程可向執(zhí)行調(diào)用的過(guò)程或應(yīng)用程序返回一個(gè)整數(shù)值。注意:除非另外說(shuō)明,否則所有系統(tǒng)存儲(chǔ)過(guò)程都將返回一個(gè)0值。此值表示成功,非0值表示失敗。如果用于存儲(chǔ)過(guò)程,RETURN不能返回NULL值。9.3.2選擇控制5.RETURN語(yǔ)句從查詢或859.3程序控制流語(yǔ)句10.4.3循環(huán)語(yǔ)句WHILE語(yǔ)句根據(jù)條件表達(dá)式設(shè)置Transact-SQL語(yǔ)句或語(yǔ)句塊重復(fù)執(zhí)行的次數(shù)。如果所設(shè)置的條件為真(TRUE)時(shí),在WHILE循環(huán)體內(nèi)的Transact-SQL語(yǔ)句會(huì)一直重復(fù)執(zhí)行,直到條件為假(FALSE)為止??梢允褂肂REAK和CONTINUE關(guān)鍵字在循環(huán)內(nèi)部控制WHILE循環(huán)中語(yǔ)句的執(zhí)行。
WHILE循環(huán)語(yǔ)句的語(yǔ)法格式如下:WHILEboolean_expression{sql_statement|statement_block}[BREAK][sql_statement|statement_block][CONTINUE]{sql_statement|statement_block}9.3程序控制流語(yǔ)句10.4.3循環(huán)語(yǔ)句WHI869.3程序控制流語(yǔ)句其中:
Boolean_expression:返回TRUE或FALSE的表達(dá)式。如果布爾表達(dá)式中含有SELECT語(yǔ)句,則必須用括號(hào)將SELECT語(yǔ)句括起來(lái)。{sql_statement|statement_block}:Transact-SQL語(yǔ)句或用語(yǔ)句塊定義的語(yǔ)句分組。若要定義語(yǔ)句塊,需使用BEGIN和END括起來(lái)。BREAK:導(dǎo)致從最內(nèi)層的WHILE循環(huán)中退出。將執(zhí)行出現(xiàn)在END關(guān)鍵字(循環(huán)結(jié)束的標(biāo)記)后面的任何語(yǔ)句。CONTINUE:使WHILE循環(huán)重新開(kāi)始執(zhí)行,忽略CONTINUE關(guān)鍵字后面的任何語(yǔ)句。注意:如果嵌套了兩個(gè)或多個(gè)WHILE循環(huán),則內(nèi)層的BREAK將退出到下一個(gè)外層循環(huán)。將首先運(yùn)行內(nèi)層循環(huán)結(jié)束之后的所有語(yǔ)句,然后重新開(kāi)始下一個(gè)外層循環(huán)。9.3程序控制流語(yǔ)句其中:879.3程序控制流語(yǔ)句例如:DECLARE@xintSET@x=0WHILE@x<3BEGINSET@x=@x+1PRINT'x='+STR(@x,1)END執(zhí)行結(jié)果為:x=1x=2x=39.3程序控制流語(yǔ)句例如:8810.5游標(biāo)10.5.1游標(biāo)概述10.5.2操作游標(biāo)10.5游標(biāo)10.5.1游標(biāo)概述8910.5.1游標(biāo)概述9.4游標(biāo)管理與應(yīng)用游標(biāo)(cursor)是一種數(shù)據(jù)訪問(wèn)機(jī)制,它允許用戶單獨(dú)地訪問(wèn)數(shù)據(jù)行,而不是對(duì)整個(gè)行集進(jìn)行操作。Transact-SQL游標(biāo)類似于C語(yǔ)言指針。在SQLServer2005中,游標(biāo)主要包括以下兩個(gè)部分:(1)游標(biāo)結(jié)果集:由定義游標(biāo)的SELECT語(yǔ)句返回的行的集合。(2)游標(biāo)位置:指向這個(gè)結(jié)果集中的某一行的指針。10.5.1游標(biāo)概述9.4游標(biāo)管理與應(yīng)用游標(biāo)(cur909.4.1游標(biāo)概述在SQLServer2005中游標(biāo)具有以下特點(diǎn):游標(biāo)返回一個(gè)完整的結(jié)果集,但允許程序設(shè)計(jì)語(yǔ)言只調(diào)用集合中的一行。允許定位在結(jié)果集中的特定行。從結(jié)果集的當(dāng)前位置檢索一行或多行支持對(duì)結(jié)果集中在當(dāng)前位置的行進(jìn)行數(shù)據(jù)修改。可以為其他用戶對(duì)顯示在結(jié)果集中的數(shù)據(jù)庫(kù)數(shù)據(jù)所作的更改提供不同級(jí)別的可見(jiàn)性支持。提供腳本、存儲(chǔ)過(guò)程和觸發(fā)器中使用的訪問(wèn)結(jié)果集中數(shù)據(jù)的Transact-SQL語(yǔ)句。9.4.1游標(biāo)概述在SQLServer2005中游標(biāo)9110.5.2操作游標(biāo)9.4游標(biāo)管理與應(yīng)用SQLServer游標(biāo)具有下面的處理過(guò)程:(1)聲明Transact-SQL變量包含游標(biāo)返回的數(shù)據(jù)。為每個(gè)結(jié)果集中的列聲明一個(gè)變量。聲明足夠大的變量來(lái)保存列返回的值,并聲明變量的類型為可從列數(shù)據(jù)類型隱式轉(zhuǎn)換得到的數(shù)據(jù)類型。(2)使用DECLARECURSOR語(yǔ)句將Transact-SQL游標(biāo)與SELECT語(yǔ)句相關(guān)聯(lián)。另外,DECLARECURSOR語(yǔ)句還定義游標(biāo)的特性,例如游標(biāo)名稱以及游標(biāo)是只讀還是只進(jìn)。(3)使用OPEN語(yǔ)句執(zhí)行SELECT語(yǔ)句并填充游標(biāo)。(4)使用FETCHINTO語(yǔ)句提取單個(gè)行,并將每列中的數(shù)據(jù)移至指定的變量中。然后,其他Transact-SQL語(yǔ)句可以引用那些變量來(lái)訪問(wèn)提取的數(shù)據(jù)值。Transact-SQL游標(biāo)不支持提取行塊。(5)使用CLOSE語(yǔ)句結(jié)束游標(biāo)的使用,關(guān)閉游標(biāo)可以釋放某些資源。
10.5.2操作游標(biāo)9.4游標(biāo)管理與應(yīng)用SQLSer921.聲明游標(biāo)9.4游標(biāo)管理與應(yīng)用聲明游標(biāo)的主要內(nèi)容包括游標(biāo)名字、數(shù)據(jù)來(lái)源表和列、選取條件,以及屬性僅讀或可修改。SQL92標(biāo)準(zhǔn)語(yǔ)法格式
DECLAREcursor_name[INSENSITIVE][SCROLL]CURSORFORselect_statement[FOR{READONLY|UPDATE[OFcolumn_name[,...n]]}][;]
其中:cursor_name:所定義的Transact-SQL服務(wù)器游標(biāo)的名稱。
1.聲明游標(biāo)9.4游標(biāo)管理與應(yīng)用聲明游標(biāo)的主要內(nèi)容包括游939.4游標(biāo)管理與應(yīng)用INSENSITIVE:定義一個(gè)游標(biāo),以創(chuàng)建將由該游標(biāo)使用的數(shù)據(jù)的臨時(shí)復(fù)本。對(duì)游標(biāo)的所有請(qǐng)求都從tempdb中的這一臨時(shí)表中得到應(yīng)答。因此,在對(duì)該游標(biāo)進(jìn)行提取操作時(shí)返回的數(shù)據(jù)中不反映對(duì)基表所做的修改,并且該游標(biāo)不允許修改。使用SQL-92語(yǔ)法時(shí),如果省略INSENSITIVE,則已提交的(任何用戶)對(duì)基礎(chǔ)表的刪除和更新都反映在后面的提取中。SCROLL:指定所有的提取選項(xiàng)(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE,如表10.5所示)均可用。如果未在SQL-92DECLARECURSOR中指定SCROLL,則NEXT是唯一支持的提取選項(xiàng)。如果也指定了FAST_FORWARD,則不能指定SCROLL。9.4游標(biāo)管理與應(yīng)用INSENSITIVE:定義一個(gè)游標(biāo),949.4.2聲明游標(biāo)表10.5SCROLL的取值SCROLL選項(xiàng)含義FIRST提取游標(biāo)中的第一行數(shù)據(jù)LAST提取游標(biāo)中的最后一行數(shù)據(jù)PRIOR提取游標(biāo)當(dāng)前位置的上一行數(shù)據(jù)NEXT提取游標(biāo)當(dāng)前位置的下一行數(shù)據(jù)RELATIVEn提取游標(biāo)當(dāng)前位置之前或之后的第n行數(shù)據(jù)(n為正表示向后,n為負(fù)表示向前)ABSULUTEn提取游標(biāo)中的第n行數(shù)據(jù)9.4.2聲明游標(biāo)表10.5SCROLL的取值SCRO959.4.2聲明游標(biāo)
select_statement:定義游標(biāo)結(jié)果集的標(biāo)準(zhǔn)SELECT語(yǔ)句。在游標(biāo)聲明的select_statement內(nèi)不允許使用關(guān)鍵字COMPUTE、COMPUTEBY、FORBROWSE和INTO。READONLY:禁止通過(guò)該游標(biāo)進(jìn)行更新。在UPDATE或DELETE語(yǔ)句的WHERECURRENTOF子句中不能引用游標(biāo)。該選項(xiàng)優(yōu)于要更新的游標(biāo)的默認(rèn)功能。UPDATE[OFcolumn_name[,...,n]]:定義游標(biāo)中可更新的列。如果指定了OFcolumn_name[,...,n],則只允許修改列出的列。如果指定了UPDATE,但未指定列的列表,則可以更新所有列。9.4.2聲明游標(biāo)select_statement:定義969.4.2聲明游標(biāo)
語(yǔ)法格式如下:DECLAREcursor_nameCURSOR[LOCAL|GLOBAL][FORWARD_ONLY|SCROLL][STATIC|KEYSET|DYNAMIC|FAST_FORWARD][READ_ONLY|SCROLL_LOCKS|OPTIMISTIC][TYPE_WARNING]FORselect_statement[FORUPDATE[OFcolumn_name[,...n]]][;]其中:
GLOBAL:指定該游標(biāo)的作用域?qū)B接來(lái)說(shuō)是全局的。在由連接執(zhí)行的任何存儲(chǔ)過(guò)程或批處理中,都可以引用該游標(biāo)名稱。該游標(biāo)僅在斷開(kāi)連接時(shí)隱式釋放。(2)Transact-SQL擴(kuò)展游標(biāo)定義格式9.4.2聲明游標(biāo)語(yǔ)法格式如下:(2)Transa979.4.2聲明游標(biāo)LOCAL:指定對(duì)于在其中創(chuàng)建的批處理、存儲(chǔ)過(guò)程或觸發(fā)器來(lái)說(shuō),該游標(biāo)的作用域是局部的。該游標(biāo)名稱僅在這個(gè)作用域內(nèi)有效。在批處理、存儲(chǔ)過(guò)程、觸發(fā)器或存儲(chǔ)過(guò)程O(píng)UTPUT參數(shù)中,該游標(biāo)可由局部游標(biāo)變量引用。OUTPUT參數(shù)用于將局部游標(biāo)傳遞回調(diào)用批處理、存儲(chǔ)過(guò)程或觸發(fā)器,它們可在存儲(chǔ)過(guò)程終止后給游標(biāo)變量分配參數(shù)使其引用游標(biāo)。除非OUTPUT參數(shù)將游標(biāo)傳遞回來(lái),否則游標(biāo)將在批處理、存儲(chǔ)過(guò)程或觸發(fā)器終止時(shí)隱式釋放。如果OUTPUT參數(shù)將游標(biāo)傳遞回來(lái),則游標(biāo)在最后引用它的變量釋放或離開(kāi)作用域時(shí)釋放。STATIC:定義一個(gè)游標(biāo),以創(chuàng)建將由該游標(biāo)使用的數(shù)據(jù)的臨時(shí)復(fù)本。對(duì)游標(biāo)的所有請(qǐng)求都從tempdb中的這一臨時(shí)表中得到應(yīng)答;因此,在對(duì)該游標(biāo)進(jìn)行提取操作時(shí)返回的數(shù)據(jù)中不反映對(duì)基表所做的修改,并且該游標(biāo)不允許修改
KEYSET:指定當(dāng)游標(biāo)打開(kāi)時(shí),游標(biāo)中行的成員身份和順序已經(jīng)固定。對(duì)行進(jìn)行唯一標(biāo)識(shí)的鍵集內(nèi)置在tempdb內(nèi)一個(gè)稱為keyset的表中。OPTIMISTIC:指定如果行自從被讀入游標(biāo)以來(lái)已得到更新,則通過(guò)游標(biāo)進(jìn)行的定位更新或定位刪除不會(huì)成功。當(dāng)將行讀入游標(biāo)時(shí)SQLServer不會(huì)鎖定行。相反,SQLServer使用timestamp列值的比較,或者如果表沒(méi)有timestamp列,則使用校驗(yàn)和值,以確定將行讀入游標(biāo)后是否已修改該行。如果已修改該行,則嘗試進(jìn)行的定位更新或刪除將失敗。如果還指定了FAST_FORWARD,則不能指定OPTIMISTIC。9.4.2聲明游標(biāo)LOCAL:指定對(duì)于在其中創(chuàng)建的批處理989.4.2聲明游標(biāo)FORWARD_ONLY:指定游標(biāo)只能從第一行滾動(dòng)到最后一行。FETCHNEXT是唯一支持的提取選項(xiàng)。如果在指定FORWARD_ONLY時(shí)不指定STATIC、KEYSET和DYNAMIC關(guān)鍵字,則游標(biāo)作為DYNAMIC游標(biāo)進(jìn)行操作。如果FORWARD_ONLY和SCROLL均未指定,則除非指定STATIC、KEYSET或DYNAMIC關(guān)鍵字,否則默認(rèn)為FORWARD_ONLY。STATIC、KEYSET和DYNAMIC游標(biāo)默認(rèn)為SCROLL。
DYNAMIC:定義一個(gè)游標(biāo),以反映在滾動(dòng)游標(biāo)時(shí)對(duì)結(jié)果集內(nèi)的各行所做的所有數(shù)據(jù)更改。行的數(shù)據(jù)值、順序和成員身份在每次提取時(shí)都會(huì)更改。動(dòng)態(tài)游標(biāo)不支持ABSOLUTE提取選項(xiàng)
FAST_FORWARD:指定啟用了性能優(yōu)化的FORWARD_ONLY、READ_ONLY游標(biāo)。如果指定了SCROLL或FOR_UPDATE,則不能也指定FAST_FORWARD。SCROLL_LOCKS:指定通過(guò)游標(biāo)進(jìn)行的定位更新或刪除保證會(huì)成功。將行讀取到游標(biāo)中以確保它們對(duì)隨后的修改可用時(shí),MicrosoftSQLServer將鎖定這些行。如果還指定了FAST_FORWARD或STATIC,則不能指定SCROLL_LOCKS。TYPE_WARNING:指定如果游標(biāo)從所請(qǐng)求的類型隱式轉(zhuǎn)換為另一種類型,則向客戶端發(fā)送警告消息。9.4.2聲明游標(biāo)FORWARD_ONLY:指定游標(biāo)只能999.4.2聲明游標(biāo)例如:使用SQL-92標(biāo)準(zhǔn)聲明一個(gè)用于訪問(wèn)teaching數(shù)據(jù)庫(kù)中student表信息的游標(biāo)。
USEteachingGODECLAREstudent_cursorCURSORFORSELECT*FROMstudentFORREADONLY9.4.2聲明游標(biāo)例如:使用SQL-92標(biāo)準(zhǔn)聲明一個(gè)用于訪1002.打開(kāi)游標(biāo) 游標(biāo)聲明之后,必須打開(kāi)才能使用。打開(kāi)游標(biāo)的語(yǔ)法格式如下:OPEN{{[GLOBAL]cursor_name}|cursor_variable_name}其中:GLOBAL:指定cursor_name是指全局游標(biāo)。cursor_name:已聲明的游標(biāo)的名稱。如果全局游標(biāo)和局部游標(biāo)都使用cursor_name作為其名稱,那么如果指定了GLOBAL,則cursor_name指的是全局游標(biāo);否則cursor_name指的是局部游標(biāo)。cursor_variable_name:游標(biāo)變量的名稱,該變量引用一個(gè)游標(biāo)。2.打開(kāi)游標(biāo)101注意:如果游標(biāo)聲明語(yǔ)句中使用了INSENSITIVE保留字,則OPEN產(chǎn)生一個(gè)臨時(shí)表來(lái)存放結(jié)果集。如果在結(jié)果集中任何一行數(shù)據(jù)的大小超過(guò)SQLServer定義的最大行尺寸時(shí),OPEN命令將失敗。INSENSITIVE表明SQLServer會(huì)將游標(biāo)定義所選取出來(lái)的數(shù)據(jù)記錄存放在一臨時(shí)表內(nèi)(建立在tempdb數(shù)據(jù)庫(kù)下),對(duì)該游標(biāo)的操作皆由臨時(shí)表來(lái)應(yīng)答。因此,對(duì)基本表的修改并不影響游標(biāo)提取數(shù)據(jù),即游標(biāo)不會(huì)隨著基本表內(nèi)容的改變而改變,同時(shí)也不會(huì)通過(guò)游標(biāo)來(lái)更新基本表。如果不使用該保留字,那么對(duì)基本表的更新、刪除都會(huì)反映到游標(biāo)中。打開(kāi)了游標(biāo),則可用@@cursor_rows全局變量來(lái)檢索游標(biāo)中的行數(shù)。注意:1029.4.3使用游標(biāo)3.讀取游標(biāo)
一旦游標(biāo)被成功打開(kāi),就可以從游標(biāo)中逐行地讀取數(shù)據(jù),以進(jìn)行相關(guān)處理。從游標(biāo)中讀取數(shù)據(jù)主要使用FETCH命令。其語(yǔ)法格式為:FETCH[[NEXT|PRIOR|FIRST|LAST|ABSOLUTE{n|@nvar}|RELATIVE{n|@nvar}]FROM]{{[GLOBAL]cursor_name}|cursor_variable_name}[INTO@variable_name[,...n]]9.4.3使用游標(biāo)3.讀取游標(biāo)一旦游標(biāo)被成功打開(kāi)103其中:NEXT:緊跟當(dāng)前行返回結(jié)果行,并且當(dāng)前行遞增為返回行。如果FETCHNEXT為對(duì)游標(biāo)的第一次提取操作,則返回結(jié)果集中的第一行。NEXT為默認(rèn)的游標(biāo)提取選項(xiàng)。PRIOR:返回緊鄰當(dāng)前行前面的結(jié)果行,并且當(dāng)前行遞減為返回行。如果FETCHPRIOR為對(duì)游標(biāo)的第一次提取操作,則沒(méi)有行返回并且游標(biāo)置于第一行之前。FIRST:返回游標(biāo)中的第一行并將其作為當(dāng)前行。LAST:返回游標(biāo)中的最后一行并將其作為當(dāng)前行。ABSOLUTE{n|@nvar}:如果n或@nvar為正數(shù),則返回從游標(biāo)頭開(kāi)始的第n行,并將返回行變成新的當(dāng)前行。如果n或@nvar為負(fù)數(shù),則返回從游標(biāo)末尾開(kāi)始的第n
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東省清遠(yuǎn)市2022-2023學(xué)年高三上學(xué)期期末教學(xué)質(zhì)量檢測(cè)英語(yǔ)試題
- 旅行社后勤管理工作概述
- 健身行業(yè)教練技能提升總結(jié)
- 餐飲行業(yè)市場(chǎng)推廣總結(jié)
- 服裝行業(yè)設(shè)計(jì)師工作經(jīng)驗(yàn)分享
- 皮革行業(yè)助理的工作概括
- 兒童用品行業(yè)營(yíng)業(yè)員工作總結(jié)
- 證券公司前臺(tái)工作總結(jié)
- 銀行業(yè)務(wù)培訓(xùn)總結(jié)
- 《漫話探險(xiǎn)》課件
- RTO工藝流程簡(jiǎn)介
- 語(yǔ)文新課標(biāo)背景下單元整體教學(xué):六下第4單元大單元設(shè)計(jì)
- 最高人民法院民事審判第一庭裁判觀點(diǎn)侵權(quán)責(zé)任卷
- 提高自我意識(shí)的方法
- 長(zhǎng)租公寓課件
- 《康復(fù)護(hù)理??啤氛n件
- 2024年度醫(yī)院肝膽胰脾外科帶教計(jì)劃課件
- 品質(zhì)部規(guī)劃方案
- JGJT157-2014 建筑輕質(zhì)條板隔墻技術(shù)規(guī)程
- 2023-2024學(xué)年福建省泉州市惠安縣八年級(jí)(上)學(xué)期期末數(shù)學(xué)試題(含解析)
- 喬木移栽、栽植施工技術(shù)方案及方法
評(píng)論
0/150
提交評(píng)論