SQL-Server實(shí)用數(shù)據(jù)庫技術(shù)課件第8章_第1頁
SQL-Server實(shí)用數(shù)據(jù)庫技術(shù)課件第8章_第2頁
SQL-Server實(shí)用數(shù)據(jù)庫技術(shù)課件第8章_第3頁
SQL-Server實(shí)用數(shù)據(jù)庫技術(shù)課件第8章_第4頁
SQL-Server實(shí)用數(shù)據(jù)庫技術(shù)課件第8章_第5頁
已閱讀5頁,還剩108頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

課程回顧數(shù)據(jù)查詢在數(shù)據(jù)庫中的編程本章綜述Transact-SQL(簡稱T-SQL)是SQLServer2008提供的一種交互式查詢語言。使用Transact-SQL編寫應(yīng)用程序可以完成所有數(shù)據(jù)庫管理工作。對用戶來說,T-SQL語言是唯一可以和SQLServer2008的數(shù)據(jù)庫管理系統(tǒng)進(jìn)行交互的語言。任何應(yīng)用程序,只要向數(shù)據(jù)庫管理系統(tǒng)發(fā)出命令以獲得數(shù)據(jù)庫管理系統(tǒng)的響應(yīng),最終都必須體現(xiàn)為以T-SQL語句為表現(xiàn)形式的指令。函數(shù)豐富了數(shù)據(jù)庫的信息處理功能,而游標(biāo)則提供了對數(shù)據(jù)庫中的數(shù)據(jù)靈活處理的方式,可實(shí)現(xiàn)對數(shù)據(jù)信息進(jìn)行復(fù)雜處理的功能。本章結(jié)構(gòu)8.1Transact–SQL語言基礎(chǔ)8.2變量與運(yùn)算符8.3流程控制語句8.4系統(tǒng)內(nèi)置函數(shù)8.5用戶自定義函數(shù)8.6游標(biāo)的創(chuàng)建與使用技能展示:了解T-SQL語言的基本元素掌握T-SQL流程控制語句熟悉T-SQL系統(tǒng)內(nèi)置函數(shù)熟練掌握用戶自定義函數(shù)的創(chuàng)建與使用了解游標(biāo)的創(chuàng)建與使用8.1Transact–SQL語言基礎(chǔ)SQL與T-SQL的不同T-SQL的分類標(biāo)識符的命名規(guī)則批處理的概念注釋的使用方法8.1.1SQL與T-SQL概述

8.1.2T-SQL語言的基礎(chǔ)知識

開封大學(xué)信息工程學(xué)院8.1.1SQL與T-SQL概述SQL語言:結(jié)構(gòu)化查詢語言,是一種數(shù)據(jù)庫查詢和程序設(shè)計(jì)語言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng)。T-SQL語言:T-SQL語言是微軟在SQL語言基礎(chǔ)上發(fā)展起來的擴(kuò)充語言,除了提供標(biāo)準(zhǔn)的SQL命令之外,還對SQL語言做了許多補(bǔ)充,提供了如變量聲明、流程控制語言、功能函數(shù)等功能。開封大學(xué)信息工程學(xué)院T-SQL語言分類:數(shù)據(jù)定義語言(DDL,DataDefinitionLanguage)數(shù)據(jù)操縱語言(DML,DataManipulationLanguage)數(shù)據(jù)控制語言(DCL,DataControlLanguage)T-SQL增加的語言元素?cái)?shù)據(jù)定義語言(DDL)的主要語句及功能數(shù)據(jù)定義語言主要用于對數(shù)據(jù)庫以及數(shù)據(jù)庫中的各種的對象進(jìn)行創(chuàng)建、刪除、修改等操作語句功能CREATE創(chuàng)建數(shù)據(jù)庫或數(shù)據(jù)庫對象ALTER對數(shù)據(jù)庫或數(shù)據(jù)庫對象進(jìn)行修改DROP刪除數(shù)據(jù)庫或數(shù)據(jù)庫對象數(shù)據(jù)操縱語言(DML)主要語句及功能數(shù)據(jù)操作語言主要用于操作數(shù)據(jù)庫中的各種對象,查詢、添加、修改和刪除數(shù)據(jù)中的數(shù)據(jù)。語句功能SELECT從表或視圖中檢索數(shù)據(jù)INSERT將數(shù)據(jù)插入到表或視圖中UPDATE修改表或視圖中的數(shù)據(jù)DELETE從表或視圖刪除數(shù)據(jù)數(shù)據(jù)控制語言(DCL)主要語句及功能數(shù)據(jù)控制語言就是用來對數(shù)據(jù)庫進(jìn)行安全管理的,它包括用來設(shè)置或更改數(shù)據(jù)庫用戶或角色權(quán)限的語句,以確保數(shù)據(jù)庫中的數(shù)據(jù)和操作不被未經(jīng)授權(quán)的用戶使用和執(zhí)行語句功能GRANT授予權(quán)限REVOKE收回權(quán)限D(zhuǎn)ENY收回權(quán)限、并禁止從其他角色繼承許可權(quán)限T-SQL增加的語言元素T-SQL增加的語言元素不是ANSISQL所包含的內(nèi)容,而是微軟為了用戶編程的方便而增加的語言元素,這些語言元素包括變量、元素符、函數(shù)、流程控制語句、注釋等。8.1.2T-SQL語言的基礎(chǔ)知識標(biāo)識符標(biāo)識符是指用戶在SQLServer中定義的服務(wù)器、數(shù)據(jù)庫、數(shù)據(jù)庫對象(如表、視圖、索引、觸發(fā)器等)、變量和列名等對象名稱。分類:常規(guī)標(biāo)識符分隔標(biāo)識符 常規(guī)標(biāo)識符的命名規(guī)則標(biāo)識符長度可以為1-128個字符。但是,對于本地臨時表,標(biāo)識符最多只能有116個字符。標(biāo)識符的首字符必須為Unicode3.2標(biāo)準(zhǔn)所定義的字母或下劃線(_)、at符號(@)、數(shù)字符號(#)。標(biāo)識符第一個字符的后續(xù)字符可以為Unicode3.2標(biāo)準(zhǔn)所定義的字母、數(shù)字或@、#、$、_符號。標(biāo)識符內(nèi)不能嵌入空格或其他特殊字符。標(biāo)識符不能與SQLServer中的保留關(guān)鍵字同名。【注意】在SQLServer中,某些位于標(biāo)識符開頭位置的符號具有特殊意義。為了避免混淆,不應(yīng)使用以這些特殊意義開頭的名稱。以“@”符號開頭的標(biāo)識符表示局部變量或參數(shù)。以“#”符號開頭的標(biāo)識符表示臨時表或過程。以“##”符號開頭的標(biāo)識符表示全局臨時對象。以“@@”符號開頭的標(biāo)識符為某些T-SQL函數(shù)的名稱。分隔標(biāo)識符分隔標(biāo)識符允許在標(biāo)識符中使用SQLServer保留關(guān)鍵字或常規(guī)標(biāo)識符中不允許使用的一些特殊字符,這是由雙引號(”)和方括號([])進(jìn)行分隔的標(biāo)識符。批處理批處理是同時從應(yīng)用程序發(fā)送到SQLServer并得以執(zhí)行的一組單條或多條T-SQL語句,用GO語句作為批處理的結(jié)束標(biāo)志。若沒有GO語句,默認(rèn)所有的語句屬于一個批處理。SQLServer的程序發(fā)送和編譯以批處理為一個程序執(zhí)行單元。如果一個批處理中任何一條語句有語法錯誤(例如引用不存在的對象),則整個批處理都不能執(zhí)行。但是通過編譯的批處理語句,若其中的某條語句運(yùn)行時發(fā)生錯誤(例如違反約束),則錯誤語句之前所執(zhí)行的語句正常執(zhí)行(批處理位于事務(wù)中并且錯誤導(dǎo)致事務(wù)回滾的情況例外)。批處理的使用規(guī)則CREATEDEFAULT創(chuàng)建默認(rèn)值、CREATERULE創(chuàng)建規(guī)則、CREATEVIEW創(chuàng)建視圖、CREATEPROCEDURE創(chuàng)建存儲過程、CREATETRIGGER創(chuàng)建觸發(fā)器對象等,都必須單獨(dú)作為一個批處理,不能與其他語句放在一個批處理中。CHECK檢查約束不能在同一個批處理中既定義又使用。規(guī)則和默認(rèn)不能在同一個批處理中既綁定到列又被使用。不能在修改表中的一個字段后,立即在同一個批處理中引用該字段。局部變量的作用域限制在一個批處理中,不能在GO語句之后再次引用該變量?!纠?-1】查看設(shè)備表中所有的空調(diào)的信息,并創(chuàng)建視圖“view_cond_inf”,然后查詢“view_cond_inf”視圖中的信息。USEbuildGOCREATEVIEWview_cond_infASSELECT*FROMT_FacilityWHEREFacilityNamelike'%空調(diào)%'GOSELECT*FROMview_cond_infGO注釋單行注釋:--注釋內(nèi)容多行注釋:/*注釋內(nèi)容*/【例8-2】對完成【例8-1】的批處理語句添加注釋,進(jìn)行說明。/*以下內(nèi)容完成

view_cond_inf視圖的創(chuàng)建及查詢操作*/USEbuild--打開build數(shù)據(jù)庫GO--創(chuàng)建view_cond_inf視圖CREATEVIEWview_cond_infASSELECT*FROMT_FacilityWHEREFacilityNamelike'%空調(diào)%'GO--查詢view_cond_inf視圖中的所有信息SELECT*FROMview_cond_infGO8.2變量與運(yùn)算符

局部變量的聲明與使用全局變量的使用常用運(yùn)算符的使用運(yùn)算符的優(yōu)先級8.2.1變量

8.2.2運(yùn)算符

開封大學(xué)信息工程學(xué)院8.2.1變量局部變量與全局變量局部變量(用戶自定義變量)形式:@***作用:用于臨時存儲各種類型的數(shù)據(jù)全局變量形式:@@***作用:有系統(tǒng)提供的有確定值的變量,用戶不能定義也不能修改全局變量局部變量聲明語法格式:DECLARE{@變量名數(shù)據(jù)類型[(長度)]}[,…n]賦值語法格式:SET@局部變量=表達(dá)式SELECT{@局部變量=表達(dá)式}[,…n]顯示語法格式:PRINT表達(dá)式SELECT表達(dá)式[,…n]作用域:局部變量的作用域是在一個批處理、一個存儲過程或一個觸發(fā)器內(nèi),其生命周期從定義開始到它遇到的第一個GO語句或者到存儲過程、觸發(fā)器的結(jié)尾結(jié)束,即局部變量只在當(dāng)前的批處理、存儲過程、觸發(fā)器中有效【注意】局部變量必須以“@”開頭。變量名必須符合標(biāo)識符的命名規(guī)則。變量的數(shù)據(jù)類型可以是系統(tǒng)類型,也可以是用戶自定義類型,但不允許是text、ntext和image類型。系統(tǒng)固定長度的數(shù)據(jù)類型不需要指定長度。例如:DECLARE@namechar(6)--定義@name長度為6的字符型變量DECLARE@iint,@addressvarchar(30)--定義@i整型變量和@address長度為30的變長字符型變量【注意】SET命令只能一次給一個變量賦值,而SELECT命令一次可以給多個變量賦值,兩種格式可以通用,建議首選SET。用SET命令時,表達(dá)式中可以包含SELECT語句子查詢,但只能是集合函數(shù)返回的單值,且必須用圓括號括起來。SELECT也可以直接使用查詢的單值結(jié)果給局部變量賦值。如:SELECT@局部變量=表達(dá)式或字段名FROM表名WHERE條件【注意】使用PRINT只能有一個表達(dá)式,其值在查詢后的“消息”窗口顯示。使用SELECT相當(dāng)于進(jìn)行無數(shù)據(jù)源檢索,可以有多個表達(dá)式,其結(jié)果在查詢后的“網(wǎng)格”子窗口顯示。在一個腳本中,最好不要混合使用這兩種輸出方式,因?yàn)檫@樣的話需要切換兩個窗口來查看數(shù)據(jù)結(jié)果。【例8-3】查詢設(shè)備表,使用@price存放設(shè)備表中單價(jià)最高的物品價(jià)格,使用@name存放單價(jià)最高的設(shè)備的設(shè)備名,把這兩個局部變量值輸出。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】請找出下面程序中的錯誤DECLARE@iintSET@i=100PRINT@iGOPRINT@iGO全局變量特點(diǎn):全局變量是由系統(tǒng)提供的有確定值的變量,用戶不能自己定義全局變量,也不能用SET語句來修改全局變量的值格式:系統(tǒng)全局變量都是以@@開頭的全局變量含義@@VERSION返回運(yùn)行SQLServer數(shù)據(jù)庫的服務(wù)器名稱@@LANGUAGE返回當(dāng)前所用語言的名稱@@ROWCOUNT返回受前一條SQL語句影響的行數(shù)@@ERROR返回執(zhí)行的上一個T-SQL語句的錯誤號【例8-5】使用全局變量@@VERSION查看當(dāng)前數(shù)據(jù)庫的版本信息。運(yùn)算符算術(shù)運(yùn)算符比較運(yùn)算符邏輯運(yùn)算符位運(yùn)算符字符串連接運(yùn)算符算術(shù)運(yùn)算符算術(shù)運(yùn)算符用于對表達(dá)式進(jìn)行數(shù)學(xué)運(yùn)算,表達(dá)式中的各項(xiàng)可以是任何數(shù)值數(shù)據(jù)類型。運(yùn)算符含義+(加)加法-(減)減法*(乘)乘法/(除)除法%(取模)求模,返回一個除法運(yùn)算的整數(shù)余數(shù)比較運(yùn)算符比較運(yùn)算符用于對兩個表達(dá)式進(jìn)行比較,可以用于除了text、ntext或image數(shù)據(jù)類型的所有表達(dá)式,比較結(jié)果是布爾數(shù)據(jù)類型,可取以下三個邏輯值之一:TRUE:真,條件成立。FALSE:假,條件不成立。UNKNOWN:不確定,是某個數(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)算符用于對某些條件進(jìn)行測試,以獲得真實(shí)情況,返回值為TRUE或FALSE。運(yùn)算符含義NOT邏輯非,對任何布爾表達(dá)式的結(jié)果取反AND邏輯與,如果兩個布爾表達(dá)式都為TRUE,則結(jié)果為TRUEOR邏輯或,如果兩個布爾表達(dá)式中任何一個為TRUE,則結(jié)果為TRUEALL如果一組的比較都為TRUE,則結(jié)果為TRUEANY如果一組的比較中任何一個返回TRUE,則結(jié)果為TRUEBETWEEN如果操作數(shù)在指定范圍內(nèi)容,則結(jié)果為TRUEEXISTS如果子查詢包含一些行,則結(jié)果為TRUEIN如果操作數(shù)等于表達(dá)式列表中的一個,則結(jié)果為TRUELIKE如果操作數(shù)與一種模式相匹配,則結(jié)果為TRUESOME如果在一組比較中,有些為TRUE,則結(jié)果為TRUEANY、ALL、SOMEANY、ALL、SOME運(yùn)算符主要用于比較特定值和結(jié)果集中的所有值,一般情況下,要與比較運(yùn)算符配合使用。其中ANY與SOME的作用相同。語法如下:例如:@i>ALL(SELECTPriceFROMT_Facility)@i>ANY(SELECTPriceFROMT_Facility)特定值{=|>|<|>=|<=|<>|…}{ANY|ALL|SOME}(SELECT語句)ININ運(yùn)算符主要用于測試特定值是否在子查詢的結(jié)果集或給定的一些值之中,只要與其中任何一個值相等,即返回TRUE。語法如下:例如:@iIN(SELECTPriceFROMT_Facility)@iNOTIN(5,2,3)特定值[NOT]IN(SELECT語句|值[,…n])BETWEENBETWEEN主要用于判斷表達(dá)式的值是否在某個范圍內(nèi),若在指定范圍內(nèi)結(jié)果為TRUE。語法如下:例如:SELECT*FROMT_FacilityWHEREPriceBETWEEN1000AND5000[NOT]BETWEEN表達(dá)式1AND表達(dá)式2LIKELIKE用于測試特定字符串是否與制定模式相匹配,若匹配,返回TRUE。模式可以包含普通字符和通配字符。語法如下:特定字符串[NOT]LIKE模式[ESCAPEescape_character]通配符含義%代表0或多個任意字符_(下劃線)代表單個任意字符[]指定范圍(如[a-f]、[0-9])或集合(如[abcdef])中的任何單個字符[^]指定不屬于范圍(如[^a-f]、[^0-9])或集合(如[^abcdef])中的任何單個字符例如:select*fromD_DepartmentwhereDepartmentlike'%學(xué)院'

EXISTSEXISTS運(yùn)算符主要用于測試一個子查詢的結(jié)果集是否不為空,若結(jié)果集不為空,返回TRUE。語法如下:[NOT]EXISTS(SELECT語句)位運(yùn)算符字符串連接運(yùn)算符:+運(yùn)算符運(yùn)算規(guī)則&(與)兩個位均為1時,結(jié)果為1,否則為0|(或)只要一個位為1時,結(jié)果為1,否則為0^(異或)兩個位值不同時,結(jié)果為1,否則為0運(yùn)算符優(yōu)先級優(yōu)先級運(yùn)算符1+(正)、-(負(fù))、~(位非)2*(乘)、/(除)、%(取模)3+(加)、-(減)、+(連接)4=、>、<、>=、<=、<>、!=、!>、!<5^(位異或)、&(位與)、|(位或)6NOT7AND8ALL、ANY、BETWEEN、IN、LIKE、OR、SOME9=(賦值)8.3流程控制語句8.3.1BEGIN…END語句

8.3.2IF…ELSE語句8.3.3CASE…END語句

順序結(jié)構(gòu)

分支結(jié)構(gòu)

開封大學(xué)信息工程學(xué)院8.3.4WHILE語句

循環(huán)結(jié)構(gòu)

8.3.1BEGIN…END語句語法:作用:不論多少個語句,放在BEGIN…END中間就構(gòu)成一個獨(dú)立的語句塊,被系統(tǒng)當(dāng)作一個整體單元來處理BEGIN

語句1

語句2…END8.3.2IF…ELSE條件語句語法:執(zhí)行過程:先判斷條件表達(dá)式的值,若為TRUE,則執(zhí)行IF后面的語句塊,若為FALSE,則執(zhí)行ELSE后面的語句,沒有ELSE子句時則順序執(zhí)行后續(xù)語句。IF邏輯條件表達(dá)式語句塊1[ELSE

語句塊2]【注意】條件表達(dá)式中可以包含SELECT子查詢,但必須用圓括號括起來語句塊1、語句塊2可以是單個SQL語句,如果有兩個以上語句必須放在BEGIN…END語句塊中【例8-6】查詢部門表中部門ID為1101的部門,若查到該部門則顯示其名稱,否則顯示“沒有該部門”。USEbuildGODECLARE@nameNVARCHAR(15)IFEXISTS(SELECT*FROMD_DepartmentWHEREDepartmentNO='1101')BEGINSELECT@name=DepartmentFROMD_DepartmentWHEREDepartmentNO='1101'PRINT'---1101部門的信息如下---'PRINT'部門名稱:'+@nameENDELSEPRINT'沒有該部門'

8.3.3CASE…END語句CASE…END語句根據(jù)不同的條件返回不同的值,它提供了比IF…ELSE語句更多的選擇和判斷機(jī)會,使用它可以在實(shí)現(xiàn)多分支判斷時避免復(fù)雜的IF…ELSE語句嵌套。CASE…END語句有兩種格式簡單CASE…END語句搜索CASE…END語句。簡單CASE…END表達(dá)式格式:功能:根據(jù)測試表達(dá)式的值得到一個對應(yīng)值CASE測試表達(dá)式

WHEN常量值1THEN結(jié)果表達(dá)式1[{WHEN常量值2THEN結(jié)果表達(dá)式2}[…n]][ELSE結(jié)果表達(dá)式n]END執(zhí)行過程:先計(jì)算測試表達(dá)式的值,將測試表達(dá)式的值按順序依次與WHEN指定的各個常量值進(jìn)行比較:如果找到了第一個相等的常量值,則整個CASE表達(dá)式取相應(yīng)THEN指定的結(jié)果表達(dá)式的值,之后不再比較,跳出CASE…END語句。如果找不到相等的常量值,則取ELSE指定的結(jié)果表示n的值。如果找不到相等的常量值也沒有使用ELSE,則返回NULL?!纠?-7】查詢設(shè)備表中設(shè)備的主要信息,把設(shè)備表中的設(shè)備類別編號轉(zhuǎn)換為設(shè)備類別名稱顯示出來。SELECTFacilityName,Category=CASEClassificationWHEN1THEN'辦公用品'WHEN2THEN'教室用品'WHEN3THEN'宿舍用品'END,--類別字段到此結(jié)束,后面還有其他字段,逗號不能丟

Model,Price,QuantityFROMT_Facility搜索CASE…END表達(dá)式格式:功能:根據(jù)某個條件得到一個對應(yīng)值CASEWHEN條件表達(dá)式1THEN結(jié)果表達(dá)式1[{WHEN條件表達(dá)式2THEN結(jié)果表達(dá)式2}[…n]][ELSE結(jié)果表達(dá)式n]END執(zhí)行過程:按順序依次判斷WHEN指定的條件表達(dá)式的值,遇到第一個為TRUE的條件表達(dá)式,則整個CASE表達(dá)式取相應(yīng)THEN指定的結(jié)果表達(dá)式的值,之后不再比較,結(jié)束并跳出CASE…END語句。如果找不到為TRUE的條件表達(dá)式,則取ELSE指定的結(jié)果表達(dá)式n的值。如果找不到為TRUE的條件表達(dá)式也沒有使用ELSE,則返回NULL?!纠?-8】查詢設(shè)備表,根據(jù)設(shè)備的使用時間顯示不同的提示信息。SELECTFacilityName,Model,Price,Quantity,

使用時間=year(GETDATE())-year(BuyTime),

提示信息=CASEWHENyear(GETDATE())-year(BuyTime)>=8THEN'超期服役'WHENyear(GETDATE())-year(BuyTime)>=2THEN'可以維持'ELSE'剛剛購置,新的'ENDFROMT_Facility8.3.4WHILE語句格式:執(zhí)行過程:先判斷條件表達(dá)式的值,若為TRUE,則執(zhí)行BEGIN…END之間的循環(huán)體語句,執(zhí)行到END時返回到WHILE再次判斷條件表達(dá)式的值,若為TRUE,則再次執(zhí)行BEGIN…END之間的循環(huán)體語句,直到條件表達(dá)式為FALSE,則跳出循環(huán)體,繼續(xù)執(zhí)行后續(xù)語句。WHILE邏輯條件表達(dá)式

BEGIN

循環(huán)體語句系列…[BREAK]……[CONTINUE]……END【注意】條件表達(dá)式的值必須是TRUE或FALSE。如果條件表達(dá)式中含有SELECT語句,則必須用括號將SELECT語句括起來。

若在執(zhí)行循環(huán)體時遇到BREAK語句,則無條件跳出BEGIN…END。若在執(zhí)行循環(huán)體時遇到CONTINUE語句,則結(jié)束本輪循環(huán),不再執(zhí)行之后的循環(huán)體語句,返回到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其它流程控制語句WAITFOR語句

功能:使程序暫停指定的時間后再繼續(xù)執(zhí)行格式:WAITFOR{DELAY‘時間’|TIME’時間’}注意:DELAY指定暫停的時間長短——相對時間。TIME指定暫停到什么時間再重新執(zhí)行程序——絕對時間?!畷r間’參數(shù)必須是datetime類型的時間部分,格式為“hh:mm:ss”,不能含有日期部分?!纠?-10】在5秒鐘之后對設(shè)備表進(jìn)行查詢,在23時對部門表進(jì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ù)8.4.4類型轉(zhuǎn)換函數(shù)系統(tǒng)內(nèi)置函數(shù)

開封大學(xué)信息工程學(xué)院函數(shù)是指一組編譯好的T-SQL語句,它們可以帶有一個或多個參數(shù),也可以不帶參數(shù)。函數(shù)執(zhí)行的結(jié)果為返回一個數(shù)值、數(shù)值集合,或者沒有返回值僅僅是執(zhí)行一些操作。SQLServer2008支持兩種函數(shù)類型:系統(tǒng)內(nèi)置函數(shù)和用戶定義函數(shù)。在SQLServer2008中,數(shù)據(jù)庫引擎提供了豐富的系統(tǒng)內(nèi)置函數(shù)??梢酝ㄟ^SQLServerManagementStudio的【對象資源管理器】窗口,查看所有的系統(tǒng)內(nèi)置函數(shù),8.4.1數(shù)學(xué)函數(shù)函數(shù)功能說明Abs(x)返回x的絕對值A(chǔ)cos(x)返回x的反余弦值(弧度)Atn2(x1,x2)返回介于x1和x2之間的近似反正切值(弧度)Ceiling(x)返回不小于x的最小整數(shù)Cos(x)返回x(弧度)的余弦值Cot(x)返回x(弧度)的余切值Degrees(x)返回x(弧度)的對應(yīng)的角度值Exp(x)返回ex的指數(shù)函數(shù)Floor(x)返回不大于x的最大整數(shù)Log(x)返回以e為底的自然對數(shù)Log10(x)返回以10為底的對數(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的平方根【說明】函數(shù)參數(shù)x可以是數(shù)值常量、變量、字段名、數(shù)值函數(shù)或算術(shù)表達(dá)式。x的數(shù)據(jù)類型可以是各種數(shù)值型或貨幣型的,有的函數(shù)值類型與x類型相同,有的需要將x轉(zhuǎn)換成float,其結(jié)果也是float類型的。功能說明中得到的值是函數(shù)返回值,使用函數(shù)后參數(shù)x的值不變。8.4.2字符串函數(shù)函數(shù)功能說明Ascii(A)返回字符串A第一個字符的ASCII碼Char(x)返回ASCII碼為整數(shù)x的字符Left(A,x)從字符串A的左邊(前端)取x個字符的子串Len(A)返回字符串A去掉尾部空格后所包含的字符個數(shù)(不是字節(jié)數(shù)),如果是空串,函數(shù)返回0Lower(A)返回將字符串A中所有字母變?yōu)樾懽帜傅淖址甃trim(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個字符的子串Rtrim(A[,’B’])將字符串A右邊字符B刪掉,缺省為刪掉空格Soundex(A)返回由4個字符組成的代碼,用于評估兩個字符串的相似性Space(x)得到有x個空格的字符串Str(x[,len[,d]])將x的數(shù)值轉(zhuǎn)換為數(shù)字字符串,包括符號和小數(shù)點(diǎn)Stuff(A,start,len,B)把字符串A從start開始長為len的字符串用字符串B替換Substring(A,x[,y])從字符串A的x字符位置開始取出y個字符的子串,如果省略y取到字符串A的最后一個字符,如果x取負(fù)值則從后向前數(shù)【說明】函數(shù)參數(shù)x一般是整型的數(shù)值常量、變量、數(shù)值函數(shù)或算術(shù)表達(dá)式。函數(shù)參數(shù)A是字符串常量、變量、字段名、字符串函數(shù)或字符串表達(dá)式。A的數(shù)據(jù)類型可以是各種字符型、寬字符型或二進(jìn)制類型的,大部分只能處理char(n)、varchar(n)、nchar(n)、nvarchar(n)類型或者可以轉(zhuǎn)換成這些類型的數(shù)據(jù),只有少部分可以處理binary(n)、varbinary(n)、image、text、ntext類型的數(shù)據(jù)。功能說明中得到的字符串或子字符串是函數(shù)返回值,原字符串A的內(nèi)容不變。【例8-11】使用Replace函數(shù)將字符串“Iamthebest”中的字符串“am”替換為“willbe”。PRINTReplace('Iamthebest','am','willbe')8.4.3日期和時間函數(shù)函數(shù)功能說明Dateadd(yy|mm|dd,x,D)返回按第一個參數(shù)指定的項(xiàng)目D+x的新值Datediff(yy|mm|dd,D1,D2)返回按第一個參數(shù)指定的項(xiàng)目D2-D1的新值Datepart(時間參數(shù),日期)返回日期中時間參數(shù)指定部分的對應(yīng)整數(shù),如SECOND得到秒數(shù)Datename(時間參數(shù),日期)返回日期中時間參數(shù)指定部分的對應(yīng)字符串Day(D)返回D的日期數(shù)Getdate()返回系統(tǒng)的當(dāng)前日期和時間Getutcdate()返回表示當(dāng)前UTC時間(世界時間坐標(biāo)或格林尼治標(biāo)準(zhǔn)時間)值Month(D)返回D的月份值Year(D)返回D的年份值【說明】

函數(shù)參數(shù)x一般是整型的數(shù)值常量、變量、數(shù)值函數(shù)或算術(shù)表達(dá)式。

D是日期時間型的常量、變量、字段名或日期時間函數(shù)。

D的格式應(yīng)該符合SETDATEFORMAT()命令設(shè)定的格式。功能說明中得到的值是函數(shù)返回值,原日期時間D的內(nèi)容不變?!纠?-12】查詢設(shè)備表,計(jì)算出設(shè)備號為“6”的設(shè)備的使用時間。SELECTFacilityName,Model,Price,Quantity,

使用時間=year(GETDATE())-YEAR(BuyTime)FROMT_FacilitywhereFacilityNo=68.4.4類型轉(zhuǎn)換函數(shù)函數(shù)功能說明Cast(表達(dá)式

as數(shù)據(jù)類型[(長度)])將表達(dá)式的值轉(zhuǎn)換為指定的“數(shù)據(jù)類型”Convert(數(shù)據(jù)類型[(長度)],表達(dá)式[,style])按style格式將表達(dá)式的值轉(zhuǎn)換成指定的“數(shù)據(jù)類型”【說明】函數(shù)中的表達(dá)式可以是任何有效的SQLServer表達(dá)式,所指定的數(shù)據(jù)類型必須是系統(tǒng)的基本數(shù)據(jù)類型而不能是用戶自定義的類型。(長度)用于需要指定長度的數(shù)據(jù)類型,不需要指定長度的類型可以省略。

Cast()函數(shù)只適用于轉(zhuǎn)換后不需要指定格式的數(shù)據(jù)類型,如整數(shù)、普通字符串。Convert()函數(shù)可適合于任何類型,其中Style可設(shè)置轉(zhuǎn)換后的格式:將datetime或smalldatetime型日期時間轉(zhuǎn)換為字符串的日期格式;將Real或float(p)型浮點(diǎn)數(shù)轉(zhuǎn)換為字符串的小數(shù)或指數(shù)格式;將Smallmoney或money貨幣型轉(zhuǎn)換為字符串的貨幣格式。

style參數(shù)見表8-17。不需要指定格式的類型Style可以省略。style參數(shù)的有效值轉(zhuǎn)換后返回字符串的格式8(2位年份)108(4位年份)只轉(zhuǎn)換為時間: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ù),必要時使用科學(xué)計(jì)數(shù)法1(Real或Float型浮點(diǎn)數(shù))最多8位數(shù),必要時使用科學(xué)計(jì)數(shù)法2(Real或Float型浮點(diǎn)數(shù))最多16位數(shù),必要時使用科學(xué)計(jì)數(shù)法0(貨幣型,轉(zhuǎn)換為字符型)默認(rèn)值,小數(shù)點(diǎn)左側(cè)數(shù)字不以逗號分隔,右側(cè)取兩位小數(shù)1(貨幣型,轉(zhuǎn)換為字符型)小數(shù)點(diǎn)左側(cè)數(shù)字每三位逗號分隔,右側(cè)取兩位小數(shù)2(貨幣型,轉(zhuǎn)換為字符型)小數(shù)點(diǎn)左側(cè)數(shù)字不以逗號分隔,右側(cè)取四位小數(shù)【例8-13】修改【例8-12】中該設(shè)備的使用時間的顯示。SELECTFacilityName,Model,Price,Quantity,

使用時間=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用戶自定義函數(shù)

CreateFunction語句函數(shù)的調(diào)用ALTERFUNCTION語句

DROPFUNCTION語句

8.5.1函數(shù)的定義與調(diào)用

8.5.2函數(shù)的修改與刪除開封大學(xué)信息工程學(xué)院使用SQLServerManagementStudio創(chuàng)建、修改、刪除自定義函數(shù)

8.5.3使用SSMS編輯自定義函數(shù)

8.5.1用戶函數(shù)的定義與調(diào)用用戶函數(shù)的定義

語法格式:CREATEFUNCTION[所有者名稱.]函數(shù)名

[({@參數(shù)名稱[AS]數(shù)據(jù)類型[=默認(rèn)值][READONLY]}[,…n])]

RETURNS

返回值類型

[WITH<標(biāo)量函數(shù)的選項(xiàng)>[,…n]][AS]BEGIN

函數(shù)體SQL語句

RETURN

數(shù)值表達(dá)式

END【說明】

自定義函數(shù)必須在當(dāng)前數(shù)據(jù)庫中定義。函數(shù)名:必須符合標(biāo)識符構(gòu)成規(guī)則,在數(shù)據(jù)庫中名稱必須惟一,省略所有者名稱默認(rèn)為系統(tǒng)管理員dbo。

@參數(shù)名稱:用局部變量定義的形式參數(shù),用于接收調(diào)用函數(shù)時傳遞過來的參數(shù)。默認(rèn)值必須是常量,如果設(shè)定了默認(rèn)值則調(diào)用函數(shù)時若不提供參數(shù),形式參數(shù)自動取默認(rèn)值。READONLY:指定不能在函數(shù)定義中更新或修改參數(shù)。如果參數(shù)類型為用戶自定義的表類型,則應(yīng)指定此選項(xiàng)。RETURNS指定返回值類型,RETURN指定返回值,注意這兩個關(guān)鍵字的區(qū)別。標(biāo)量函數(shù)的選項(xiàng)常用為ENCRYPTION,用于將CREATEFUNCTION語句的原始文本轉(zhuǎn)換為模糊格式。模糊代碼的輸出在任何目錄視圖中都不能直接顯示。對系統(tǒng)表或數(shù)據(jù)庫文件沒有訪問權(quán)限的用戶不能檢索模糊文本。用戶函數(shù)的調(diào)用自定義函數(shù)的調(diào)用與系統(tǒng)標(biāo)準(zhǔn)函數(shù)的調(diào)用相同,但必須寫出“所有者名稱.函數(shù)名”并在圓括號內(nèi)給出參數(shù)。調(diào)用形式:所有者名稱.函數(shù)名(實(shí)參1,…,實(shí)參n)【例8-15】定義一個根據(jù)指定日期及當(dāng)前日期求出相對年限的函數(shù)“func_rela_yea()”,調(diào)用該函數(shù),查詢設(shè)備表,創(chuàng)建一個包含設(shè)備基本信息的“view_faci_inf”視圖,顯示設(shè)備的使用年限。USEbuildGOCREATEFUNCTIONfunc_rela_yea(@dateDatetime,@datenowDatetime)RETURNSintBEGINRETURNyear(@datenow)-year(@date)ENDGOCREATEVIEWview_faci_infASSELECTFacilityName,Model,

購買時間=Convert(varchar(12),BuyTime,111),

使用年限=dbo.func_rela_yea(BuyTime,GETDATE())FROMT_FacilityGOSELECT*FROMview_faci_inf8.5.2用戶自定義函數(shù)的修改與刪除ALTERFUNCTION修改自定義函數(shù)DROPFUNCTION刪除自定義函數(shù)語法如下:DROPFUNCTION所有者名稱.函數(shù)名稱[,…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()”查詢設(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打開游標(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)的使用開封大學(xué)信息工程學(xué)院8.6.1游標(biāo)的概念作用:在T-SQL腳本程序、存儲過程、觸發(fā)器中對SELECT語句返回的結(jié)果集進(jìn)行逐行逐字段處理,把一個完整的數(shù)據(jù)表按行分開,一行一行的逐一提取記錄,并從這一記錄行中逐一提取各項(xiàng)數(shù)據(jù)。SQLServer2008中的游標(biāo)具有以下幾個特點(diǎn):游標(biāo)返回一個完整的結(jié)果集,但允許程序設(shè)計(jì)語言只調(diào)用集合中的一行。允許定位在結(jié)果集的特定行??梢詮慕Y(jié)果的當(dāng)前位置檢索一行或多行。支持對結(jié)果集中當(dāng)前位置的行進(jìn)行數(shù)據(jù)修改??梢詾槠渌脩魧︼@示在結(jié)果集中的數(shù)據(jù)庫數(shù)據(jù)所做的更改提供不同級別的可能性支持。提供腳本、存儲過程和觸發(fā)器中用于訪問結(jié)果集中的數(shù)據(jù)的T-SQL語句。使用過程:定義聲明游標(biāo)→打開游標(biāo)→從游標(biāo)中提取記錄并分離數(shù)據(jù)→關(guān)閉游標(biāo)→釋放游標(biāo)。8.6.2聲明游標(biāo)兩種定義方式基于SQL-92標(biāo)準(zhǔn)的定義語句T–SQL擴(kuò)展的游標(biāo)聲明語句

基于SQL-92標(biāo)準(zhǔn)的定義語句格式:DECLARE游標(biāo)名[INSENSITIVE][SCROLL]CURSORFORSELECT語句

[FOR{READONLY|UPDATA[OF字段名[,…n]]}]【說明】INSENSITIVE定義游標(biāo)時自動在系統(tǒng)tempdb數(shù)據(jù)庫中創(chuàng)建一個臨時表存儲游標(biāo)使用的數(shù)據(jù),在游標(biāo)使用過程中基表數(shù)據(jù)改變不影響游標(biāo)的數(shù)據(jù),但該游標(biāo)的數(shù)據(jù)不允許修改。省略該項(xiàng)表示游標(biāo)直接從基表中取得數(shù)據(jù),即游標(biāo)使用的數(shù)據(jù)將隨基表數(shù)據(jù)的變化而動態(tài)變化。SCROLL表示該游標(biāo)可以在FETCH語句中任意指定數(shù)據(jù)的提取方式,省略該項(xiàng)表示該游標(biāo)僅支持NEXT順序提取方式。SELECT指定該游標(biāo)使用的結(jié)果集,不允許使用COMPUTE或INTO子句。READONLY表示只讀,該游標(biāo)中的數(shù)據(jù)不允許修改,即不允許在UPDATE或DELETE語句中引用該游標(biāo)。UPDATA[OF字段名[,…n]]表示在該游標(biāo)內(nèi)可以更新基本表的指定字段,省略字段名列表表示可以更新所有字段。T–SQL擴(kuò)展的游標(biāo)聲明語句DECLARE游標(biāo)名CURSOR[FORWARD_ONLY|SCROLL][STATIC|KEYSET|DYNAMIC|FAST_FORWARD][READ_ONLY|OPTIMISTIC][TYPE_WARNING]FORSELECT語句

[FORUPDATE[OF字段名[,…n]]]【說明】FORWARD_ONLY指定該游標(biāo)為順序結(jié)果集,只能用NEXT向后方式順序提取記錄。SCROLL指定該游標(biāo)為滾動結(jié)果集,可以使用向前、向后、定位方式提取記錄。STATIC與INSENSITIVE含義相同,在系統(tǒng)tempdb數(shù)據(jù)庫中創(chuàng)建臨時表存儲游標(biāo)使用的數(shù)據(jù),即游標(biāo)不會隨基本表內(nèi)容而變化,同時也無法通過游標(biāo)來更新基本表。KEYSET指定游標(biāo)中列的順序是固定的,并且在tempdb內(nèi)建立一個KEYSET表,基本表數(shù)據(jù)修改時能反映到游標(biāo)中。如果基本表添加符合游標(biāo)的新記錄時該游標(biāo)無法讀取(但其他語句使用WHERECURRENTOF子句可對游標(biāo)中新添加的記錄數(shù)據(jù)進(jìn)行修改)。如果游標(biāo)中的一行被刪除掉,則用游標(biāo)提取時@@FETCH_STATUS的返回值為-2。DYNAMIC指定游標(biāo)中的數(shù)據(jù)將隨基本表而變化,但需要大量的游標(biāo)資源。FAST_FORWARD指定FORWARD_ONLY而且READ_ONLY類型游標(biāo)。使用FAST_FORWARD參數(shù)則不能同時使用FORWARD_ONLY、SCROLL、OPTIMISTIC或FORUPDATE參數(shù)。OPTIMISTIC指明若游標(biāo)中的數(shù)據(jù)已發(fā)生變化,則對游標(biāo)數(shù)據(jù)進(jìn)行更新或刪除時可能會導(dǎo)致失敗。TYPE_WARNING指定若游標(biāo)中的數(shù)據(jù)類型被修改成其他類型時,給客戶端發(fā)送警告。若省略FORWARD_ONLY|SCROLL則不使用STATIC、KEYSET和DYNAMIC時默認(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類型游標(biāo)默認(rèn)為READ_ONLY;DYNAMIC和KEYSET類型游標(biāo)默認(rèn)為OPTIMISTIC?!咀⒁狻坎荒軐QL-92游標(biāo)語法與T-SQL游標(biāo)的擴(kuò)展語法混合使用。若在CURSOR前使用了SCROLL或INSENSITIVE則為SQL-92游標(biāo)語法,則不能再在CURSOR和FORSELECT語句之間使用任何保留字,反之同理。8.6.3打開游標(biāo)格式:OPEN[GLOBAL]游標(biāo)名【說明】如果全局游標(biāo)與局部游標(biāo)同名時,GLOBAL表示打開全局游標(biāo),省略為打開局部游標(biāo)。打開游標(biāo)后,可以使用全局變量@@ERROR判斷該游標(biāo)是否打開成功。@@ERROR為0則打開成功,否則打開失敗。使用全局變量@@CURSOR_ROWS可得到打開游標(biāo)中當(dāng)前存在的記錄行數(shù),其返回值為:0:表示無符合條件的記錄或該游標(biāo)已經(jīng)關(guān)閉或已釋放-1:表示該游標(biāo)為動態(tài)的,記錄行經(jīng)常變動無法確定n:正整數(shù)n表示指定結(jié)果集已從表中全部讀入,總共n條記錄-m:表示指定的結(jié)果集還沒全部讀入,目前游標(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]]【說明】FETCH之后的參數(shù)為提取記錄的方式,可以是以下方式之一:NEXT順序向下提取當(dāng)前記錄行的下一行,并將其作為當(dāng)前行。第一次對游標(biāo)操作時取第一行為當(dāng)前行,處理完最后一行,再用FETCHNEXT則CURSOR指向結(jié)果集最后一行之后,@@FETCH_STATUS的值為-1。PRIOR順序向前提取當(dāng)前記錄的前一行,并將其作為當(dāng)前行。第一次用FETCHPRIOR對游標(biāo)操作時,沒有記錄返回,游標(biāo)指針CURSOR仍指向第一行之前。FIRST提取游標(biāo)結(jié)果集的第一條記錄,并將其作為當(dāng)前行。LAST提取游標(biāo)結(jié)果集的最后一條記錄,并將其作為當(dāng)前行。ABSOLUTE{n|@nvar}按絕對位置提取游標(biāo)結(jié)果集的第n或第@nvar條記錄,并將其作為當(dāng)前行。若n或@nvar為負(fù)值則提取結(jié)尾之前的倒數(shù)第n或第@nvar條記錄。n為整數(shù),@nvar為整數(shù)類型變量。RELATIVE{n|@nvar}按相對位置提取當(dāng)前記錄之后(正值)或之前(負(fù)值)的第n或第@nvar條記錄,并將其作為當(dāng)前行。【說明】在游標(biāo)內(nèi)有一個游標(biāo)指針CURSOR指向游標(biāo)結(jié)果集的某個記錄行—稱為當(dāng)前行,游標(biāo)剛打開時CURSOR指向游標(biāo)結(jié)果集第一行之前。FROM指定提取記錄的游標(biāo),global用于指定全局游標(biāo),省略為局部游標(biāo)。NTO指定將提取記錄中的字段數(shù)據(jù)存入對應(yīng)的局部變量中。變量名列表的個數(shù)、類型必須與結(jié)果集中記錄的字段的個數(shù)、類型相匹配。打開游標(biāo)用FETCH提取記錄后,可用@@FETCH_STATUS檢測游標(biāo)的當(dāng)前狀態(tài)。@@FETCH_STATUS的返回值為:0:FETCH語句提取記錄成功-1:FETCH語句執(zhí)行失敗或提取的記錄不在結(jié)果集內(nèi)-2:被提取的記錄已被刪除或根本不存在

8.6.5關(guān)閉游標(biāo)格式:CLOSE[GLOBAL]游標(biāo)名說明:關(guān)閉游標(biāo),會釋放當(dāng)前結(jié)果集的內(nèi)存空間,然后解除定位游標(biāo)記錄行上的游標(biāo)指針。游標(biāo)關(guān)閉后,其定義結(jié)果仍然存儲在系統(tǒng)中,但不能提取記錄和定位更新,需要時可用OPEN語句再次打開。

8.6.6釋放游標(biāo)格式:DEALLOCATE[GLOBAL]游標(biāo)名說明:釋放游標(biāo)是指刪除游標(biāo)引用,釋放該游標(biāo)所占用的所有系統(tǒng)資源?!纠?-18】使用游標(biāo)逐條查看空調(diào)信息視圖(view_cond_inf)中空調(diào)的主要信息,用變量輸出各項(xiàng)主要數(shù)據(jù),并統(tǒng)計(jì)空調(diào)總臺數(shù)。USEbuildGODECLAREcurs_condcursorkeySET--定義游標(biāo)名為curs_condFORSELECTFacilityName,Model,Price,Quantity,AmountFROMview_cond_infOPENcurs_cond--打開游標(biāo)

IF@@error=0--判斷游標(biāo)打開成功

BEGINIF@@cursor_rows>0--判斷游標(biāo)結(jié)果集記錄個數(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))+'臺'+'總價(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))+'臺'+'總價(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))+'臺'+'總價(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)總臺數(shù)為:'+CASt(@sumASchar(6))ENDENDELSEPRINT'游標(biāo)打開失?。?CLOSEcurs_cond--關(guān)閉游標(biāo)

DEALLOCATEcurs_cond--刪除游標(biāo)小結(jié)在SQLServer中使用T-SQL進(jìn)行程序設(shè)計(jì)時,通常是使用批處理來提交一個或多個T-SQL語句,一個

溫馨提示

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

最新文檔

評論

0/150

提交評論