




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
課程回顧數(shù)據(jù)查詢(xún)?cè)跀?shù)據(jù)庫(kù)中的編程本章綜述Transact-SQL(簡(jiǎn)稱(chēng)T-SQL)是SQLServer2008提供的一種交互式查詢(xún)語(yǔ)言。使用Transact-SQL編寫(xiě)應(yīng)用程序可以完成所有數(shù)據(jù)庫(kù)管理工作。對(duì)用戶(hù)來(lái)說(shuō),T-SQL語(yǔ)言是唯一可以和SQLServer2008的數(shù)據(jù)庫(kù)管理系統(tǒng)進(jìn)行交互的語(yǔ)言。任何應(yīng)用程序,只要向數(shù)據(jù)庫(kù)管理系統(tǒng)發(fā)出命令以獲得數(shù)據(jù)庫(kù)管理系統(tǒng)的響應(yīng),最終都必須體現(xiàn)為以T-SQL語(yǔ)句為表現(xiàn)形式的指令。函數(shù)豐富了數(shù)據(jù)庫(kù)的信息處理功能,而游標(biāo)則提供了對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)靈活處理的方式,可實(shí)現(xiàn)對(duì)數(shù)據(jù)信息進(jìn)行復(fù)雜處理的功能。本章結(jié)構(gòu)8.1Transact–SQL語(yǔ)言基礎(chǔ)8.2變量與運(yùn)算符8.3流程控制語(yǔ)句8.4系統(tǒng)內(nèi)置函數(shù)8.5用戶(hù)自定義函數(shù)8.6游標(biāo)的創(chuàng)建與使用技能展示:了解T-SQL語(yǔ)言的基本元素掌握T-SQL流程控制語(yǔ)句熟悉T-SQL系統(tǒng)內(nèi)置函數(shù)熟練掌握用戶(hù)自定義函數(shù)的創(chuàng)建與使用了解游標(biāo)的創(chuàng)建與使用8.1Transact–SQL語(yǔ)言基礎(chǔ)SQL與T-SQL的不同T-SQL的分類(lèi)標(biāo)識(shí)符的命名規(guī)則批處理的概念注釋的使用方法8.1.1SQL與T-SQL概述
8.1.2T-SQL語(yǔ)言的基礎(chǔ)知識(shí)
開(kāi)封大學(xué)信息工程學(xué)院8.1.1SQL與T-SQL概述SQL語(yǔ)言:結(jié)構(gòu)化查詢(xún)語(yǔ)言,是一種數(shù)據(jù)庫(kù)查詢(xún)和程序設(shè)計(jì)語(yǔ)言,用于存取數(shù)據(jù)以及查詢(xún)、更新和管理關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)。T-SQL語(yǔ)言:T-SQL語(yǔ)言是微軟在SQL語(yǔ)言基礎(chǔ)上發(fā)展起來(lái)的擴(kuò)充語(yǔ)言,除了提供標(biāo)準(zhǔn)的SQL命令之外,還對(duì)SQL語(yǔ)言做了許多補(bǔ)充,提供了如變量聲明、流程控制語(yǔ)言、功能函數(shù)等功能。開(kāi)封大學(xué)信息工程學(xué)院T-SQL語(yǔ)言分類(lèi):數(shù)據(jù)定義語(yǔ)言(DDL,DataDefinitionLanguage)數(shù)據(jù)操縱語(yǔ)言(DML,DataManipulationLanguage)數(shù)據(jù)控制語(yǔ)言(DCL,DataControlLanguage)T-SQL增加的語(yǔ)言元素?cái)?shù)據(jù)定義語(yǔ)言(DDL)的主要語(yǔ)句及功能數(shù)據(jù)定義語(yǔ)言主要用于對(duì)數(shù)據(jù)庫(kù)以及數(shù)據(jù)庫(kù)中的各種的對(duì)象進(jìn)行創(chuàng)建、刪除、修改等操作語(yǔ)句功能CREATE創(chuàng)建數(shù)據(jù)庫(kù)或數(shù)據(jù)庫(kù)對(duì)象ALTER對(duì)數(shù)據(jù)庫(kù)或數(shù)據(jù)庫(kù)對(duì)象進(jìn)行修改DROP刪除數(shù)據(jù)庫(kù)或數(shù)據(jù)庫(kù)對(duì)象數(shù)據(jù)操縱語(yǔ)言(DML)主要語(yǔ)句及功能數(shù)據(jù)操作語(yǔ)言主要用于操作數(shù)據(jù)庫(kù)中的各種對(duì)象,查詢(xún)、添加、修改和刪除數(shù)據(jù)中的數(shù)據(jù)。語(yǔ)句功能SELECT從表或視圖中檢索數(shù)據(jù)INSERT將數(shù)據(jù)插入到表或視圖中UPDATE修改表或視圖中的數(shù)據(jù)DELETE從表或視圖刪除數(shù)據(jù)數(shù)據(jù)控制語(yǔ)言(DCL)主要語(yǔ)句及功能數(shù)據(jù)控制語(yǔ)言就是用來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行安全管理的,它包括用來(lái)設(shè)置或更改數(shù)據(jù)庫(kù)用戶(hù)或角色權(quán)限的語(yǔ)句,以確保數(shù)據(jù)庫(kù)中的數(shù)據(jù)和操作不被未經(jīng)授權(quán)的用戶(hù)使用和執(zhí)行語(yǔ)句功能GRANT授予權(quán)限REVOKE收回權(quán)限D(zhuǎn)ENY收回權(quán)限、并禁止從其他角色繼承許可權(quán)限T-SQL增加的語(yǔ)言元素T-SQL增加的語(yǔ)言元素不是ANSISQL所包含的內(nèi)容,而是微軟為了用戶(hù)編程的方便而增加的語(yǔ)言元素,這些語(yǔ)言元素包括變量、元素符、函數(shù)、流程控制語(yǔ)句、注釋等。8.1.2T-SQL語(yǔ)言的基礎(chǔ)知識(shí)標(biāo)識(shí)符標(biāo)識(shí)符是指用戶(hù)在SQLServer中定義的服務(wù)器、數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)對(duì)象(如表、視圖、索引、觸發(fā)器等)、變量和列名等對(duì)象名稱(chēng)。分類(lèi):常規(guī)標(biāo)識(shí)符分隔標(biāo)識(shí)符 常規(guī)標(biāo)識(shí)符的命名規(guī)則標(biāo)識(shí)符長(zhǎng)度可以為1-128個(gè)字符。但是,對(duì)于本地臨時(shí)表,標(biāo)識(shí)符最多只能有116個(gè)字符。標(biāo)識(shí)符的首字符必須為Unicode3.2標(biāo)準(zhǔn)所定義的字母或下劃線(_)、at符號(hào)(@)、數(shù)字符號(hào)(#)。標(biāo)識(shí)符第一個(gè)字符的后續(xù)字符可以為Unicode3.2標(biāo)準(zhǔn)所定義的字母、數(shù)字或@、#、$、_符號(hào)。標(biāo)識(shí)符內(nèi)不能嵌入空格或其他特殊字符。標(biāo)識(shí)符不能與SQLServer中的保留關(guān)鍵字同名?!咀⒁狻吭赟QLServer中,某些位于標(biāo)識(shí)符開(kāi)頭位置的符號(hào)具有特殊意義。為了避免混淆,不應(yīng)使用以這些特殊意義開(kāi)頭的名稱(chēng)。以“@”符號(hào)開(kāi)頭的標(biāo)識(shí)符表示局部變量或參數(shù)。以“#”符號(hào)開(kāi)頭的標(biāo)識(shí)符表示臨時(shí)表或過(guò)程。以“##”符號(hào)開(kāi)頭的標(biāo)識(shí)符表示全局臨時(shí)對(duì)象。以“@@”符號(hào)開(kāi)頭的標(biāo)識(shí)符為某些T-SQL函數(shù)的名稱(chēng)。分隔標(biāo)識(shí)符分隔標(biāo)識(shí)符允許在標(biāo)識(shí)符中使用SQLServer保留關(guān)鍵字或常規(guī)標(biāo)識(shí)符中不允許使用的一些特殊字符,這是由雙引號(hào)(”)和方括號(hào)([])進(jìn)行分隔的標(biāo)識(shí)符。批處理批處理是同時(shí)從應(yīng)用程序發(fā)送到SQLServer并得以執(zhí)行的一組單條或多條T-SQL語(yǔ)句,用GO語(yǔ)句作為批處理的結(jié)束標(biāo)志。若沒(méi)有GO語(yǔ)句,默認(rèn)所有的語(yǔ)句屬于一個(gè)批處理。SQLServer的程序發(fā)送和編譯以批處理為一個(gè)程序執(zhí)行單元。如果一個(gè)批處理中任何一條語(yǔ)句有語(yǔ)法錯(cuò)誤(例如引用不存在的對(duì)象),則整個(gè)批處理都不能執(zhí)行。但是通過(guò)編譯的批處理語(yǔ)句,若其中的某條語(yǔ)句運(yùn)行時(shí)發(fā)生錯(cuò)誤(例如違反約束),則錯(cuò)誤語(yǔ)句之前所執(zhí)行的語(yǔ)句正常執(zhí)行(批處理位于事務(wù)中并且錯(cuò)誤導(dǎo)致事務(wù)回滾的情況例外)。批處理的使用規(guī)則CREATEDEFAULT創(chuàng)建默認(rèn)值、CREATERULE創(chuàng)建規(guī)則、CREATEVIEW創(chuàng)建視圖、CREATEPROCEDURE創(chuàng)建存儲(chǔ)過(guò)程、CREATETRIGGER創(chuàng)建觸發(fā)器對(duì)象等,都必須單獨(dú)作為一個(gè)批處理,不能與其他語(yǔ)句放在一個(gè)批處理中。CHECK檢查約束不能在同一個(gè)批處理中既定義又使用。規(guī)則和默認(rèn)不能在同一個(gè)批處理中既綁定到列又被使用。不能在修改表中的一個(gè)字段后,立即在同一個(gè)批處理中引用該字段。局部變量的作用域限制在一個(gè)批處理中,不能在GO語(yǔ)句之后再次引用該變量?!纠?-1】查看設(shè)備表中所有的空調(diào)的信息,并創(chuàng)建視圖“view_cond_inf”,然后查詢(xún)“view_cond_inf”視圖中的信息。USEbuildGOCREATEVIEWview_cond_infASSELECT*FROMT_FacilityWHEREFacilityNamelike'%空調(diào)%'GOSELECT*FROMview_cond_infGO注釋單行注釋?zhuān)?-注釋內(nèi)容多行注釋?zhuān)?*注釋內(nèi)容*/【例8-2】對(duì)完成【例8-1】的批處理語(yǔ)句添加注釋?zhuān)M(jìn)行說(shuō)明。/*以下內(nèi)容完成
view_cond_inf視圖的創(chuàng)建及查詢(xún)操作*/USEbuild--打開(kāi)build數(shù)據(jù)庫(kù)GO--創(chuàng)建view_cond_inf視圖CREATEVIEWview_cond_infASSELECT*FROMT_FacilityWHEREFacilityNamelike'%空調(diào)%'GO--查詢(xún)view_cond_inf視圖中的所有信息SELECT*FROMview_cond_infGO8.2變量與運(yùn)算符
局部變量的聲明與使用全局變量的使用常用運(yùn)算符的使用運(yùn)算符的優(yōu)先級(jí)8.2.1變量
8.2.2運(yùn)算符
開(kāi)封大學(xué)信息工程學(xué)院8.2.1變量局部變量與全局變量局部變量(用戶(hù)自定義變量)形式:@***作用:用于臨時(shí)存儲(chǔ)各種類(lèi)型的數(shù)據(jù)全局變量形式:@@***作用:有系統(tǒng)提供的有確定值的變量,用戶(hù)不能定義也不能修改全局變量局部變量聲明語(yǔ)法格式:DECLARE{@變量名數(shù)據(jù)類(lèi)型[(長(zhǎng)度)]}[,…n]賦值語(yǔ)法格式:SET@局部變量=表達(dá)式SELECT{@局部變量=表達(dá)式}[,…n]顯示語(yǔ)法格式:PRINT表達(dá)式SELECT表達(dá)式[,…n]作用域:局部變量的作用域是在一個(gè)批處理、一個(gè)存儲(chǔ)過(guò)程或一個(gè)觸發(fā)器內(nèi),其生命周期從定義開(kāi)始到它遇到的第一個(gè)GO語(yǔ)句或者到存儲(chǔ)過(guò)程、觸發(fā)器的結(jié)尾結(jié)束,即局部變量只在當(dāng)前的批處理、存儲(chǔ)過(guò)程、觸發(fā)器中有效【注意】局部變量必須以“@”開(kāi)頭。變量名必須符合標(biāo)識(shí)符的命名規(guī)則。變量的數(shù)據(jù)類(lèi)型可以是系統(tǒng)類(lèi)型,也可以是用戶(hù)自定義類(lèi)型,但不允許是text、ntext和image類(lèi)型。系統(tǒng)固定長(zhǎng)度的數(shù)據(jù)類(lèi)型不需要指定長(zhǎng)度。例如:DECLARE@namechar(6)--定義@name長(zhǎng)度為6的字符型變量DECLARE@iint,@addressvarchar(30)--定義@i整型變量和@address長(zhǎng)度為30的變長(zhǎng)字符型變量【注意】SET命令只能一次給一個(gè)變量賦值,而SELECT命令一次可以給多個(gè)變量賦值,兩種格式可以通用,建議首選SET。用SET命令時(shí),表達(dá)式中可以包含SELECT語(yǔ)句子查詢(xún),但只能是集合函數(shù)返回的單值,且必須用圓括號(hào)括起來(lái)。SELECT也可以直接使用查詢(xún)的單值結(jié)果給局部變量賦值。如:SELECT@局部變量=表達(dá)式或字段名FROM表名WHERE條件【注意】使用PRINT只能有一個(gè)表達(dá)式,其值在查詢(xún)后的“消息”窗口顯示。使用SELECT相當(dāng)于進(jìn)行無(wú)數(shù)據(jù)源檢索,可以有多個(gè)表達(dá)式,其結(jié)果在查詢(xún)后的“網(wǎng)格”子窗口顯示。在一個(gè)腳本中,最好不要混合使用這兩種輸出方式,因?yàn)檫@樣的話需要切換兩個(gè)窗口來(lái)查看數(shù)據(jù)結(jié)果?!纠?-3】查詢(xún)?cè)O(shè)備表,使用@price存放設(shè)備表中單價(jià)最高的物品價(jià)格,使用@name存放單價(jià)最高的設(shè)備的設(shè)備名,把這兩個(gè)局部變量值輸出。USEbuildDECLARE@namenvarchar(8),@priceintSET@price=(selectMAX(Price)FROMT_Facility)SELECT@name=FacilityNameFROMT_FacilityWHEREPrice=@pricePRINT'最高單價(jià):'PRINT@pricePRINT'單價(jià)最高的設(shè)備名:'+@name方法一:USEbuildDECLARE@namenvarchar(8),@priceintSET@price=(selectMAX(Price)FROMT_Facility)SELECT@name=FacilityNameFROMT_FacilityWHEREPrice=@priceSELECT@priceAS最高單價(jià),@nameAS設(shè)備名方法二:【例8-4】請(qǐng)找出下面程序中的錯(cuò)誤DECLARE@iintSET@i=100PRINT@iGOPRINT@iGO全局變量特點(diǎn):全局變量是由系統(tǒng)提供的有確定值的變量,用戶(hù)不能自己定義全局變量,也不能用SET語(yǔ)句來(lái)修改全局變量的值格式:系統(tǒng)全局變量都是以@@開(kāi)頭的全局變量含義@@VERSION返回運(yùn)行SQLServer數(shù)據(jù)庫(kù)的服務(wù)器名稱(chēng)@@LANGUAGE返回當(dāng)前所用語(yǔ)言的名稱(chēng)@@ROWCOUNT返回受前一條SQL語(yǔ)句影響的行數(shù)@@ERROR返回執(zhí)行的上一個(gè)T-SQL語(yǔ)句的錯(cuò)誤號(hào)【例8-5】使用全局變量@@VERSION查看當(dāng)前數(shù)據(jù)庫(kù)的版本信息。運(yùn)算符算術(shù)運(yùn)算符比較運(yùn)算符邏輯運(yùn)算符位運(yùn)算符字符串連接運(yùn)算符算術(shù)運(yùn)算符算術(shù)運(yùn)算符用于對(duì)表達(dá)式進(jìn)行數(shù)學(xué)運(yùn)算,表達(dá)式中的各項(xiàng)可以是任何數(shù)值數(shù)據(jù)類(lèi)型。運(yùn)算符含義+(加)加法-(減)減法*(乘)乘法/(除)除法%(取模)求模,返回一個(gè)除法運(yùn)算的整數(shù)余數(shù)比較運(yùn)算符比較運(yùn)算符用于對(duì)兩個(gè)表達(dá)式進(jìn)行比較,可以用于除了text、ntext或image數(shù)據(jù)類(lèi)型的所有表達(dá)式,比較結(jié)果是布爾數(shù)據(jù)類(lèi)型,可取以下三個(gè)邏輯值之一:TRUE:真,條件成立。FALSE:假,條件不成立。UNKNOWN:不確定,是某個(gè)數(shù)據(jù)與NULL比較的結(jié)果。運(yùn)算符含義=等于<小于>大于<=小于等于>=大于等于<>不等于!=不等于(非ISO標(biāo)準(zhǔn))!<不小于(非ISO標(biāo)準(zhǔn))!>不大于(非ISO標(biāo)準(zhǔn))邏輯運(yùn)算符邏輯運(yùn)算符用于對(duì)某些條件進(jìn)行測(cè)試,以獲得真實(shí)情況,返回值為T(mén)RUE或FALSE。運(yùn)算符含義NOT邏輯非,對(duì)任何布爾表達(dá)式的結(jié)果取反AND邏輯與,如果兩個(gè)布爾表達(dá)式都為T(mén)RUE,則結(jié)果為T(mén)RUEOR邏輯或,如果兩個(gè)布爾表達(dá)式中任何一個(gè)為T(mén)RUE,則結(jié)果為T(mén)RUEALL如果一組的比較都為T(mén)RUE,則結(jié)果為T(mén)RUEANY如果一組的比較中任何一個(gè)返回TRUE,則結(jié)果為T(mén)RUEBETWEEN如果操作數(shù)在指定范圍內(nèi)容,則結(jié)果為T(mén)RUEEXISTS如果子查詢(xún)包含一些行,則結(jié)果為T(mén)RUEIN如果操作數(shù)等于表達(dá)式列表中的一個(gè),則結(jié)果為T(mén)RUELIKE如果操作數(shù)與一種模式相匹配,則結(jié)果為T(mén)RUESOME如果在一組比較中,有些為T(mén)RUE,則結(jié)果為T(mén)RUEANY、ALL、SOMEANY、ALL、SOME運(yùn)算符主要用于比較特定值和結(jié)果集中的所有值,一般情況下,要與比較運(yùn)算符配合使用。其中ANY與SOME的作用相同。語(yǔ)法如下:例如:@i>ALL(SELECTPriceFROMT_Facility)@i>ANY(SELECTPriceFROMT_Facility)特定值{=|>|<|>=|<=|<>|…}{ANY|ALL|SOME}(SELECT語(yǔ)句)ININ運(yùn)算符主要用于測(cè)試特定值是否在子查詢(xún)的結(jié)果集或給定的一些值之中,只要與其中任何一個(gè)值相等,即返回TRUE。語(yǔ)法如下:例如:@iIN(SELECTPriceFROMT_Facility)@iNOTIN(5,2,3)特定值[NOT]IN(SELECT語(yǔ)句|值[,…n])BETWEENBETWEEN主要用于判斷表達(dá)式的值是否在某個(gè)范圍內(nèi),若在指定范圍內(nèi)結(jié)果為T(mén)RUE。語(yǔ)法如下:例如:SELECT*FROMT_FacilityWHEREPriceBETWEEN1000AND5000[NOT]BETWEEN表達(dá)式1AND表達(dá)式2LIKELIKE用于測(cè)試特定字符串是否與制定模式相匹配,若匹配,返回TRUE。模式可以包含普通字符和通配字符。語(yǔ)法如下:特定字符串[NOT]LIKE模式[ESCAPEescape_character]通配符含義%代表0或多個(gè)任意字符_(下劃線)代表單個(gè)任意字符[]指定范圍(如[a-f]、[0-9])或集合(如[abcdef])中的任何單個(gè)字符[^]指定不屬于范圍(如[^a-f]、[^0-9])或集合(如[^abcdef])中的任何單個(gè)字符例如:select*fromD_DepartmentwhereDepartmentlike'%學(xué)院'
EXISTSEXISTS運(yùn)算符主要用于測(cè)試一個(gè)子查詢(xún)的結(jié)果集是否不為空,若結(jié)果集不為空,返回TRUE。語(yǔ)法如下:[NOT]EXISTS(SELECT語(yǔ)句)位運(yùn)算符字符串連接運(yùn)算符:+運(yùn)算符運(yùn)算規(guī)則&(與)兩個(gè)位均為1時(shí),結(jié)果為1,否則為0|(或)只要一個(gè)位為1時(shí),結(jié)果為1,否則為0^(異或)兩個(gè)位值不同時(shí),結(jié)果為1,否則為0運(yùn)算符優(yōu)先級(jí)優(yōu)先級(jí)運(yùn)算符1+(正)、-(負(fù))、~(位非)2*(乘)、/(除)、%(取模)3+(加)、-(減)、+(連接)4=、>、<、>=、<=、<>、!=、!>、!<5^(位異或)、&(位與)、|(位或)6NOT7AND8ALL、ANY、BETWEEN、IN、LIKE、OR、SOME9=(賦值)8.3流程控制語(yǔ)句8.3.1BEGIN…END語(yǔ)句
8.3.2IF…ELSE語(yǔ)句8.3.3CASE…END語(yǔ)句
順序結(jié)構(gòu)
分支結(jié)構(gòu)
開(kāi)封大學(xué)信息工程學(xué)院8.3.4WHILE語(yǔ)句
循環(huán)結(jié)構(gòu)
8.3.1BEGIN…END語(yǔ)句語(yǔ)法:作用:不論多少個(gè)語(yǔ)句,放在BEGIN…END中間就構(gòu)成一個(gè)獨(dú)立的語(yǔ)句塊,被系統(tǒng)當(dāng)作一個(gè)整體單元來(lái)處理BEGIN
語(yǔ)句1
語(yǔ)句2…END8.3.2IF…ELSE條件語(yǔ)句語(yǔ)法:執(zhí)行過(guò)程:先判斷條件表達(dá)式的值,若為T(mén)RUE,則執(zhí)行IF后面的語(yǔ)句塊,若為FALSE,則執(zhí)行ELSE后面的語(yǔ)句,沒(méi)有ELSE子句時(shí)則順序執(zhí)行后續(xù)語(yǔ)句。IF邏輯條件表達(dá)式語(yǔ)句塊1[ELSE
語(yǔ)句塊2]【注意】條件表達(dá)式中可以包含SELECT子查詢(xún),但必須用圓括號(hào)括起來(lái)語(yǔ)句塊1、語(yǔ)句塊2可以是單個(gè)SQL語(yǔ)句,如果有兩個(gè)以上語(yǔ)句必須放在BEGIN…END語(yǔ)句塊中【例8-6】查詢(xún)部門(mén)表中部門(mén)ID為1101的部門(mén),若查到該部門(mén)則顯示其名稱(chēng),否則顯示“沒(méi)有該部門(mén)”。USEbuildGODECLARE@nameNVARCHAR(15)IFEXISTS(SELECT*FROMD_DepartmentWHEREDepartmentNO='1101')BEGINSELECT@name=DepartmentFROMD_DepartmentWHEREDepartmentNO='1101'PRINT'---1101部門(mén)的信息如下---'PRINT'部門(mén)名稱(chēng):'+@nameENDELSEPRINT'沒(méi)有該部門(mén)'
8.3.3CASE…END語(yǔ)句CASE…END語(yǔ)句根據(jù)不同的條件返回不同的值,它提供了比IF…ELSE語(yǔ)句更多的選擇和判斷機(jī)會(huì),使用它可以在實(shí)現(xiàn)多分支判斷時(shí)避免復(fù)雜的IF…ELSE語(yǔ)句嵌套。CASE…END語(yǔ)句有兩種格式簡(jiǎn)單CASE…END語(yǔ)句搜索CASE…END語(yǔ)句。簡(jiǎn)單CASE…END表達(dá)式格式:功能:根據(jù)測(cè)試表達(dá)式的值得到一個(gè)對(duì)應(yīng)值CASE測(cè)試表達(dá)式
WHEN常量值1THEN結(jié)果表達(dá)式1[{WHEN常量值2THEN結(jié)果表達(dá)式2}[…n]][ELSE結(jié)果表達(dá)式n]END執(zhí)行過(guò)程:先計(jì)算測(cè)試表達(dá)式的值,將測(cè)試表達(dá)式的值按順序依次與WHEN指定的各個(gè)常量值進(jìn)行比較:如果找到了第一個(gè)相等的常量值,則整個(gè)CASE表達(dá)式取相應(yīng)THEN指定的結(jié)果表達(dá)式的值,之后不再比較,跳出CASE…END語(yǔ)句。如果找不到相等的常量值,則取ELSE指定的結(jié)果表示n的值。如果找不到相等的常量值也沒(méi)有使用ELSE,則返回NULL?!纠?-7】查詢(xún)?cè)O(shè)備表中設(shè)備的主要信息,把設(shè)備表中的設(shè)備類(lèi)別編號(hào)轉(zhuǎn)換為設(shè)備類(lèi)別名稱(chēng)顯示出來(lái)。SELECTFacilityName,Category=CASEClassificationWHEN1THEN'辦公用品'WHEN2THEN'教室用品'WHEN3THEN'宿舍用品'END,--類(lèi)別字段到此結(jié)束,后面還有其他字段,逗號(hào)不能丟
Model,Price,QuantityFROMT_Facility搜索CASE…END表達(dá)式格式:功能:根據(jù)某個(gè)條件得到一個(gè)對(duì)應(yīng)值CASEWHEN條件表達(dá)式1THEN結(jié)果表達(dá)式1[{WHEN條件表達(dá)式2THEN結(jié)果表達(dá)式2}[…n]][ELSE結(jié)果表達(dá)式n]END執(zhí)行過(guò)程:按順序依次判斷WHEN指定的條件表達(dá)式的值,遇到第一個(gè)為T(mén)RUE的條件表達(dá)式,則整個(gè)CASE表達(dá)式取相應(yīng)THEN指定的結(jié)果表達(dá)式的值,之后不再比較,結(jié)束并跳出CASE…END語(yǔ)句。如果找不到為T(mén)RUE的條件表達(dá)式,則取ELSE指定的結(jié)果表達(dá)式n的值。如果找不到為T(mén)RUE的條件表達(dá)式也沒(méi)有使用ELSE,則返回NULL?!纠?-8】查詢(xún)?cè)O(shè)備表,根據(jù)設(shè)備的使用時(shí)間顯示不同的提示信息。SELECTFacilityName,Model,Price,Quantity,
使用時(shí)間=year(GETDATE())-year(BuyTime),
提示信息=CASEWHENyear(GETDATE())-year(BuyTime)>=8THEN'超期服役'WHENyear(GETDATE())-year(BuyTime)>=2THEN'可以維持'ELSE'剛剛購(gòu)置,新的'ENDFROMT_Facility8.3.4WHILE語(yǔ)句格式:執(zhí)行過(guò)程:先判斷條件表達(dá)式的值,若為T(mén)RUE,則執(zhí)行BEGIN…END之間的循環(huán)體語(yǔ)句,執(zhí)行到END時(shí)返回到WHILE再次判斷條件表達(dá)式的值,若為T(mén)RUE,則再次執(zhí)行BEGIN…END之間的循環(huán)體語(yǔ)句,直到條件表達(dá)式為FALSE,則跳出循環(huán)體,繼續(xù)執(zhí)行后續(xù)語(yǔ)句。WHILE邏輯條件表達(dá)式
BEGIN
循環(huán)體語(yǔ)句系列…[BREAK]……[CONTINUE]……END【注意】條件表達(dá)式的值必須是TRUE或FALSE。如果條件表達(dá)式中含有SELECT語(yǔ)句,則必須用括號(hào)將SELECT語(yǔ)句括起來(lái)。
若在執(zhí)行循環(huán)體時(shí)遇到BREAK語(yǔ)句,則無(wú)條件跳出BEGIN…END。若在執(zhí)行循環(huán)體時(shí)遇到CONTINUE語(yǔ)句,則結(jié)束本輪循環(huán),不再執(zhí)行之后的循環(huán)體語(yǔ)句,返回到WHILE再次判斷條件表達(dá)式的值【例8-9】計(jì)算1+2+3+……+100的和。DECLARE@iint,@sumintSET@i=1SET@sum=0WHILE@i<=100BEGINSET@sum=@sum+@iSET@i=@i+1ENDPRINT'1到100的和為:'PRINT@sum8.3.5其它流程控制語(yǔ)句WAITFOR語(yǔ)句
功能:使程序暫停指定的時(shí)間后再繼續(xù)執(zhí)行格式:WAITFOR{DELAY‘時(shí)間’|TIME’時(shí)間’}注意:DELAY指定暫停的時(shí)間長(zhǎng)短——相對(duì)時(shí)間。TIME指定暫停到什么時(shí)間再重新執(zhí)行程序——絕對(duì)時(shí)間?!畷r(shí)間’參數(shù)必須是datetime類(lèi)型的時(shí)間部分,格式為“hh:mm:ss”,不能含有日期部分?!纠?-10】在5秒鐘之后對(duì)設(shè)備表進(jìn)行查詢(xún),在23時(shí)對(duì)部門(mén)表進(jìn)行查詢(xún)。USEbuildGOBEGINWAITFORDELAY'00:00:5'SELECT*FROMT_FacilityWAITFORTIME'23:00:00'SELECT*FROMD_DepartmentEND8.4系統(tǒng)內(nèi)置函數(shù)
8.4.1數(shù)學(xué)函數(shù)8.4.2字符串函數(shù)8.4.3日期和時(shí)間函數(shù)8.4.4類(lèi)型轉(zhuǎn)換函數(shù)系統(tǒng)內(nèi)置函數(shù)
開(kāi)封大學(xué)信息工程學(xué)院函數(shù)是指一組編譯好的T-SQL語(yǔ)句,它們可以帶有一個(gè)或多個(gè)參數(shù),也可以不帶參數(shù)。函數(shù)執(zhí)行的結(jié)果為返回一個(gè)數(shù)值、數(shù)值集合,或者沒(méi)有返回值僅僅是執(zhí)行一些操作。SQLServer2008支持兩種函數(shù)類(lèi)型:系統(tǒng)內(nèi)置函數(shù)和用戶(hù)定義函數(shù)。在SQLServer2008中,數(shù)據(jù)庫(kù)引擎提供了豐富的系統(tǒng)內(nèi)置函數(shù)。可以通過(guò)SQLServerManagementStudio的【對(duì)象資源管理器】窗口,查看所有的系統(tǒng)內(nèi)置函數(shù),8.4.1數(shù)學(xué)函數(shù)函數(shù)功能說(shuō)明Abs(x)返回x的絕對(duì)值A(chǔ)cos(x)返回x的反余弦值(弧度)Atn2(x1,x2)返回介于x1和x2之間的近似反正切值(弧度)Ceiling(x)返回不小于x的最小整數(shù)Cos(x)返回x(弧度)的余弦值Cot(x)返回x(弧度)的余切值Degrees(x)返回x(弧度)的對(duì)應(yīng)的角度值Exp(x)返回ex的指數(shù)函數(shù)Floor(x)返回不大于x的最大整數(shù)Log(x)返回以e為底的自然對(duì)數(shù)Log10(x)返回以10為底的對(duì)數(shù)Power(x,y)返回x的y次方xyRand(x)返回0到1之間的隨機(jī)值Round(x1,x2)返回x1四舍五入到x2指定精度后的數(shù)值Sin(x)返回x(弧度)的正弦值Square(x)返回x的平方Sqrt(x)返回x的平方根【說(shuō)明】函數(shù)參數(shù)x可以是數(shù)值常量、變量、字段名、數(shù)值函數(shù)或算術(shù)表達(dá)式。x的數(shù)據(jù)類(lèi)型可以是各種數(shù)值型或貨幣型的,有的函數(shù)值類(lèi)型與x類(lèi)型相同,有的需要將x轉(zhuǎn)換成float,其結(jié)果也是float類(lèi)型的。功能說(shuō)明中得到的值是函數(shù)返回值,使用函數(shù)后參數(shù)x的值不變。8.4.2字符串函數(shù)函數(shù)功能說(shuō)明Ascii(A)返回字符串A第一個(gè)字符的ASCII碼Char(x)返回ASCII碼為整數(shù)x的字符Left(A,x)從字符串A的左邊(前端)取x個(gè)字符的子串Len(A)返回字符串A去掉尾部空格后所包含的字符個(gè)數(shù)(不是字節(jié)數(shù)),如果是空串,函數(shù)返回0Lower(A)返回將字符串A中所有字母變?yōu)樾?xiě)字母的字符串Ltrim(A[,‘B’])將字符串A左邊字符B刪掉,缺省為刪掉空格Patindex(A,B)返回模式A在字符串B中第一次出現(xiàn)的起始位置Replace(A,B[,C])在字符串A中查找字符串B,并將其替換為字符串C,省略C或?yàn)镹ULL則在A中刪掉BRight(A,x)從字符串A的右邊(尾部)取x個(gè)字符的子串Rtrim(A[,’B’])將字符串A右邊字符B刪掉,缺省為刪掉空格Soundex(A)返回由4個(gè)字符組成的代碼,用于評(píng)估兩個(gè)字符串的相似性Space(x)得到有x個(gè)空格的字符串Str(x[,len[,d]])將x的數(shù)值轉(zhuǎn)換為數(shù)字字符串,包括符號(hào)和小數(shù)點(diǎn)Stuff(A,start,len,B)把字符串A從start開(kāi)始長(zhǎng)為len的字符串用字符串B替換Substring(A,x[,y])從字符串A的x字符位置開(kāi)始取出y個(gè)字符的子串,如果省略y取到字符串A的最后一個(gè)字符,如果x取負(fù)值則從后向前數(shù)【說(shuō)明】函數(shù)參數(shù)x一般是整型的數(shù)值常量、變量、數(shù)值函數(shù)或算術(shù)表達(dá)式。函數(shù)參數(shù)A是字符串常量、變量、字段名、字符串函數(shù)或字符串表達(dá)式。A的數(shù)據(jù)類(lèi)型可以是各種字符型、寬字符型或二進(jìn)制類(lèi)型的,大部分只能處理char(n)、varchar(n)、nchar(n)、nvarchar(n)類(lèi)型或者可以轉(zhuǎn)換成這些類(lèi)型的數(shù)據(jù),只有少部分可以處理binary(n)、varbinary(n)、image、text、ntext類(lèi)型的數(shù)據(jù)。功能說(shuō)明中得到的字符串或子字符串是函數(shù)返回值,原字符串A的內(nèi)容不變?!纠?-11】使用Replace函數(shù)將字符串“Iamthebest”中的字符串“am”替換為“willbe”。PRINTReplace('Iamthebest','am','willbe')8.4.3日期和時(shí)間函數(shù)函數(shù)功能說(shuō)明Dateadd(yy|mm|dd,x,D)返回按第一個(gè)參數(shù)指定的項(xiàng)目D+x的新值Datediff(yy|mm|dd,D1,D2)返回按第一個(gè)參數(shù)指定的項(xiàng)目D2-D1的新值Datepart(時(shí)間參數(shù),日期)返回日期中時(shí)間參數(shù)指定部分的對(duì)應(yīng)整數(shù),如SECOND得到秒數(shù)Datename(時(shí)間參數(shù),日期)返回日期中時(shí)間參數(shù)指定部分的對(duì)應(yīng)字符串Day(D)返回D的日期數(shù)Getdate()返回系統(tǒng)的當(dāng)前日期和時(shí)間Getutcdate()返回表示當(dāng)前UTC時(shí)間(世界時(shí)間坐標(biāo)或格林尼治標(biāo)準(zhǔn)時(shí)間)值Month(D)返回D的月份值Year(D)返回D的年份值【說(shuō)明】
函數(shù)參數(shù)x一般是整型的數(shù)值常量、變量、數(shù)值函數(shù)或算術(shù)表達(dá)式。
D是日期時(shí)間型的常量、變量、字段名或日期時(shí)間函數(shù)。
D的格式應(yīng)該符合SETDATEFORMAT()命令設(shè)定的格式。功能說(shuō)明中得到的值是函數(shù)返回值,原日期時(shí)間D的內(nèi)容不變?!纠?-12】查詢(xún)?cè)O(shè)備表,計(jì)算出設(shè)備號(hào)為“6”的設(shè)備的使用時(shí)間。SELECTFacilityName,Model,Price,Quantity,
使用時(shí)間=year(GETDATE())-YEAR(BuyTime)FROMT_FacilitywhereFacilityNo=68.4.4類(lèi)型轉(zhuǎn)換函數(shù)函數(shù)功能說(shuō)明Cast(表達(dá)式
as數(shù)據(jù)類(lèi)型[(長(zhǎng)度)])將表達(dá)式的值轉(zhuǎn)換為指定的“數(shù)據(jù)類(lèi)型”Convert(數(shù)據(jù)類(lèi)型[(長(zhǎng)度)],表達(dá)式[,style])按style格式將表達(dá)式的值轉(zhuǎn)換成指定的“數(shù)據(jù)類(lèi)型”【說(shuō)明】函數(shù)中的表達(dá)式可以是任何有效的SQLServer表達(dá)式,所指定的數(shù)據(jù)類(lèi)型必須是系統(tǒng)的基本數(shù)據(jù)類(lèi)型而不能是用戶(hù)自定義的類(lèi)型。(長(zhǎng)度)用于需要指定長(zhǎng)度的數(shù)據(jù)類(lèi)型,不需要指定長(zhǎng)度的類(lèi)型可以省略。
Cast()函數(shù)只適用于轉(zhuǎn)換后不需要指定格式的數(shù)據(jù)類(lèi)型,如整數(shù)、普通字符串。Convert()函數(shù)可適合于任何類(lèi)型,其中Style可設(shè)置轉(zhuǎn)換后的格式:將datetime或smalldatetime型日期時(shí)間轉(zhuǎn)換為字符串的日期格式;將Real或float(p)型浮點(diǎn)數(shù)轉(zhuǎn)換為字符串的小數(shù)或指數(shù)格式;將Smallmoney或money貨幣型轉(zhuǎn)換為字符串的貨幣格式。
style參數(shù)見(jiàn)表8-17。不需要指定格式的類(lèi)型Style可以省略。style參數(shù)的有效值轉(zhuǎn)換后返回字符串的格式8(2位年份)108(4位年份)只轉(zhuǎn)換為時(shí)間:hh:mm:ss11(2位年份)111(4位年份)只轉(zhuǎn)換為日期:[yy]yy/mm/dd120(4位年份)yyyy-mm-ddhh:mm:ss0(Real或Float型浮點(diǎn)數(shù))默認(rèn)值,最多6位數(shù),必要時(shí)使用科學(xué)計(jì)數(shù)法1(Real或Float型浮點(diǎn)數(shù))最多8位數(shù),必要時(shí)使用科學(xué)計(jì)數(shù)法2(Real或Float型浮點(diǎn)數(shù))最多16位數(shù),必要時(shí)使用科學(xué)計(jì)數(shù)法0(貨幣型,轉(zhuǎn)換為字符型)默認(rèn)值,小數(shù)點(diǎn)左側(cè)數(shù)字不以逗號(hào)分隔,右側(cè)取兩位小數(shù)1(貨幣型,轉(zhuǎn)換為字符型)小數(shù)點(diǎn)左側(cè)數(shù)字每三位逗號(hào)分隔,右側(cè)取兩位小數(shù)2(貨幣型,轉(zhuǎn)換為字符型)小數(shù)點(diǎn)左側(cè)數(shù)字不以逗號(hào)分隔,右側(cè)取四位小數(shù)【例8-13】修改【例8-12】中該設(shè)備的使用時(shí)間的顯示。SELECTFacilityName,Model,Price,Quantity,
使用時(shí)間=Cast(year(GETDATE())-YEAR(BuyTime)asvarchar(2))+'年'FROMT_FacilitywhereFacilityNo=6【例8-14】掌握Convert函數(shù)的使用。DECLARE@ddatetime,@rreal,@mmoney--定義局部變量SET@d='2010/12/2010:10:36AM'SET@r=268886SET@m=9635225.3685PRINTconvert(varchar(30),@d,108)--結(jié)果為:10:10:36PRINTconvert(varchar(30),@d,111)--結(jié)果為:2012/12/20PRINTconvert(varchar(30),@d,120)--結(jié)果:2012-12-2010:10:36PRINTconvert(varchar(20),@r,0)--結(jié)果為:268886PRINTconvert(varchar(20),@r,1)--結(jié)果為:2.6888600e+005PRINTconvert(varchar(22),@r,2)--結(jié)果:.688860000000000e+005PRINTconvert(varchar(25),@m,0)--結(jié)果為:9635225.37PRINTconvert(varchar(25),@m,1)--結(jié)果為:9,635,225.37PRINTconvert(varchar(25),@m,2)--結(jié)果為:9635225.36858.5用戶(hù)自定義函數(shù)
CreateFunction語(yǔ)句函數(shù)的調(diào)用ALTERFUNCTION語(yǔ)句
DROPFUNCTION語(yǔ)句
8.5.1函數(shù)的定義與調(diào)用
8.5.2函數(shù)的修改與刪除開(kāi)封大學(xué)信息工程學(xué)院使用SQLServerManagementStudio創(chuàng)建、修改、刪除自定義函數(shù)
8.5.3使用SSMS編輯自定義函數(shù)
8.5.1用戶(hù)函數(shù)的定義與調(diào)用用戶(hù)函數(shù)的定義
語(yǔ)法格式:CREATEFUNCTION[所有者名稱(chēng).]函數(shù)名
[({@參數(shù)名稱(chēng)[AS]數(shù)據(jù)類(lèi)型[=默認(rèn)值][READONLY]}[,…n])]
RETURNS
返回值類(lèi)型
[WITH<標(biāo)量函數(shù)的選項(xiàng)>[,…n]][AS]BEGIN
函數(shù)體SQL語(yǔ)句
RETURN
數(shù)值表達(dá)式
END【說(shuō)明】
自定義函數(shù)必須在當(dāng)前數(shù)據(jù)庫(kù)中定義。函數(shù)名:必須符合標(biāo)識(shí)符構(gòu)成規(guī)則,在數(shù)據(jù)庫(kù)中名稱(chēng)必須惟一,省略所有者名稱(chēng)默認(rèn)為系統(tǒng)管理員dbo。
@參數(shù)名稱(chēng):用局部變量定義的形式參數(shù),用于接收調(diào)用函數(shù)時(shí)傳遞過(guò)來(lái)的參數(shù)。默認(rèn)值必須是常量,如果設(shè)定了默認(rèn)值則調(diào)用函數(shù)時(shí)若不提供參數(shù),形式參數(shù)自動(dòng)取默認(rèn)值。READONLY:指定不能在函數(shù)定義中更新或修改參數(shù)。如果參數(shù)類(lèi)型為用戶(hù)自定義的表類(lèi)型,則應(yīng)指定此選項(xiàng)。RETURNS指定返回值類(lèi)型,RETURN指定返回值,注意這兩個(gè)關(guān)鍵字的區(qū)別。標(biāo)量函數(shù)的選項(xiàng)常用為ENCRYPTION,用于將CREATEFUNCTION語(yǔ)句的原始文本轉(zhuǎn)換為模糊格式。模糊代碼的輸出在任何目錄視圖中都不能直接顯示。對(duì)系統(tǒng)表或數(shù)據(jù)庫(kù)文件沒(méi)有訪問(wèn)權(quán)限的用戶(hù)不能檢索模糊文本。用戶(hù)函數(shù)的調(diào)用自定義函數(shù)的調(diào)用與系統(tǒng)標(biāo)準(zhǔn)函數(shù)的調(diào)用相同,但必須寫(xiě)出“所有者名稱(chēng).函數(shù)名”并在圓括號(hào)內(nèi)給出參數(shù)。調(diào)用形式:所有者名稱(chēng).函數(shù)名(實(shí)參1,…,實(shí)參n)【例8-15】定義一個(gè)根據(jù)指定日期及當(dāng)前日期求出相對(duì)年限的函數(shù)“func_rela_yea()”,調(diào)用該函數(shù),查詢(xún)?cè)O(shè)備表,創(chuàng)建一個(gè)包含設(shè)備基本信息的“view_faci_inf”視圖,顯示設(shè)備的使用年限。USEbuildGOCREATEFUNCTIONfunc_rela_yea(@dateDatetime,@datenowDatetime)RETURNSintBEGINRETURNyear(@datenow)-year(@date)ENDGOCREATEVIEWview_faci_infASSELECTFacilityName,Model,
購(gòu)買(mǎi)時(shí)間=Convert(varchar(12),BuyTime,111),
使用年限=dbo.func_rela_yea(BuyTime,GETDATE())FROMT_FacilityGOSELECT*FROMview_faci_inf8.5.2用戶(hù)自定義函數(shù)的修改與刪除ALTERFUNCTION修改自定義函數(shù)DROPFUNCTION刪除自定義函數(shù)語(yǔ)法如下:DROPFUNCTION所有者名稱(chēng).函數(shù)名稱(chēng)[,…n]8.5.3使用SSMS編輯自定義函數(shù)在SQLServerManagementStudio中創(chuàng)建自定義函數(shù)【例8-16】定義顯示2位小數(shù)的貨幣格式函數(shù)“func_curr_sty()”
CREATEFUNCTIONfunc_curr_sty( --Addtheparametersforthefunctionhere @curr_valueSmallmoney)RETURNSvarchar(12)ASBEGIN --Declarethereturnvariablehere DECLARE@moneyvarchar(12) --AddtheT-SQLstatementstocomputethereturnvaluehere SELECT@money=Convert(varchar(12),@curr_value,0) --Returntheresultofthefunction RETURN@moneyENDGO【例8-17】使用自定義函數(shù)“func_curr_sty()”查詢(xún)?cè)O(shè)備表,顯示每種設(shè)備的金額總價(jià)。USEbuildGOSELECTFacilityName,Model,Price,Quantity,總價(jià)=dbo.func_curr_sty(Amount)FROMT_Facility使用SQLServerManagementStudio修改或刪除自定義函數(shù)8.6游標(biāo)的創(chuàng)建與使用游標(biāo)的用途游標(biāo)的特點(diǎn)8.6.2聲明游標(biāo)8.6.3打開(kāi)游標(biāo)8.6.4讀取數(shù)據(jù)8.6.5關(guān)閉游標(biāo)8.6.6釋放游標(biāo)8.6.1游標(biāo)的概念
游標(biāo)的使用開(kāi)封大學(xué)信息工程學(xué)院8.6.1游標(biāo)的概念作用:在T-SQL腳本程序、存儲(chǔ)過(guò)程、觸發(fā)器中對(duì)SELECT語(yǔ)句返回的結(jié)果集進(jìn)行逐行逐字段處理,把一個(gè)完整的數(shù)據(jù)表按行分開(kāi),一行一行的逐一提取記錄,并從這一記錄行中逐一提取各項(xiàng)數(shù)據(jù)。SQLServer2008中的游標(biāo)具有以下幾個(gè)特點(diǎn):游標(biāo)返回一個(gè)完整的結(jié)果集,但允許程序設(shè)計(jì)語(yǔ)言只調(diào)用集合中的一行。允許定位在結(jié)果集的特定行??梢詮慕Y(jié)果的當(dāng)前位置檢索一行或多行。支持對(duì)結(jié)果集中當(dāng)前位置的行進(jìn)行數(shù)據(jù)修改??梢詾槠渌脩?hù)對(duì)顯示在結(jié)果集中的數(shù)據(jù)庫(kù)數(shù)據(jù)所做的更改提供不同級(jí)別的可能性支持。提供腳本、存儲(chǔ)過(guò)程和觸發(fā)器中用于訪問(wèn)結(jié)果集中的數(shù)據(jù)的T-SQL語(yǔ)句。使用過(guò)程:定義聲明游標(biāo)→打開(kāi)游標(biāo)→從游標(biāo)中提取記錄并分離數(shù)據(jù)→關(guān)閉游標(biāo)→釋放游標(biāo)。8.6.2聲明游標(biāo)兩種定義方式基于SQL-92標(biāo)準(zhǔn)的定義語(yǔ)句T–SQL擴(kuò)展的游標(biāo)聲明語(yǔ)句
基于SQL-92標(biāo)準(zhǔn)的定義語(yǔ)句格式:DECLARE游標(biāo)名[INSENSITIVE][SCROLL]CURSORFORSELECT語(yǔ)句
[FOR{READONLY|UPDATA[OF字段名[,…n]]}]【說(shuō)明】INSENSITIVE定義游標(biāo)時(shí)自動(dòng)在系統(tǒng)tempdb數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)臨時(shí)表存儲(chǔ)游標(biāo)使用的數(shù)據(jù),在游標(biāo)使用過(guò)程中基表數(shù)據(jù)改變不影響游標(biāo)的數(shù)據(jù),但該游標(biāo)的數(shù)據(jù)不允許修改。省略該項(xiàng)表示游標(biāo)直接從基表中取得數(shù)據(jù),即游標(biāo)使用的數(shù)據(jù)將隨基表數(shù)據(jù)的變化而動(dòng)態(tài)變化。SCROLL表示該游標(biāo)可以在FETCH語(yǔ)句中任意指定數(shù)據(jù)的提取方式,省略該項(xiàng)表示該游標(biāo)僅支持NEXT順序提取方式。SELECT指定該游標(biāo)使用的結(jié)果集,不允許使用COMPUTE或INTO子句。READONLY表示只讀,該游標(biāo)中的數(shù)據(jù)不允許修改,即不允許在UPDATE或DELETE語(yǔ)句中引用該游標(biāo)。UPDATA[OF字段名[,…n]]表示在該游標(biāo)內(nèi)可以更新基本表的指定字段,省略字段名列表表示可以更新所有字段。T–SQL擴(kuò)展的游標(biāo)聲明語(yǔ)句DECLARE游標(biāo)名CURSOR[FORWARD_ONLY|SCROLL][STATIC|KEYSET|DYNAMIC|FAST_FORWARD][READ_ONLY|OPTIMISTIC][TYPE_WARNING]FORSELECT語(yǔ)句
[FORUPDATE[OF字段名[,…n]]]【說(shuō)明】FORWARD_ONLY指定該游標(biāo)為順序結(jié)果集,只能用NEXT向后方式順序提取記錄。SCROLL指定該游標(biāo)為滾動(dòng)結(jié)果集,可以使用向前、向后、定位方式提取記錄。STATIC與INSENSITIVE含義相同,在系統(tǒng)tempdb數(shù)據(jù)庫(kù)中創(chuàng)建臨時(shí)表存儲(chǔ)游標(biāo)使用的數(shù)據(jù),即游標(biāo)不會(huì)隨基本表內(nèi)容而變化,同時(shí)也無(wú)法通過(guò)游標(biāo)來(lái)更新基本表。KEYSET指定游標(biāo)中列的順序是固定的,并且在tempdb內(nèi)建立一個(gè)KEYSET表,基本表數(shù)據(jù)修改時(shí)能反映到游標(biāo)中。如果基本表添加符合游標(biāo)的新記錄時(shí)該游標(biāo)無(wú)法讀取(但其他語(yǔ)句使用WHERECURRENTOF子句可對(duì)游標(biāo)中新添加的記錄數(shù)據(jù)進(jìn)行修改)。如果游標(biāo)中的一行被刪除掉,則用游標(biāo)提取時(shí)@@FETCH_STATUS的返回值為-2。DYNAMIC指定游標(biāo)中的數(shù)據(jù)將隨基本表而變化,但需要大量的游標(biāo)資源。FAST_FORWARD指定FORWARD_ONLY而且READ_ONLY類(lèi)型游標(biāo)。使用FAST_FORWARD參數(shù)則不能同時(shí)使用FORWARD_ONLY、SCROLL、OPTIMISTIC或FORUPDATE參數(shù)。OPTIMISTIC指明若游標(biāo)中的數(shù)據(jù)已發(fā)生變化,則對(duì)游標(biāo)數(shù)據(jù)進(jìn)行更新或刪除時(shí)可能會(huì)導(dǎo)致失敗。TYPE_WARNING指定若游標(biāo)中的數(shù)據(jù)類(lèi)型被修改成其他類(lèi)型時(shí),給客戶(hù)端發(fā)送警告。若省略FORWARD_ONLY|SCROLL則不使用STATIC、KEYSET和DYNAMIC時(shí)默認(rèn)為FORWARD_ONLY游標(biāo),使用STATIC、KEYSET或DYNAMIC之一則默認(rèn)為SCROLL游標(biāo)。若省略READ_ONLY|OPTIMISTIC參數(shù),則默認(rèn)選項(xiàng)為:如果未使用UPDATE參數(shù)不支持更新,則游標(biāo)為READ_ONLY;STATIC和FAST_FORWARD類(lèi)型游標(biāo)默認(rèn)為READ_ONLY;DYNAMIC和KEYSET類(lèi)型游標(biāo)默認(rèn)為OPTIMISTIC?!咀⒁狻坎荒軐QL-92游標(biāo)語(yǔ)法與T-SQL游標(biāo)的擴(kuò)展語(yǔ)法混合使用。若在CURSOR前使用了SCROLL或INSENSITIVE則為SQL-92游標(biāo)語(yǔ)法,則不能再在CURSOR和FORSELECT語(yǔ)句之間使用任何保留字,反之同理。8.6.3打開(kāi)游標(biāo)格式:OPEN[GLOBAL]游標(biāo)名【說(shuō)明】如果全局游標(biāo)與局部游標(biāo)同名時(shí),GLOBAL表示打開(kāi)全局游標(biāo),省略為打開(kāi)局部游標(biāo)。打開(kāi)游標(biāo)后,可以使用全局變量@@ERROR判斷該游標(biāo)是否打開(kāi)成功。@@ERROR為0則打開(kāi)成功,否則打開(kāi)失敗。使用全局變量@@CURSOR_ROWS可得到打開(kāi)游標(biāo)中當(dāng)前存在的記錄行數(shù),其返回值為:0:表示無(wú)符合條件的記錄或該游標(biāo)已經(jīng)關(guān)閉或已釋放-1:表示該游標(biāo)為動(dòng)態(tài)的,記錄行經(jīng)常變動(dòng)無(wú)法確定n:正整數(shù)n表示指定結(jié)果集已從表中全部讀入,總共n條記錄-m:表示指定的結(jié)果集還沒(méi)全部讀入,目前游標(biāo)中有m條記錄8.6.4讀取數(shù)據(jù)格式:
FETCH[next|prior|first|last|absolute{n|@nvar}|relative{n|@nvar}]FROM[GLOBAL]游標(biāo)名
[INTO@變量名
[,…n]]【說(shuō)明】FETCH之后的參數(shù)為提取記錄的方式,可以是以下方式之一:NEXT順序向下提取當(dāng)前記錄行的下一行,并將其作為當(dāng)前行。第一次對(duì)游標(biāo)操作時(shí)取第一行為當(dāng)前行,處理完最后一行,再用FETCHNEXT則CURSOR指向結(jié)果集最后一行之后,@@FETCH_STATUS的值為-1。PRIOR順序向前提取當(dāng)前記錄的前一行,并將其作為當(dāng)前行。第一次用FETCHPRIOR對(duì)游標(biāo)操作時(shí),沒(méi)有記錄返回,游標(biāo)指針CURSOR仍指向第一行之前。FIRST提取游標(biāo)結(jié)果集的第一條記錄,并將其作為當(dāng)前行。LAST提取游標(biāo)結(jié)果集的最后一條記錄,并將其作為當(dāng)前行。ABSOLUTE{n|@nvar}按絕對(duì)位置提取游標(biāo)結(jié)果集的第n或第@nvar條記錄,并將其作為當(dāng)前行。若n或@nvar為負(fù)值則提取結(jié)尾之前的倒數(shù)第n或第@nvar條記錄。n為整數(shù),@nvar為整數(shù)類(lèi)型變量。RELATIVE{n|@nvar}按相對(duì)位置提取當(dāng)前記錄之后(正值)或之前(負(fù)值)的第n或第@nvar條記錄,并將其作為當(dāng)前行。【說(shuō)明】在游標(biāo)內(nèi)有一個(gè)游標(biāo)指針CURSOR指向游標(biāo)結(jié)果集的某個(gè)記錄行—稱(chēng)為當(dāng)前行,游標(biāo)剛打開(kāi)時(shí)CURSOR指向游標(biāo)結(jié)果集第一行之前。FROM指定提取記錄的游標(biāo),global用于指定全局游標(biāo),省略為局部游標(biāo)。NTO指定將提取記錄中的字段數(shù)據(jù)存入對(duì)應(yīng)的局部變量中。變量名列表的個(gè)數(shù)、類(lèi)型必須與結(jié)果集中記錄的字段的個(gè)數(shù)、類(lèi)型相匹配。打開(kāi)游標(biāo)用FETCH提取記錄后,可用@@FETCH_STATUS檢測(cè)游標(biāo)的當(dāng)前狀態(tài)。@@FETCH_STATUS的返回值為:0:FETCH語(yǔ)句提取記錄成功-1:FETCH語(yǔ)句執(zhí)行失敗或提取的記錄不在結(jié)果集內(nèi)-2:被提取的記錄已被刪除或根本不存在
8.6.5關(guān)閉游標(biāo)格式:CLOSE[GLOBAL]游標(biāo)名說(shuō)明:關(guān)閉游標(biāo),會(huì)釋放當(dāng)前結(jié)果集的內(nèi)存空間,然后解除定位游標(biāo)記錄行上的游標(biāo)指針。游標(biāo)關(guān)閉后,其定義結(jié)果仍然存儲(chǔ)在系統(tǒng)中,但不能提取記錄和定位更新,需要時(shí)可用OPEN語(yǔ)句再次打開(kāi)。
8.6.6釋放游標(biāo)格式:DEALLOCATE[GLOBAL]游標(biāo)名說(shuō)明:釋放游標(biāo)是指刪除游標(biāo)引用,釋放該游標(biāo)所占用的所有系統(tǒng)資源。【例8-18】使用游標(biāo)逐條查看空調(diào)信息視圖(view_cond_inf)中空調(diào)的主要信息,用變量輸出各項(xiàng)主要數(shù)據(jù),并統(tǒng)計(jì)空調(diào)總臺(tái)數(shù)。USEbuildGODECLAREcurs_condcursorkeySET--定義游標(biāo)名為curs_condFORSELECTFacilityName,Model,Price,Quantity,AmountFROMview_cond_infOPENcurs_cond--打開(kāi)游標(biāo)
IF@@error=0--判斷游標(biāo)打開(kāi)成功
BEGINIF@@cursor_rows>0--判斷游標(biāo)結(jié)果集記錄個(gè)數(shù)大于
BEGINPRINT'游標(biāo)記錄數(shù)為:'+CONVERT(varchar(2),@@cursor_rows)DECLARE@fnamenvarchar(30),@modvarchar(20),@prinumeric(8,2),@quaint,@amomoney,@sumint,@indexintFETCHabsolute2FROMcurs_condinto@fname,@mod,@pri,@qua,@amo--提取記錄
PRINT'第條記錄:'+'設(shè)備名:'+@fname+'規(guī)格:'+@mod+'單價(jià):'+CAST(@priASvarchar(8))+'數(shù)量:'+CAST(@quaASvarchar(2))+'臺(tái)'+'總價(jià)'+convert(varchar(25),@amo,0)FETCHrelative2FROMcurs_condinto@fname,@mod,@pri,@qua,@amoPRINT'后移條記錄:'+'設(shè)備名:'+@fname+'規(guī)格:'+@mod+'單價(jià):'+CAST(@priASvarchar(8))+'數(shù)量:'+CAST(@quaASvarchar(2))+'臺(tái)'+'總價(jià)'++convert(varchar(25),@amo,0)SET@sum=0SET@index=0PRINT'全部記錄為:'FETCHfirstFROMcurs_condinto@fname,@mod,@pri,@qua,@amo--先提取第一條記錄
WHILE@@FETCH_STATUS=0BEGINPRINTCAST(@index+1ASchar(2))+':'+'設(shè)備名:'+@fname+'規(guī)格:'+@mod+'單價(jià):'+CAST(@priASvarchar(8))+'數(shù)量:'+CAST(@quaASvarchar(2))+'臺(tái)'+'總價(jià)'++convert(varchar(25),@amo,0)FETCHnextFROMcurs_condinto@fname,@mod,@pri,@qua,@amoSET@index=@index+1SET@sum=CAST(@quaASint)+@sumENDPRINT'實(shí)際記錄數(shù)為:'+CASt(@indexASchar(2))+'空調(diào)總臺(tái)數(shù)為:'+CASt(@sumASchar(6))ENDENDELSEPRINT'游標(biāo)打開(kāi)失??!'CLOSEcurs_cond--關(guān)閉游標(biāo)
DEALLOCATEcurs_cond--刪除游標(biāo)小結(jié)在SQLServer中使用T-SQL進(jìn)行程序設(shè)計(jì)時(shí),通常是使用批處理來(lái)提交一個(gè)或多個(gè)T-SQL語(yǔ)句,一個(gè)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 有機(jī)合成工一期BDO-高級(jí)復(fù)習(xí)測(cè)試卷(一)
- 生物技術(shù)基因工程期末題100道及答案
- 2025年深圳道路貨運(yùn)駕駛員從業(yè)資格考試題庫(kù)
- 2025年白山從業(yè)資格證模擬考試題下載貨運(yùn)
- 2025年重慶貨運(yùn)上崗證考試題
- 2025年山南a2貨運(yùn)從業(yè)資格證考試題
- 2025年成都貨運(yùn)從業(yè)資格考試題目大全及答案解析
- 老年人痤瘡的日常護(hù)理
- 傷寒性心肌炎的健康宣教
- 食管壁內(nèi)假性憩室的健康宣教
- 油菜室內(nèi)考種
- 藥劑科主任崗位權(quán)責(zé)目錄及廉政風(fēng)險(xiǎn)防控措施登記表
- 沼氣工程安全培訓(xùn)講學(xué)
- 中國(guó)現(xiàn)代史四民族團(tuán)結(jié)與祖國(guó)統(tǒng)一課件- 歷史中考一輪復(fù)習(xí)
- 幼兒園大班繪本《愛(ài)書(shū)的孩子》無(wú)聲PPT
- DB3311T 132-2020 住宅小區(qū)物業(yè)服務(wù)規(guī)范
- (中職)門(mén)店運(yùn)營(yíng)實(shí)務(wù)教學(xué)ppt課件(完整版)
- 2022更新國(guó)家開(kāi)放大學(xué)電大《計(jì)算機(jī)應(yīng)用基礎(chǔ)(專(zhuān))》終結(jié)性考試大作業(yè)答案任務(wù)一
- 羅伊護(hù)理個(gè)案模板
- 3.無(wú)人機(jī)在風(fēng)電系統(tǒng)應(yīng)用解決方案
-
評(píng)論
0/150
提交評(píng)論