




已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第9章 用T-SQL編程第9章 用T-SQL編程 本章學習目標Transact-SQL相對于ANSI SQL最大的不同在于它提供了豐富的編程結構。靈活使用這些編程的控制結構,用戶就可以實現(xiàn)任意復雜的應用規(guī)則,從而可以編出任意復雜的查詢控制語句。在SQL-Server 2000中,用戶還可以使用T-SQL語句編寫服務器端的程序,這些程序由批處理、注釋、程序中使用的變量、改變批中語句的執(zhí)行順序的流控制語言、錯誤和消息的處理等成分組成。本章主要對使用T-SQL語句編程方面的內(nèi)容進行詳細的講解,在講解的過程中采用循序漸進的方式,首先對多條語句的執(zhí)行過程進行講解,以激發(fā)讀者的學習興趣,接下來才對編程中具體涉及到的變量、語句、函數(shù)以及事務進行詳細講解。通過對本章的學習,讀者應熟悉在SQL Server中執(zhí)行多條語句的方式,熟悉變量以及事務等的定義、應用或調(diào)用,并能掌握使用各種流控制語句進行編程的方法。 學習重點與難點 執(zhí)行多條T-SQL語句 變量和流控制語句 系統(tǒng)函數(shù)和用戶自定義函數(shù) 事務及SQL-Server的鎖機制91 執(zhí)行多條T-SQL語句當要完成的任務不能由單獨的T-SQL語句來完成時,SQL Server提供了批、腳本、存儲過程以及觸發(fā)器等幾種方式來組織多條T-SQL語句。本節(jié)著重介紹批和腳本的內(nèi)容,而關于存儲過程和觸發(fā)器的內(nèi)容將在后面兩章討論。9.1.1 批所謂批,是從客戶機傳遞到服務器上的一組完整的數(shù)據(jù)和SQL指令。一個批是由一條或多條T-SQL語句組成的語句集,這些語句一起提交給服務器并在服務器端作為一個整體來執(zhí)行。SQL Server將批中的語句作為一個整體編譯為一個執(zhí)行計劃。因為批中的語句是作為一個整體提交給服務器的,所以可以節(jié)省系統(tǒng)開銷。在查詢分析器中,使用“GO”命令標志一個批的結束。GO不是通用的T_SQL語句,它的作用只是通知查詢分析器有多少語句包含在當前批中,查詢分析器將兩個GO之間的語句組成一個字符串交給服務器去執(zhí)行?;贠DBC或OLE DB應用程序編程接口的應用程序在試圖執(zhí)行GO語句時,會產(chǎn)生一個錯誤。例如,下面的例子包括三個批:CREATE TABLE doc_exd ( column_a INT) GOINSERT INTO doc_exd VALUES (-1)GOALTER TABLE doc_exd WITH NOCHECK ADD CONSTRAINT exd_check CHECK (column_a 1)因為SQL Server為一個批生成一個單獨的執(zhí)行計劃,所以一個批本身應該是完整的。不能在一個批中引用其他批定義的變量,也不能將注釋從一個批開始,在另一個批中結束。下面的一組語句執(zhí)行時就會出錯:USE NorthwindGODECLARE MyVar INT/*Start of the split comment.GOEnd of the split comment */SELECT MyVar=29GO在查詢分析器中執(zhí)行這組語句會返回以下錯誤信息:缺少注釋的結尾標記 */。在關鍵字 End 附近有語法錯誤。必須聲明變量 MyVar。SQL Server統(tǒng)一優(yōu)化、編譯和執(zhí)行一個批中的語句。如果在批中的語句出現(xiàn)編譯錯誤(如語法錯誤),那么將不能生成執(zhí)行計劃,該批中的任何一個語句都不會被執(zhí)行。有些情況下,如果在SQL指令中存放著一些像數(shù)據(jù)類型無法自動轉(zhuǎn)換等錯誤的時候,編譯器無法識別這些錯誤。在這種情況下,這個批處理只有在執(zhí)行過程中才會出錯。一般說來在這個錯誤指令以前的所有指令都會執(zhí)行成功。在錯誤指令以后的指令將會視錯誤指令所引起的錯誤嚴重程度而決定是否執(zhí)行下去。如果出現(xiàn)了運行時期的錯誤(比如違反約束或數(shù)字溢出),這時可能會有兩個結果:u 多數(shù)運行時錯誤將停止執(zhí)行批處理中當前語句和它之后的語句。u 少數(shù)運行時錯誤(如違反約束)僅停止執(zhí)行當前語句,而繼續(xù)執(zhí)行批中其它語句。 無論是哪種運行時期錯誤,在出錯語句之前的語句的執(zhí)行結果不會受到影響。惟一的例外是如果批處理在事務中而且錯誤導致事務回滾。批有如下一些限制:u CREATE DEFAULT、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER 和 CREATE VIEW 語句不能與其他語句位于同一個批中。u 不能在同一個批處理中修改一個表的結構,然后引用剛修改的新列。u 如果批的第一條語句是EXECUTE(執(zhí)行) 語句,則 EXECUTE 關鍵字可以省略,否則,不能省略。 9.1.2 腳本腳本是一系列順序提交的批,由這些批組成的一系列T-SQL語句存儲在一個文件中,該文件可以在查詢分析器中執(zhí)行。執(zhí)行腳本就是依次執(zhí)行其中的T-SQL語句。腳本用于保存重新創(chuàng)建數(shù)據(jù)庫對象或重復執(zhí)行的語句,可以使用查詢分析器或任何文本編輯器編寫,帶.sql擴展名保存。一個腳本可以包含一個或多個批,腳本中的GO命令標志一個批的結束,如果一個腳本中沒有包括任何GO命令,那么它被視為整個是一個批。腳本一般可以用于兩個方面:將服務器上創(chuàng)建一個數(shù)據(jù)庫的步驟永久地記錄在腳本文件中。將語句保存為腳本文件,從一臺計算機傳遞到另一臺,這樣可以方便地使兩臺計算機執(zhí)行同樣的操作。92 變量變量用于臨時存放數(shù)據(jù),其中的數(shù)據(jù)隨著程序的運行而變化,變量有名字及數(shù)據(jù)類型兩個屬性。變量名用于標識該變量,數(shù)據(jù)類型確定了該變量存放值的格式以及允許的運算。變量名必須是一個合法的標識符。在SQL Server中標識符分為兩類:(1)常規(guī)標識符。以ASCII字母、Unicode字母、下劃線(_)、或#開頭,后繼可跟一個或若干個ASCII字符、Unicode字符、下劃線(_)、美元符號($)、或#,但不能全為下劃線(_)、或#。常規(guī)標識符不能是T-SQL保留字。常規(guī)標識符中不允許嵌入空格或其他特殊字符。(2)分隔標識符。包括在雙引號(“ ”)或方括號( )內(nèi)的常規(guī)標識符或不符合常規(guī)標識符規(guī)則的標識符。標識符允許的最大長度為128個字符。符合常規(guī)標識符規(guī)則的標識符可以分隔,也可以不分隔。對不符合標識符規(guī)則的標識符必須進行分隔。在SQL Server中變量可分為兩類:全局變量和局部變量。9.2.1 局部變量局部變量是作用域局限在一定范圍內(nèi)的T-SQL對象。一般來說,局部變量在一個批處理(也可以是存儲過程或觸發(fā)器)中被聲明或定義,然后這個批處理內(nèi)的T-SQL語句就可以設置這個變量的值,或者是引用這個變量已經(jīng)被賦予的值。當這個批處理結束后,這個局部變量的生命周期也就隨之消亡。局部變量是用戶定義的變量,其名字必須以開始。局部變量用于保存單個數(shù)據(jù)值。局部變量用DECLARE語句聲明,所有局部變量在聲明后均初始化為NULL。語法格式為:DECLARE varaible_name datatype ,n其中varaible_name為局部變量名,并以開頭。Datatype是為該局部變量指定的數(shù)據(jù)類型。局部變量使用的數(shù)據(jù)類型可以是除text,ntext或image類型外所有的系統(tǒng)數(shù)據(jù)類型和用戶定義數(shù)據(jù)類型。一般來說,如果沒有特殊的用途,建議在應用時盡量使用系統(tǒng)提供的數(shù)據(jù)類型。這樣做可以減少維護應用程序的工作量。例1、聲明一個字符形變量E-mail,使用如下語句:DECLARE E_mail varchar(50)在一條DECLARE語句中可以聲明多個局部變量,變量之間用逗號分隔。例2、下面語句聲明三個局部變量:DECLARE lastname varchar(30),firstname varchar(20),tel varchar(30)當聲明局部變量后,可用SET或SELECT語句為其賦值。1、用SET語句為局部變量賦值一個SET語句只能給一個變量賦值。其語法格式為:SET varaible_name=expression其中varaible_name為局部變量名。Expression為任何有效的SQL Server表達式。例3、創(chuàng)建兩個局部變量pub_id和hire_date并賦值,然后在employee表中進行查詢。USE pubsGODECLARE pub_id char(4), hire_date datetimeSET pub_id = 0877SET hire_date = 1/01/93SELECT fname, lnameFROM employeeWHERE pub_id = pub_id and hire_date = hire_date例4、使用查詢給變量賦值。USE PubsGODECLARE rows intSET rows=(SELECT COUNT(*) FROM authors)GO2、用SELECT語句為局部變量賦值使用SELECT語句為局部變量賦值的語法格式為:SELECT varaible_name=expression ,n其中n表示可以給多個變量賦值。關于SELECT語句,需要說明以下幾點:u SELECT varaible_name通常用于將單個值返回到變量中,如果expression為列名,則返回多個值,此時將返回的最后一個值賦給變量。u 如果SELECT語句沒有返回值,變量將保留當前值。u 如果expression是不返回值的標量子查詢,則將變量設為NULL。u 一個SELECT語句可以初始化多個局部變量。例5、先聲明一個局部變量然后賦值,再將查詢到的結果賦值給變量。由于查詢語句沒有返回值,所以變量保留當前值。USE SalesDECLARE var1 nchar(20)SELECT var1=劉三SELECT var1=姓名FROM CustomersWHERE 電話=85697451SELECT var1在查詢分析器中執(zhí)行這組語句,返回結果如圖9-1所示:圖9-1 SELECT語句沒有返回值時,變量將保留當前值例6、當返回多個值時將最后一個值賦給變量。USE SalesDECLARE var1 nchar(20)SELECT var1=劉三SELECT var1=姓名FROM CustomersWHERE 電話 LIKE8%SELECT var1返回結果如圖9-2所示:圖9-2 返回多個值時將最后一個值賦給變量例7、賦值語句是不返回值的子查詢,將變量賦值為NULL。DECLARE var1 nchar(20)SELECT var1=劉三SELECT var1=(SELECT 姓名FROM CustomersWHERE 電話=86957458)SELECT var1返回結果如圖9-3所示:圖9-3 賦值語句是不返回值的子查詢,將變量賦值為NULL9.2.2 全局變量全局變量是用來記錄SQL Server服務器活動狀態(tài)的一組數(shù)據(jù),是SQL Server系統(tǒng)提供并賦值的變量,用戶不能建立全局變量,也不能給全局變量賦值或直接更改全局變量的值。通常將全局變量的值賦給局部變量,以便保存和處理。全局變量的名字以開始。SQL Server提供的全局變量分為兩類:u 與每次處理相關的全局變量。如 rowcount表示最近一個語句影響的行數(shù)。u 與系統(tǒng)內(nèi)部信息有關的全局變量。如version表示SQL Server的版本號。SQL Server一共提供了30多個全局變量。下面是一些常用全局變量的功能和使用方法。u CONNECTIONS:記錄自最后一次服務器啟動以來,所有針對此服務器進行連接數(shù)目,包括沒有連接成功的嘗試。使用CONNECTIONS可以讓系統(tǒng)管理員很容易地得到今天所有試圖連接本服務器的連接數(shù)目,例如:SELECT GETDATE() AS 時間,CONNECTIONS AS 連接數(shù)目 系統(tǒng)返回結果為:圖9-4 用CONNECTIONS查詢連接次數(shù)u CPU_BUSY:記錄自最后一次服務器啟動后,以ms為單位的CPU工作時間。u CURSOR_ROWS:返回在本次服務器連接中,打開游標取出數(shù)據(jù)行的數(shù)目。u DBTS:返回當前服務器中timestamp數(shù)據(jù)類型的當前值。u ERROR:返回執(zhí)行上一條Transact-SQL語句所返回的錯誤號。在SQL Server服務器執(zhí)行完一條語句后,如果該語句執(zhí)行成功,則將返回ERROR的值為0,如果該語句執(zhí)行過程中發(fā)生錯誤,則將返回錯誤信息,而ERROR將返回相應的錯誤編號,該標號將一直保持下去,直到下一條語句得到執(zhí)行為止。在編寫存儲過程時,應該經(jīng)常主動檢查ERROR的值,特別是在對數(shù)據(jù)庫進行了修改以后。如果返回的ERROR值非0,則表示發(fā)生了錯誤,應該采取相應的措施進行補救。又由于ERROR的值將會隨著每一個SQL語句的執(zhí)行而發(fā)生變化,所以應該在每次SQL語句執(zhí)行完后,馬上進行ERROR數(shù)值的檢查。例如下面的程序語句:USE PubsGODECLARE del_error int,ins_error int-開始事務BEGIN TRAN-執(zhí)行刪除命令DELETE authorsWHERE au_id=409-56-16088-捕獲執(zhí)行完刪除操作后的ERROR變量的值SELECT del_error=ERROR-執(zhí)行插入操作INSERT authorsVALUES(“409-56-16088”,”Bennet”,”Abraham”,”416 658-9932”,”6223 Bateman ST.”,“Berkeley”,”CA”,”941605”,1)-捕獲執(zhí)行完插入操作后的ERROR變量的值SELECT ins_error=ERROR-測試捕獲到的ERROR的值IF del_error=0 AND ins_error=0BEGIN-成功執(zhí)行確定事務的操作PRINT “The author information has been replaced”COMMIT TRANENDELSEBEGIN-有錯誤發(fā)生,檢查究竟是哪個語句有問題-然后回滾整個事務IF del_error0Print “An error occurred during execution of the DELETE statement.”IF ins_error0Print “An error occurred during execution of the INSRET statement.”ROLLBACK TRANENDGO在這個例子的一個事務中包含了兩個操作,程序在每次數(shù)據(jù)庫操作后都檢查了ERROR全局變量的值。如果兩個操作都正常結束,則確定這的事務,但是如果有一個操作出現(xiàn)問題,就回滾整個事務,使兩個操作一個都不成功。這個例子帶和很強的代表性,因為類似的問題在數(shù)據(jù)庫編程過程中會經(jīng)常用到。u FETCH_STATUS:返回上一次使用游標FETCH操作所返回的狀態(tài)值。返回值為0表示操作成功;返回值為-1表示操作失敗或已經(jīng)超出了游標所能操作的數(shù)據(jù)行的范圍;返回值為-2表示返回的值已經(jīng)丟失。u IDENTITY:返回最近一次插入的identity列的數(shù)值。u IDLE:返回以ms為單位計算的SQL Server服務器自最近一次啟動以來處于停頓狀態(tài)的時間。u IO_BUSY:返回以ms為單位計算的SQL Server服務器自最近一次啟動以來花在輸入和輸出上的時間。u LOCK_TIMEOUT:返回當前對數(shù)據(jù)鎖定的超時設置。u PACK_RECEIVED:返回一共向網(wǎng)絡上接受數(shù)據(jù)分組的數(shù)目。u PACK_SENT:返回自最近一次啟動以來一共向網(wǎng)絡上發(fā)送數(shù)據(jù)分組的數(shù)目。u PROCID:返回當前存儲過程的ID標識。u REMSERVER:返回在登錄記錄中記載遠程SQL Server服務器的名字。u ROWCOUNT:返回上一條SQL語句所影響到數(shù)據(jù)行的數(shù)目。對所有不影響數(shù)據(jù)庫數(shù)據(jù)的SQL語句,這個全局變量返回的結果為0。在進行數(shù)據(jù)庫編程時,經(jīng)常要檢測ROWCOUNT的返回值,以便明確所執(zhí)行的操作是否達到了目標。u SPID:返回當前服務器進程的ID標識。u TOTAL_ERRORS:返回自SQL Server服務器啟動后,所遇到讀寫錯誤的總數(shù)。u TOTAL_READ:返回自SQL Server服務器啟動以來,讀磁盤的次數(shù)。u TOTAL_WRITE:返回自SQL Server服務器啟動以來,寫磁盤的次數(shù)。u TRANCOUNT:返回當前連接中,處于活動狀態(tài)事務的數(shù)目。u VERSION:返回當前SQL Server服務器的安裝日期、版本及處理器的類型。9.2.3 注釋注釋是程序中不被執(zhí)行的正文。注釋的作用有兩個:(1)說明代碼的含義,增強代碼的可讀性;(2)可以把程序中暫時不用的語句注釋掉,使它們暫時不被執(zhí)行,等需要這些語句時,再將它們恢復。SQL Server的注釋有兩種:u /* */ :用于注釋多行,中間為注釋;注意多行注釋不能跨批。u -(兩個減號): 用于注釋單行。該內(nèi)容在前面以及后面的相關例子中都有使用,因此這里就不再舉例了。93 流控制語句流控制語句是T-SQL語言對ANSI92 SQL標準的擴充,它可以用來控制一個批、存儲過程或觸發(fā)器中T-SQL語句的執(zhí)行順序。T-SQL的流控制關鍵字包括:BEGINEND、WAITFOR、GOTO、WHILE、IFELSE、BREAK、RETURN、CONTINUE等。9.3.1 IFELSE條件判斷語句在程序中如果要對給定的條件進行判定,當條件為真或假時分別執(zhí)行不同的T-SQL語句,可用IF ELSE語句實現(xiàn)。IF ELSE語句的語法格式為:IF logical_expressionexpression1 ELSEexpression2 如果邏輯判斷表達式返回的結果是真,那么程序會執(zhí)行expression1;如果邏輯判斷表達式返回的結果是假,那么程序會執(zhí)行expression2。ELSE和expression2并不是必須的,如果沒有ELSE和expression2,那么當邏輯判斷表達式返回的結果是假時,就什么操作也不做。在SQL Server中可使用嵌套的IF ELSE條件判斷結構,而且對嵌套的層數(shù)沒有限制。如果在IF ELSE語句的IF區(qū)和ELSE區(qū)都使用了CREATE TABLE語句或SELECT INTO語句,那么CREATE TABLE語句或SELECT INTO語句必須使用相同的表名。IF ELSE語句可用在批處理、存儲過程(經(jīng)常使用這種結構測試是否存在某個參數(shù))及特殊查詢中。例如,判斷Pubs數(shù)據(jù)庫的authors表中是否有記錄的語句如下:USE PubsIF(SELECT COUNT(*) FROM authors)=0PRINT 沒有記錄ELSEPRINT 存在記錄IF和ELSE只對后面的一條語句有效,如果IF或ELSE后面要執(zhí)行的語句多于一條,那么這些語句需要用BEGINEND括起來組成一個語句塊。下面的例子即用于判斷Sales數(shù)據(jù)庫的Goods表中是否有貨品為CPU的貨品記錄,如果有,則顯示“此貨品存在”,并查詢此貨品庫存量。USE SalesIF EXISTS(SELECT *FROM GoodsWHERE 品名=CPU)BEGINPRINT 此貨品存在SELECT 品名,庫存量FROM GoodsWHERE 品名=CPUEND9.3.2 BEGINEND語句塊使用BEGINEND關鍵字可以將一組T-SQL語句封裝成一個完整的SQL語句塊。關鍵字BEGIN定義T-SQL語句塊的起始位置,關鍵字END標識同一塊T-SQL語句的結尾。SQL Server允許使用嵌套的BEGINEND語句塊。其語法格式為:BEGINlogical_expressionEND下面是一個使用BEGINEND語句塊的例子:USE PubsGO/*聲明用于發(fā)布消息的變量*/DECLARE message varchar(255)/*進行邏輯判斷*/IF EXISTS(SELECT PriceFROM titlesWHERE title_id LIKE BU% AND price$20)BEGINSET message=價格適中的書籍:PRINT messageSELECT titleFROM titlesWHERE price$20ENDELSE BEGINSET message=價格較貴的書籍:PRINT messageSELECT titleFROM titlesWHERE title_id LIKE BU% AND price$10ENDGO首先判斷是否存在書價低于$20的書,如果存在就顯示這些書的名字,這是一個封裝起來的語句塊,如果不存在就執(zhí)行另一個語句塊。9.3.3 WHILE循環(huán)語句WHILE語句的功能是在滿足條件的情況下,重復執(zhí)行同樣的語句。其語法格式為:WHILE logical_expressionBEGINexpressionBREAKCONTINUEEND當邏輯判斷表達式為真時,服務器將重復執(zhí)行SQL語句組。BREAK的作用是在某些情況發(fā)生時,立即無條件地跳出循環(huán),并開始執(zhí)行緊接在END后面的語句。CONTINUE的作用是在某些情況發(fā)生時,跳出本次循環(huán),開始執(zhí)行下一次循環(huán)。下面就是一個使用WHILE語句的例子。USE PubsGOWHILE NOT EXISTS(SELECT price FROM titlesWHERE price$50BREAKELSECONTINUEENDPRINT 書價太貴了本例在沒有查詢到存在書價超出$30的情況下,反復執(zhí)行BEGINEND語句塊中的內(nèi)容:首先將所有書的價格提高50%,并在存在最高價超過$50的情況下,跳出循環(huán)。9.3.4 CASECASE結構提供比IFELSE結構更多的選擇和判斷的機會。使用CASE語句可以很方便的實現(xiàn)多重選擇的情況,從而可以避免編寫多重的IFELSE嵌套循環(huán)。CASE結構有兩種形式:即簡單表達式和選擇表達式。1、 簡單表達式簡單表達式的語法格式如下:CASE input_expressionWHEN when_expression THEN result_expression nELSE else_result_expressionEND其中,input_expression微微用于做條件判斷的表達式;when_expression用于與input_expression比較,當與input_expression的值相等時執(zhí)行后面的result_expression語句。當沒有一個when_expression與input_expression的值相等時執(zhí)行else_result_expression語句。下面即為一個簡單表達式例子:USE pubsGOSELECT Category = CASE type WHEN popular_comp THEN Popular Computing WHEN mod_cook THEN Modern Cooking WHEN business THEN Business WHEN psychology THEN Psychology WHEN trad_cook THEN Traditional Cooking ELSE Not yet categorized END, CAST(title AS varchar(25) AS Shortened Title, price AS PriceFROM titlesWHERE price IS NOT NULLORDER BY type, priceCOMPUTE AVG(price) BY type2、選擇表達式選擇表達式的語法格式如下:CASEWHEN boolean_expression THEN result_expression nELSE else_result_expressionEND如果boolean_expression的值為True,就執(zhí)行result_expression語句。如果沒有一boolean_expression的值為True,則執(zhí)行else_result_expression語句。下面即為一個選擇表達式的例子:USE pubsGOSELECT Price Category = CASE WHEN price IS NULL THEN Not yet pricedWHEN price = 10 and price 20 THEN Coffee Table TitleELSE Expensive book!END,CAST(title AS varchar(20) AS Shortened TitleFROM titlesORDER BY price9.3.5 GOTOGOTO語句使一個批的執(zhí)行轉(zhuǎn)到另一個有標號的語句。GOTO語句和標號之間的語句永遠不會被執(zhí)行。其語法格式如下:GOTO label例如在Customers表中查詢姓名為“王飛”的記錄,如果存在就顯示出“姓名”和“職位”,如果不存在就跳出。USE SalesIF (SELECT COUNT(*)FROM CustomersWHERE 姓名=王飛)=0GOTO NOACTIONSELECT 姓名,職位FROM CustomersWHERE 姓名=王飛NOACTION:PRINT 記錄不存在9.3.6 RETURNRETURN語句可以在過程、批和語句塊中的任何位置使用,作用是無條件地從過程、批或語句塊中退出,在RETURN之后的其他語句不會被執(zhí)行。使用RETURN語句的語法格式為:RETURN intger_expression其中,intger_expression是一個整型表達式。一般情況下,只有在存儲過程中才會用到返回的整型結果,調(diào)用存儲過程的語句可以根據(jù)RETURN返回的值,判斷下一步應該執(zhí)行的操作。除非專門說明,在SQL Server中,系統(tǒng)存儲過程返回值為0時,表示調(diào)用成功,否則就是有問題發(fā)生。RETURN語句的具體用法在“存儲過程”中詳述。9.3.7 WAITFORWAITFOR語句可以將它之后的語句在一個指定的間隔之后執(zhí)行,或在未來的某一個只時間執(zhí)行。其語法格式如下:WAITFOR DELAY time| TIME time其中DELAY time用于指定 SQL Server必須等待的時間,最長可達24小時,time可以用datetime數(shù)據(jù)格式指定,用單引號括起來,但在值中不允許有日期部分,也可以用局部變量指定參數(shù)。TIME time 指定 SQL Server等待到某一時刻,time值的指定同上。執(zhí)行WAITFOR語句后,在到達指定的時間之前,將無法使用與SQL Server的連接。若要查看活動的進程和正在等待的進程,使用sp_who。例如,等待2秒后查詢Customers表。WAITFOR DELAY 00:00:02SELECT *FROM Sales.dbo.Customers又如,等待到當天15:04:45才執(zhí)行查詢。WAITFOR TIME 15:04:45SELECT *FROM Sales.dbo.Customers9.3.8 PRINT和RAISERROR1、PRINT語句PRINT語句的作用是在屏幕上顯示用戶信息。其語法格式為:PRINT string|local_variable|global_variable其中string可以是一字符串。local_variable和global_variable分別代表一個局部變量和一個全局變量,它必須是char或varchar類型,或可以隱式轉(zhuǎn)化成char或varchar類型。例如:PRINT This message was printed on + RTRIM(CONVERT(varchar(30), GETDATE()2、RAISERROR語句RAISERROR是一個比PRINT功能更強大的返回信息的語句,它的作用是將錯誤信息顯示在屏幕上。同時也可以記錄在NT日志中。RAISERROR可以返回以下兩種類型的信息:u 保存在sysmessages系統(tǒng)表中的用戶自定義錯誤信息,在RAISERROR語句中用錯誤號表示。自定義錯誤信息用sp_addmessage系統(tǒng)存儲過程添加到sysmessages系統(tǒng)表中。u RAISERROR語句中以字符串形式給出的錯誤信息。前面之所以說RAISERROR比PRINT強大,是因為RAISERROR能提供一些在PRINT中沒有的功能,具體包括:(1)RAISERROR能給返回的信息指定的錯誤號、錯誤嚴重等級和狀態(tài)。(2)RAISERROR可以要求該錯誤被記錄在SQL Server錯誤日志和Windows NT應用程序日志中。(3)RAISERROR中的信息字符串可以像C語言中的printf語句一樣有包含替換符的變量和參數(shù)。RAISERROR語句的語法格式為:RAISERROR ( msg_id | msg_str , severity , state , argument ,.n ) WITH option ,.n 其中:u msg_id是sysmessages系統(tǒng)表中用戶自定義錯誤信息的錯誤號。錯誤號需通過系統(tǒng)存儲過程sp_addmessage事先設置在sysmessages表中。任何用戶自定義錯誤號都應大于50000。u msg_str是指直接給出的錯誤消息。msg_str可以是像C語言中的printf語句一樣的格式化字符串。這種在RAISERROR語句中直接給出錯誤信息的錯誤號為50000。該錯誤號被保存在ERROR全局變量中。u severity是指錯誤的嚴重級別。用戶可以使用從 0 到 18 之間的嚴重級別。19 到 25 之間的嚴重級別只能由 sysadmin 固定服務器角色成員使用。若要使用 19 到 25 之間的嚴重級別,必須選擇 WITH LOG 選項。注意:20 到 25 之間的嚴重級別被認為是致命的。如果遇到致命的嚴重級別,客戶端連接將在收到消息后終止,并將錯誤記入錯誤日志和應用程序日志。u state是指發(fā)生錯誤時的狀態(tài)信息??梢允?到127之間的任意整數(shù)。u 錯誤的自定義選項。option 可以是LOG、NOWAIT以及SETERROR中的任何一個值。其中各個值及其相關描述如表9-1所示:表9-1 option各種取值及其相關描述值描述LOG將錯誤記入服務器錯誤日志和應用程序日志。記入服務器錯誤日志的錯誤目前被限定為最多 440 字節(jié)。NOWAIT將消息立即發(fā)送給客戶端。SETERROR將 ERROR 的值設置為 msg_id 或 50000,與嚴重級別無關。例如,在屏幕上顯示一條信息,信息中給出了當前使用的數(shù)據(jù)庫的標識號和名稱。信息是在語句中直接給出的,使用了格式化字符串。DECLARE dbid intSET dbid=DB_ID()DECLARE dbname nvarchar(128)SET dbname=DB_NAME()RAISERROR(The current database ID is:%d, the database name is : %s., 16,1, dbid,dbname) 將上例中的錯誤信息保存到SYSMESSAGE系統(tǒng)表中,然后在RAISERROR語句中用錯誤號調(diào)用。Sp_addmessage 50001,16, The current database ID is:%d, the database name is : %s.,us_englishGoDECLARE dbid intSET dbid=DB_ID()DECLARE dbname nvarchar(128)SET dbname=DB_NAME()RAISERROR(5001,16,1, dbid,dbname) 94 函數(shù)為了使用戶對數(shù)據(jù)庫進行查詢和修改時更加方便,SQL Server在T-SQL中提供了許多內(nèi)部函數(shù)以供用戶調(diào)用。使用Transact-SQL函數(shù)的方法很簡單,在T-SQL語句中引用這些函數(shù),并提供調(diào)用函數(shù)所需的參數(shù),服務器根據(jù)參數(shù)執(zhí)行系統(tǒng)函數(shù),然后返回正確的結果。T-SQL提供的函數(shù)可以分為:數(shù)學函數(shù)、字符串函數(shù)、日期函數(shù)、系統(tǒng)函數(shù)、統(tǒng)計函數(shù)及其他函數(shù)。此外,用戶還可以自定義函數(shù)。9.4.1 數(shù)學函數(shù)SQL Server提供的數(shù)學函數(shù)能夠在數(shù)學型表達式上進行數(shù)學運算,然后將結果或結果集返回給用戶。能在SQL Server的數(shù)學函數(shù)中使用的數(shù)據(jù)類型包括:decimal、integer、float、real、money、smallmoney、smallint和tinyint。在默認情況下,數(shù)學函數(shù)吧傳遞給它的數(shù)字當作十進制整數(shù)對待。在SQL Server中,數(shù)學運算的順序與普通數(shù)學運算一致,即:(1)執(zhí)行括號里的運算;(2)執(zhí)行乘方與開方運算;(3)按先乘除后加減的規(guī)則進行運算;(4)執(zhí)行邏輯運算。下面就來介紹一些常用的SQL Server數(shù)學函數(shù)。u ABS(數(shù)值型表達式):求絕對值函數(shù)。返回數(shù)值型表達式的絕對值,返回值的數(shù)據(jù)類型與輸入?yún)?shù)的數(shù)據(jù)類型一致。例如:SELECT ABS(-45.4)u ACOS(float 型表達式):反余弦函數(shù)。返回以弧度為單位的角度值,參數(shù)為real或float數(shù)據(jù)類型。u ASIN(float 型表達式):反正弦函數(shù)。返回以弧度為單位的角度值,參數(shù)為real或float數(shù)據(jù)類型。u ATAN(float 型表達式):反正切函數(shù)。返回以弧度為單位的角度值,參數(shù)為real或float數(shù)據(jù)類型。u ASII(字符型表達式):求ASII碼函數(shù)。返回制服型數(shù)據(jù)類型的ASII值,返回的數(shù)值類型為整型。例如:SELECT ASII(”H”)u AVG(ALL|DISTINCT表達式):求平均值函數(shù)。求一組數(shù)據(jù)的平均值,如果這組數(shù)據(jù)中包含有NULL的數(shù)據(jù),該數(shù)據(jù)將會被忽略。ALL關鍵字表示所有的數(shù)值將會計算在內(nèi),DISTINCT關鍵字表示相同實質(zhì)的數(shù)據(jù)將只會計算一次,默認取值為ALL。例如:USE PubsSELECT AVG(advance)FROM titlesWHERE type=businessu COUNT(ALL|DISTINCT |*表達式):記數(shù)函數(shù)。求一組數(shù)據(jù)的個數(shù),ALL和DISTINCT關鍵字的意義同上。COUNT(*)返回這一組里所有的數(shù)據(jù),包括重復數(shù)值和NULL。例如:USE PubsSELECT COUNT(DISTINCT city),COUNT(ALL city)FROM authorsu DEGREES(numeric型表達式):角度轉(zhuǎn)換函數(shù)。將以numeric型表達式給出的弧度轉(zhuǎn)換成叫的類型的數(shù)值。u CEILING(數(shù)值型表達式):返回最小的大雨或等于給定數(shù)值型表達式的整數(shù)值。返回值的數(shù)據(jù)類型與參數(shù)的數(shù)據(jù)類型相同。u FLOOR(數(shù)值型表達式):返回最大的小于或等于給定數(shù)值表達式的整數(shù)值。返回值的數(shù)據(jù)類型與參數(shù)的數(shù)據(jù)類型相同。u LOG(float 型表達式):求自然對數(shù)函數(shù)。返回給定參數(shù)值的自然對數(shù)結果。u LOG10(float 型表達式):求常用對數(shù)函數(shù)。返回給定參數(shù)值的常用對數(shù)結果。u POWER(數(shù)值型表達式1,數(shù)值型表達式2):乘方運算函數(shù)。進行乘方運算,POWER(2,3)表示2的3次方。乘方運算函數(shù)返回值的數(shù)據(jù)類型與第一個參數(shù)的數(shù)據(jù)類型相同。SQL Server支持負數(shù)的乘方運算。由于返回值第一個參數(shù)的數(shù)據(jù)類型相同,所以當?shù)谝粋€參數(shù)為整數(shù)時,返回值被轉(zhuǎn)換成了整數(shù)(0.125轉(zhuǎn)換成整數(shù)是0),當?shù)谝粋€參數(shù)的一位小數(shù)時,返回值也相應保留一位小數(shù)。u EXP(float 型表達式):求自然指數(shù)運算。求指定float表達式的自然指數(shù)值。u PI():求圓周率運算。不使用參數(shù),返回圓周率的常量值。u SQRT(float 型表達式):求指定float表達式的平方根,返回float型的結果。u SQUARE(float 型表達式):求平方值。返回指定float表達式的平方,返回float型的結果。u SIGN(數(shù)值型表達式):判斷相應數(shù)值表達式的正負屬性。在SQL Server中用+1表示正數(shù),用-1表示負數(shù)。u RAND(整型表達式):產(chǎn)生隨機數(shù)。返回一個位于0和1之間的隨機數(shù)。整型表達式在這里起著產(chǎn)生隨機數(shù)的起始值的作用。例如下面的語句:DECLARE COUNTER SMALLINTSET COUNTER=1WHILE COUNTER5BEGINSELECT RAND(COUNTER)SET COUNTER=COUNTER+1ENDGO此例產(chǎn)生4個隨機數(shù),分別使用1、2、3、4來作為各自隨機數(shù)的起始值。u ROUND(數(shù)值型表達式,整數(shù)):四舍五入。將數(shù)值表達式四舍五入成整數(shù)指定精度的形式。在這里,整數(shù)可以是正數(shù)或負數(shù),正數(shù)表示要進行運算的位置在小數(shù)點后,反之要運算的位置在小數(shù)點前。9.4.2 字符串函數(shù)Transact-SQL為方便用戶進行字符型數(shù)據(jù)的操作,提供了功能全面的字符串函數(shù)。下面是一些常見的字符串函數(shù)及其功能介紹:u LEN(字符型表達式):返回給定字符串數(shù)據(jù)的長度。u DATALENGTH(表達式):返回該表達式的值所占用的字節(jié)數(shù)。在處理變長度數(shù)據(jù)類型時使用DATALENGTH非常有用。例如:LEN函數(shù)和DATALENGTH函數(shù)的比較。SELECT LEN(123),DATALENGTH(123),DATALENGTH(12345)返回結果是:3 3 4u LEFT(字符型表達式,整型表達式):返回該字符型表達式最左邊給定整數(shù)個字符。例如:SELECT LEFT(Good morning,4)返回結果是:Goodu RIGHT(字符型表達式,整型表達式):返回該該字符型表達式最右邊給定整數(shù)個字符。例如SELECT RIGHT(Good morning,7)返回結果是:morning(字符串,表示開始位置的表達式,表示長度的表達式)返回該該字符串在起止位置之間的子串。例如:SELECT SUBSTRING(“abcdef”,2,3)返回結果是:bcdu UPPER(字符型表達式):將字符型表達式全部轉(zhuǎn)化為大寫形式。u LOWER(字符型表達式):將字符型表達式全部轉(zhuǎn)化為小寫形式。u SPACE(整型表達式):返回由給定整數(shù)個空格組成的字符串。u REPLICATE(字符型表達式,整型表達式):將給定的字符型表達式的值復制給定的整數(shù)遍。例如:SELECT REPLICATE(Good morning,3)返回結果是:Good morningGood morningGood morningu STUFF(字符型表達式1,開始位置,長度,字符型表達式2):將字符型表達式1從開始位置截斷給定長度的子串,然后將字符型表達式2從開始位置補充進去。例如:SELECT STUFF(Good morning,4,1,GOD)返回結果是:GooGOD morningu REVERSE(字符型表達式):返回一個與給定字符型表達式恰好順序顛倒的字符型表達式。例如:SELECT REVERSE(abcdefg)返回結果是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單人住宿改造方案(3篇)
- 公司疫情防御管理制度
- 廠內(nèi)特種機械管理制度
- 工廠改造防塵方案(3篇)
- 推銷計劃方案文案(3篇)
- 工地現(xiàn)場垃圾管理制度
- 華為軟件資產(chǎn)管理制度
- DB62T 4316-2021 岷山貓尾草規(guī)范
- DB62T 4462-2021 小麥品種 蘭天33號
- 小型活動安保方案(3篇)
- 2025年高考政治搶押秘籍(江蘇專用)時政熱點04哪吒2(學生版+解析)
- 廣東省深圳市2025年中考模擬歷史試題四套附參考答案
- 粵語知識測試題及答案
- 2025年北京市東城區(qū)初三語文一模作文《根基》寫作指導+范文
- 太陽能光伏發(fā)電系統(tǒng)多目標容量優(yōu)化配置技術研究
- 中央2024年中國合格評定國家認可中心招聘筆試歷年參考題庫附帶答案詳解
- 2025年高考化學考試易錯題易錯類型18物質(zhì)的分離、提純與鑒別(7大易錯點)(學生版+解析)
- 內(nèi)蒙古榮信化工有限公司招聘筆試題庫2025
- 美容外科概論試題及答案
- 加工風管合同樣本
- 2025-2030中國電動自行車充電樁行業(yè)市場深度分析及發(fā)展前景與投資研究報告
評論
0/150
提交評論