第13章Transact-SQL程式设计讲解课件_第1页
第13章Transact-SQL程式设计讲解课件_第2页
第13章Transact-SQL程式设计讲解课件_第3页
第13章Transact-SQL程式设计讲解课件_第4页
第13章Transact-SQL程式设计讲解课件_第5页
已阅读5页,还剩187页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第13章Transact-SQL程式設計13-1Transact-SQL語言的基礎13-2批次的使用13-3註解與自訂訊息13-4變數的宣告與使用13-5運算式與運算子13-6流程控制結構13-7錯誤處理13-8產生SQLServer指令碼第13章Transact-SQL程式設計13-1Tran113-1Transact-SQL語言的基礎13-1-1Transact-SQL資料庫語言13-1-2Transact-SQL指令碼檔案13-1Transact-SQL語言的基礎13-1-1T213-1-1Transact-SQL資料庫語言Transact-SQL(簡稱T-SQL)是MicrosoftSQLServer資料庫系統支援的資料庫查詢語言,為了方便說明,在本書是使用T-SQL取代全名Transact-SQL。T-SQL的語法是遵循ANSI-SQL92標準所制定,它最早是由Sybase公司所開發,只是擴充語法增加程式設計功能。簡單的說,T-SQL就是ANSI-SQL結構化查詢語言可程式化的擴充版本。T-SQL擴充ANSI-SQL增加功能強大的程式設計相關指令,包含:變數宣告、條件處理、錯誤處理、指標和眾多函數等,可以讓我們撰寫SQL程式碼檔案的批次、預存程序、自訂函數和觸發程序。13-1-1Transact-SQL資料庫語言Transa313-1-2Transact-SQL指令碼檔案-說明SQLServer指令碼(Scripts)是儲存在檔案中的一系列T-SQL指令敘述,其副檔名是.sql,因為內容是一般文字檔案,所以,我們可以使用Windows記事本、WordPad或其他程式碼編輯工具來建立和編輯T-SQL指令碼檔案。在SQLServer的ManagementStudio和SQLCMD等工具程式都可以載入和執行儲存在檔案中的T-SQL指令敘述,例如:書附光碟各章節的SQL範例的指令碼檔案。13-1-2Transact-SQL指令碼檔案-說明SQL413-1-2Transact-SQL指令碼檔案-

使用方式將建立資料庫或操作所執行的T-SQL指令碼永久保存至檔案,其功能如同是一種資料庫備份機制。事實上,ManagementStudio就提供產生SQLServer指令碼精靈,可以幫助我們自動產生資料庫的T-SQL指令碼。因為儲存成檔案,換句話說,我們可以在不同電腦或伺服器間交換、傳送和執行T-SQL指令碼檔案。為了方便訓練員工、除錯或升級所需,我們可以將T-SQL指令敘述儲存成檔案,以方便指令碼除錯、瞭解指令碼或修改指令碼內容。13-1-2Transact-SQL指令碼檔案-

使用方式513-2批次的使用13-2-1批次的基礎13-2-2使用GO指令定義批次13-2批次的使用13-2-1批次的基礎613-2-1批次的基礎-說明批次(Batch)是從應用程式將T-SQL指令敘述送至SQLServer資料庫引擎執行的基本單位。因為批次允許同時包裹一至多個T-SQL指令敘述,換句話說,我們能夠一次包裹執行多個T-SQL指令敘述。批次是一組T-SQL指令敘述的集合,我們可以在應用程式使用批次將多個T-SQL指令敘述包裹起來,一起送至SQLServer資料庫引擎來執行,對於SQLServer資料庫引擎來說,在剖析、編譯和執行批次時,批次的多個T-SQL指令敘述會編譯成單一的執行單位,稱為「執行計劃」(ExecutionPlan),然後一次就執行完執行計劃中的所有指令敘述。13-2-1批次的基礎-說明批次(Batch)是從應用程式713-2-1批次的基礎-錯誤處理方式編譯階段錯誤:如果批次中的T-SQL指令語法有錯誤,就會中止編譯,因為尚未編譯成執行計劃,所以批次中的任何指令敘述都不會執行。例如:批次共有5個T-SQL指令敘述,若第3個指令敘述編譯錯誤,在批次中的所有指令敘述都不會執行。執行階段錯誤:如果批次完成編譯,在執行時發生錯誤,大部分情況是中止目前指令敘述和之後指令敘述的執行(例如:找不到資料表),不過,少數情況(例如:違反限制性條件時)就只會中止目前的指令敘述,仍然會執行剩下的指令敘述。13-2-1批次的基礎-錯誤處理方式編譯階段錯誤:如果批次813-2-2使用GO指令定義批次-說明在SQLServer的ManagementStudio和SQLCMD工具程式是使用GO指令來定義批次的結束,GO指令並不是T-SQL指令,它只是一個代表結束點的符號,以便在T-SQL指令碼檔案分隔出一至多個批次。換句話說,如果T-SQL指令碼沒有使用GO指令,隱含表示這個T-SQL指令碼就是一個批次,因為SQLServer會自動替我們加上GO指令。13-2-2使用GO指令定義批次-說明在SQLServe913-2-2使用GO指令定義批次-範例SQL指令碼檔:Ch13-2-2.sql使用GO指令建立擁有多個批次的T-SQL指令碼,如下所示:CREATEVIEW課程_高學分ASSELECT*FROM課程WHERE學分>=4GOSELECT*FROM課程_高學分13-2-2使用GO指令定義批次-範例SQL指令碼檔:Ch1013-2-2使用GO指令定義批次-範例說明GO指令是SQLServer工具程式ManagementStudio和SQLCMD定義批次的方式,其他工具或使用ADO、ADO.NET、OLEDB或ODBC撰寫的資料庫應用程式時,每一個T-SQL指令字串就是一個批次。請注意!一些T-SQL指令一定需要獨立成一個批次,並不能和其他T-SQL指令一起執行,這些指令有:CREATEDEFAULT、CREATEFUNCTION、CREATEPROCEDURE、CREATERULE、CREATETRIGGER或CREATEVIEW指令。換句話說,在這些指令後一定記得加上GO指令。13-2-2使用GO指令定義批次-範例說明GO指令是SQL1113-3註解與自訂訊息13-3-1註解13-3-2PRINT指令輸出自訂訊息13-3-3USE指令轉換資料庫13-3註解與自訂訊息13-3-1註解1213-3-1註解T-SQL語言的註解有兩種方式,第一種是使用「/*」和「*/」符號來標示註解文字,如下所示:/*使用教務系統資料庫*/USE教務系統GOT-SQL的註解還可以跨過很多列,如下所示:/*---------------------------

使用教務系統資料庫------------------------------*/USE教務系統GO13-3-1註解T-SQL語言的註解有兩種方式,第一種是使1313-3-2PRINT指令輸出自訂訊息PRINT輸出指令可以傳回使用者自訂訊息至用戶端程式,它能夠輸出字串資料型別的字串、Unicode字串常數、字串運算式或T-SQL變數值的訊息文字,其基本語法如下所示:PRINT字串運算式例如:一些PRINT指令的範例,如下所示:PRINT'Thisisatest.'PRINTN'Thisisabook.'PRINT@msg13-3-2PRINT指令輸出自訂訊息PRINT輸出指令可1413-3-3USE指令轉換資料庫USE指令可以轉換指令碼使用的資料庫,其基本語法如下所示:USE資料庫名稱上述語法可以轉換至指定【資料庫名稱】的資料庫,在同一個SQL指令碼檔案,我們可以重複使用USE指令來轉換成不同資料庫來執行T-SQL指令敘述,例如:轉換成【教務系統】資料庫,如下所示:USE教務系統13-3-3USE指令轉換資料庫USE指令可以轉換指令碼使1513-4變數的宣告與使用13-4-1宣告變數與變數初值13-4-2指定變數值13-4-3變數的範圍13-4-4SQLServer的系統函數13-4變數的宣告與使用13-4-1宣告變數與變數初值1613-4變數的宣告與使用T-SQL的變數(Variables)是一種批次中的物件,可以用來儲存指定資料型別在批次執行期間的暫存資料,其主要用途如下所示:在不同T-SQL指令敘述間傳遞資料。流程控制迴圈結構的計數器(Counter)或測試條件。預存程序或自訂函數的傳入參數或儲存傳回值。作為WHERE子句的條件。在T-SQL宣告的變數分為使用「@」開頭的區域變數(LocalVariables)和「@@」符號開始的系統函數(它也是一種全域變數)。13-4變數的宣告與使用T-SQL的變數(Variable1713-4-1宣告變數與變數初值-

宣告變數(語法)使用者在批次宣告的變數是一種T-SQL區域變數,當宣告變數後,在同一個批次的指令敘述就可以指定變數值,並且在批次之後的程式敘述存取此變數值。T-SQL語言是使用DECLARE指令來宣告變數,其基本語法如下所示:DECLARE@變數名稱1資料型別

[,@變數名稱2資料型別]…13-4-1宣告變數與變數初值-

宣告變數(語法)使用者在1813-4-1宣告變數與變數初值-

宣告變數(範例)例如:宣告名為@balance的int整數型別的變數,如下所示:DECLARE@balanceintDECLARE指令宣告一個名為@balance的整數變數,可以用來儲存整數沒有小數點的變數值。13-4-1宣告變數與變數初值-

宣告變數(範例)例如:宣1913-4-1宣告變數與變數初值-變數初值在SQLServer2008版支援變數初值,可以在宣告時,使用「=」等號來指定變數的初值。例如:宣告名為@total的int整數型別的變數,並且指定初值為100,如下所示:DECLARE@totalint=10013-4-1宣告變數與變數初值-變數初值在SQLServ2013-4-1宣告變數與變數初值-宣告多個變數不只如此,我們也可以在同一列T-SQL指令同時宣告多個變數且指定初值,而且可以是不同的資料型別,如下所示:DECLARE@myNamevarchar(12),@amountint=123,@mycounterint=513-4-1宣告變數與變數初值-宣告多個變數不只如此,我們2113-4-1宣告變數與變數初值-範例SQL指令碼檔:Ch13-4-1.sql在批次宣告名為@balance和@total變數,同時指定變數@total的初值後,使用PRINT指令顯示變數值,如下所示:DECLARE@balanceintDECLARE@totalint=100PRINT@balancePRINT@total13-4-1宣告變數與變數初值-範例SQL指令碼檔:Ch12213-4-2指定變數值-

使用SET指令(語法)在批次宣告T-SQL變數後,我們就可以使用SET指令來指定變數值,其語法如下所示:SET@變數名稱=運算式上述語法指定T-SQL變數是使用「=」指定運算子來指定成之後的運算式值,它可以是常數值、第13-5節的運算式或SELECT指令敘述的查詢結果。13-4-2指定變數值-

使用SET指令(語法)在批次宣告2313-4-2指定變數值-

使用SET指令(範例1)SQL指令碼檔:Ch13-4-2-01.sql在批次宣告T-SQL變數@balance且指定帳戶本金1000後,計算一年期本金加利息的帳戶餘額,如下所示:DECLARE@balanceintSET@balance=1000SET@balance=@balance*1.02PRINT‘總額:'+CAST(@balanceASchar)13-4-2指定變數值-

使用SET指令(範例1)SQL指2413-4-2指定變數值-

使用SET指令(範例2)SQL指令碼檔:Ch13-4-2-02.sql在批次宣告T-SQL變數@tatal後,使用SELECT指令的查詢結果來指定變數值,這是查詢【課程】資料表的總學分數,如下所示:DECLARE@totalintSET@total=(SELECTSUM(學分)FROM課程)PRINT‘學分數:'+CAST(@totalASchar)13-4-2指定變數值-

使用SET指令(範例2)SQL指2513-4-2指定變數值-

使用SELECT指令(語法)SELECT指令也可以用來指定變數值,或配合FROM子句將查詢結果的欄位值填入變數,其基本語法如下所示:SELECT@變數名稱=運算式或欄位名稱上述語法指定T-SQL變數是「=」等號後的運算式值,或查詢資料表的記錄資料,直接將欄位值指定成變數值。13-4-2指定變數值-

使用SELECT指令(語法)SE2613-4-2指定變數值-

使用SELECT指令(範例1)SQL指令碼檔:Ch13-4-2-03.sql在宣告T-SQL變數@myName後,使用SELECT指令來指定和顯示變數值,如下所示:DECLARE@myNamevarchar(12)SELECT@myName='陳會安'SELECT@myNameAS姓名13-4-2指定變數值-

使用SELECT指令(範例1)S2713-4-2指定變數值-

使用SELECT指令(範例2)SQL指令碼檔:Ch13-4-2-04.sql查詢【教務系統】資料庫的【員工】資料表,將姓名和城市欄位值填入T-SQL變數@myName和@myCity,如下所示:DECLARE@myNamevarchar(12)DECLARE@myCityvarchar(10)SELECT@myName=姓名,@myCity=城市FROM員工WHERE薪水>=60000SELECT@myNameAS姓名,@myCityAS城市13-4-2指定變數值-

使用SELECT指令(範例2)S2813-4-2指定變數值-

使用SELECT指令(範例3)SQL指令碼檔:Ch13-4-2-05.sql我們也可以使用T-SQL變數作為WHERE子句的條件,用來查詢【教務系統】資料庫的【課程】資料表,WHERE子句的條件是變數@c_no的值,如下所示:DECLARE@c_novarchar(5)SELECT@c_no='CS101'SELECT課程編號,名稱,學分FROM課程WHERE課程編號=@c_no13-4-2指定變數值-

使用SELECT指令(範例3)S2913-4-2指定變數值-

變數值的種類(說明)T-SQL變數的變數值有兩種,可以儲存單一值的純量變數,和整個資料表的資料表變數,如下所示:純量變數(ScalarVariables):這是一種儲存標準資料型別的單一值,在之前宣告的變數都是一種純量變數。資料表變數(TableVariables):可以儲存整個資料表內容的變數,我們可以在資料表變數使用SELECT、INSERT、UPDATE和DELETE指令,將它視為是一個標準資料表。13-4-2指定變數值-

變數值的種類(說明)T-SQL變3013-4-2指定變數值-

變數值的種類(資料表變數語法)在批次宣告資料表變數也是使用DECLARE指令,其基本語法和CREATETABLE指令類似,如下所示:DECLARE@資料表變數名稱table(欄位名稱1資料型別[欄位屬性清單][,欄位名稱1資料型別[欄位屬性清單]]…[,資料表屬性清單])上述語法是使用table資料型別來宣告資料表變數。13-4-2指定變數值-

變數值的種類(資料表變數語法)在3113-4-2指定變數值-

變數值的種類(資料表變數範例)SQL指令碼檔:Ch13-4-2-06.sql在宣告資料表變數@students後,使用INSERT/SELECT指令插入記錄資料後,最後再使用SELECT指令查詢資料表變數的內容,如下所示:DECLARE@studentstable(std_nochar(4),namevarchar(12))INSERT@studentsSELECT學號,姓名FROM學生WHERE性別='男'SELECT*FROM@students13-4-2指定變數值-

變數值的種類(資料表變數範例)S3213-4-3變數的範圍T-SQL區域變數的範圍(Scopes)是在同一個批次或預存程序,換句話說,所有在批次中使用的區域變數,也一定需要在同一個批次中宣告。我們不能存取其他批次中宣告的變數,如下所示:DECLARE@myNamevarchar(12)GOSELECT@myName='張無忌'GO13-4-3變數的範圍T-SQL區域變數的範圍(Scope3313-4-4SQLServer的系統函數-說明SQLServer的系統函數(SystemFunctions),舊名全域變數(GlobalVariables)可以傳回SQLServer系統資訊的值、物件或設定值。我們可以在T-SQL運算式或CREATETABLE指令的DEFAULT條件約束使用這些系統函數。13-4-4SQLServer的系統函數-說明SQLS3413-4-4SQLServer的系統函數-常用函數常用的系統函數說明,如下表所示:13-4-4SQLServer的系統函數-常用函數常用的3513-4-4SQLServer的系統函數-範例SQL指令碼檔:Ch13-4-4.sql使用系統函數取得SQLServer系統資訊,如下:DECLARE@MyRowCountint,@MyIdentityintINSERT課程備份SELECT課程編號,名稱,學分FROM課程WHERE學分>=4SET@MyRowCount=@@ROWCOUNTSET@MyIdentity=@@IDENTITYSELECT@MyRowCountAS影響的記錄數,@@SERVERNAMEAS伺服器名稱,@MyIdentityAS自動編號,@@ERRORAS錯誤編號13-4-4SQLServer的系統函數-範例SQL指令3613-5運算式與運算子13-5-1運算子的優先順序13-5-2T-SQL的運算子13-5-3再談T-SQL的指定運算子13-5-4型別轉換運算子13-5運算式與運算子13-5-1運算子的優先順序3713-5運算式與運算子T-SQL的運算式(Expressions)可以傳回單一值,它是由一或多個常數、識別名稱、函數、變數所組成,稱為運算元(Operands),在運算元之間使用運算子(Operators)來連接一或多個運算元。在T-SQL的運算式可以分為算術、條件、邏輯或字串等多種運算式。事實上,T-SQL指令的子句或子查詢也都可以使用運算式,例如:WHERE子句的條件運算式。13-5運算式與運算子T-SQL的運算式(Expressi3813-5-1運算子的優先順序13-5-1運算子的優先順序3913-5-2T-SQL的運算子-算術運算子算術運算子(ArithmeticOperators)就是加法(+)、減法(-)、乘法(*)、除法(/)和餘數(%),可以用來計算數值或日期/時間的運算,如下所示:PRINTCAST('1978-02-02'ASdatetime)-1PRINTCAST('1978-02-02'ASdatetime)+1上述T-SQL指令敘述可以顯示前一天和後一天的日期資料。在<第8-2-3節:計算值欄位>已經說明過這些算術運算子。13-5-2T-SQL的運算子-算術運算子算術運算子(Ar4013-5-2T-SQL的運算子-

比較、邏輯與字串連接運算子比較運算子(ComparisonOperators)可以用來比較數值、日期/時間或字串的大小,詳細的運算子說明請參閱<第8-4-1節:比較運算子>。邏輯運算子(LogicalOperators)可以連接條件運算式建立複雜的搜尋條件,或在子查詢判斷TRUE或FALSE。請參閱<第8-4-2節:邏輯運算子>和<第9-4-3節:邏輯運算子的子查詢>。字串連接運算子(StringConcatenationOperators)「+」號可以用來連接字串欄位值或字串常數,其資料型別儘限是char、varchar和text,進一步說明請參閱<第8-2-3節:計算值欄位>。13-5-2T-SQL的運算子-

比較、邏輯與字串連接運算4113-5-2T-SQL的運算子-位元運算子位元運算子(BitwiseOperators)AND、OR和XOR可以執行位元的邏輯運算,其說明如下表所示:13-5-2T-SQL的運算子-位元運算子位元運算子(Bi4213-5-2T-SQL的運算子-單運算元運算子單運算元運算子(UnaryOperators)只能有一個運算元,而且只能使用在數值型別,T-SQL共有3種單運算元運算子,如下表所示:13-5-2T-SQL的運算子-單運算元運算子單運算元運算4313-5-2T-SQL的運算子-指定運算子指定運算子(AssignmentOperator)可以將數值、字串等資料指定給欄位或T-SQL變數,進一步說明請參閱<第13-4-2節:指定變數值>。13-5-2T-SQL的運算子-指定運算子指定運算子(As4413-5-3再談T-SQL的指定運算子-說明T-SQL的指定敘述在SQLServer2008版可以配合其他運算子來簡化運算式的撰寫,建立更簡潔的T-SQL運算式,如下表所示:13-5-3再談T-SQL的指定運算子-說明T-SQL的指4513-5-3再談T-SQL的指定運算子-範例SQL指令碼檔:Ch13-5-3.sql在宣告2個變數後,使用類似C語言的縮寫方式來執行變數的乘法運算,如下所示:DECLARE@xint=4,@yint=20SET@x*=@ySELECT@x,@y13-5-3再談T-SQL的指定運算子-範例SQL指令碼檔4613-5-4型別轉換運算子-說明「資料型別轉換」(TypeConversions)是因為運算式可能擁有多個不同資料型別的變數或常數值。例如:在運算式中擁有int和smallint型別的變數時,就需要執行型別轉換。在T-SQL的型別轉換可以分為兩種,一種是SQLServer自動進行的轉換,例如:int和smallint會自動將smallint轉換成int,稱為「隱含型別轉換」(ImplicitConversion)。另一種情況是在運算式使用CAST運算子和CONVERT()函數來強迫轉換型別,稱為「強迫型別轉換」(ExplicitConversion)。13-5-4型別轉換運算子-說明「資料型別轉換」(Type4713-5-4型別轉換運算子-CAST運算子CAST運算子是ANSI-SQL標準的型別轉換運算子,可以將資料從一種資料型別轉換成另一種資料型別,如下所示:PRINT'TotalCredits:'+CAST(@totalASchar)PRINTCAST('1978-02-02'ASdatetime)-1上述T-SQL指令敘述分別將整數@tatal變數轉換成AS關鍵字後的char型別,和日期常數轉換成datetime型別。13-5-4型別轉換運算子-CAST運算子CAST運算子是4813-5-4型別轉換運算子-CONVERT()函數CONVERT()函數是T-SQL函數,一樣可以將資料從一種資料型別轉換成另一種資料型別,如下所示:PRINT'TotalCredits:'+CONVERT(char,@total)PRINTCONVERT(datetime,'1978-02-02')-1上述是和前述CAST運算子相同功能的T-SQL指令敘述,在CONVERT()函數的轉換型別是第1個參數。13-5-4型別轉換運算子-CONVERT()函數CONV4913-6流程控制結構13-6-1BEGIN/END指令區塊13-6-2IF/ELSE條件控制指令13-6-3RETURN中斷查詢指令13-6-4CASE多條件函數13-6-5WHILE迴圈控制指令13-6-6GOTO跳躍指令13-6-7WAITFOR暫停執行指令13-6流程控制結構13-6-1BEGIN/END指令區5013-6流程控制結構-說明T-SQL指令碼大部分是一列指令敘述接著一列指令敘述循序的執行,但是對於複雜的工作,為了達成預期的執行結果,我們需要使用「流程控制結構」(ControlStructures)來控制執行的流程。13-6流程控制結構-說明T-SQL指令碼大部分是一列指令5113-6流程控制結構-種類T-SQL流程控制指令可以配合條件判斷來執行不同的指令敘述,或重複執行指令敘述。流程控制主要分為兩類,如下所示:條件控制:條件控制是一個選擇題,可能為單一選擇或多選一,依照條件決定執行那一個指令敘述,或整個區塊的指令敘述。迴圈控制:迴圈控制是重複執行指令敘述或整個區塊的指令敘述,擁有結束條件來結束迴圈執行。13-6流程控制結構-種類T-SQL流程控制指令可以配合條5213-6-1BEGIN/END指令區塊-說明BEGIN/END指令可以將多個T-SQL指令群組成一個邏輯區塊,在T-SQL通常是搭配流程控制指令來使用。一般來說,BEGIN/END指令的使用時機,如下所示:WHILE迴圈指令需要包含一個邏輯區塊的T-SQL指令。IF或ELSE條件指令需要包含一個邏輯區塊的T-SQL指令。CASE函數需要包含一個邏輯區塊的T-SQL指令。13-6-1BEGIN/END指令區塊-說明BEGIN/E5313-6-1BEGIN/END指令區塊-範例簡單的說,當流程控制指令需要執行兩個或以上的T-SQL指令時,我們就需要使用BEGIN/END指令將它們括起來。如下所示:IF@dbName='教務系統'BEGINPRINT'Database:School'PRINT'Tables:Professor,Courses'END13-6-1BEGIN/END指令區塊-範例簡單的說,當流5413-6-2IF/ELSE條件控制指令-語法IF條件控制指令可以依條件決定是否執行T-SQL指令敘述,其基本語法如下所示:IF條件運算式

{指令敘述|BEGIN…END}[ELSE{指令敘述|BEGIN…END}13-6-2IF/ELSE條件控制指令-語法IF條件控制指5513-6-2IF/ELSE條件控制指令-範例1SQL指令碼檔:Ch13-6-2-01.sql在宣告變數@length後,使用IF條件判斷身高是購買全票或半票,如下所示:DECLARE@lengthintSET@length=125IF@length<=120PRINT'半票'IF@length>120BEGINPRINT'全票'PRINT'length>120'END13-6-2IF/ELSE條件控制指令-範例1SQL指令碼5613-6-2IF/ELSE條件控制指令-範例2SQL指令碼檔:Ch13-6-2-02.sql使用IF條件判斷【教授】資料表是否有記錄,如下所示:IF(SELECTCOUNT(*)FROM教授)>=1PRINT'教授資料表有存在記錄!'ELSEPRINT'教授資料表沒有記錄!'13-6-2IF/ELSE條件控制指令-範例2SQL指令碼5713-6-2IF/ELSE條件控制指令-範例3-1SQL指令碼檔:Ch13-6-2-03.sql使用IF條件判斷【教務系統】資料庫是否存在,接著判斷【課程】資料表是否存在,如下所示:USEmasterIFDB_ID('教務系統')ISNOTNULLPRINT'找到教務系統資料庫!'ELSEPRINT'教務系統資料庫找不到!'13-6-2IF/ELSE條件控制指令-範例3-1SQL指5813-6-2IF/ELSE條件控制指令-範例3-2

USE教務系統IFOBJECT_ID('課程')ISNOTNULLPRINT'找到課程資料表!'ELSEPRINT'找不到課程資料表!'13-6-2IF/ELSE條件控制指令-範例3-25913-6-3RETURN中斷查詢指令-語法RETURN指令可以中斷批次或預存程序的執行,也就是說,在此指令之後的指令敘述都不會執行,其基本語法如下所示:RETURN[整數運算式]上述語法的RETURN指令如果使用在預存程序,可以傳回一個整數值,如果沒有指定,預設傳回0。13-6-3RETURN中斷查詢指令-語法RETURN指令6013-6-3RETURN中斷查詢指令-範例-1SQL指令碼檔:Ch13-6-3.sql宣告變數來取得課程數,並且使用IF條件判斷【學生】資料表是否有記錄,如下所示:DECLARE@totalintSET@total=(SELECTCOUNT(*)FROM課程)IF(SELECTCOUNT(*)FROM學生)>=1BEGINPRINT'學生資料表有記錄資料!'RETURN13-6-3RETURN中斷查詢指令-範例-1SQL指令碼6113-6-3RETURN中斷查詢指令-範例-2ENDELSEPRINT'學生資料表沒有記錄資料!'PRINT'課程數:'+CAST(@totalASchar)13-6-3RETURN中斷查詢指令-範例-2END6213-6-4CASE多條件函數-

簡單CASE函數(語法)簡單CASE函數是執行單一值相等的比較,其基本語法如下所示:CASE輸入運算式

WHEN比對運算式THEN結果運算式[…n][ELSE例外的結果運算式]END13-6-4CASE多條件函數-

簡單CASE函數(語法)6313-6-4CASE多條件函數-

簡單CASE函數(範例)SQL指令碼檔:Ch13-6-4-01.sql使用CASE函數將【學生】資料表的性別欄位改為Male和Female來顯示,如下所示:SELECT學號,姓名,CASE性別

WHEN'男'THEN'Male'WHEN'女'THEN'Female'ELSE'N/A'ENDAS學生性別FROM學生13-6-4CASE多條件函數-

簡單CASE函數(範例)6413-6-4CASE多條件函數-

搜尋CASE函數(語法)搜尋CASE函數屬於多條件的比較,它並沒有輸入運算式,而是在每一個WHEN子句建立布林條件的運算式,其基本語法如下所示:CASEWHEN布林運算式THEN結果運算式[…n][ELSE例外的結果運算式]END13-6-4CASE多條件函數-

搜尋CASE函數(語法)6513-6-4CASE多條件函數-

搜尋CASE函數(範例-1)SQL指令碼檔:Ch13-6-4-02.sql使用CASE函數依年齡變數@age的條件來指定變數@type的值,如下所示:DECLARE@typevarchar(12),@ageintSET@age=25SET@type=CASEWHEN@age<15THEN'小孩'13-6-4CASE多條件函數-

搜尋CASE函數(範例-6613-6-4CASE多條件函數-

搜尋CASE函數(範例-2)WHEN@age<60THEN'成人'WHEN@age<100THEN'老人'ELSE'Free'ENDPRINT@type13-6-4CASE多條件函數-

搜尋CASE函數(範例-6713-6-5WHILE迴圈控制指令-語法T-SQL語言的WHILE迴圈指令可以建立迴圈的控制結構,不只如此,對於WHILE迴圈,我們還可以使用BREAK指令跳出迴圈,或CONTINUE指令繼續迴圈的執行。WHILE迴圈控制指令是在迴圈開頭檢查條件,開頭檢查可以判斷是否允許進入迴圈,只有當測試條件成立時才允許進入迴圈,不成立就離開迴圈,其基本語法如下所示:WHILE條件運算式

{指令敘述|BEGIN…END}13-6-5WHILE迴圈控制指令-語法T-SQL語言的W6813-6-5WHILE迴圈控制指令-範例SQL指令碼檔:Ch13-6-5-01.sql使用WHILE迴圈計算從1加至5的和,如下所示:DECLARE@counterint,@totalintSET@counter=1SET@total=0WHILE@counter<=5BEGINSET@total=@total+@counterPRINT'計數:'+CAST(@counterASchar)SET@counter=@counter+1ENDPRINT'1加到5='+CAST(@totalASchar)13-6-5WHILE迴圈控制指令-範例SQL指令碼檔:C6913-6-5WHILE迴圈控制指令-

巢狀迴圈(說明)巢狀迴圈是指在WHILE迴圈中擁有其他WHILE迴圈,迴圈如同巢狀般一層一層的排列。13-6-5WHILE迴圈控制指令-

巢狀迴圈(說明)巢狀7013-6-5WHILE迴圈控制指令-

巢狀迴圈(範例1-1)SQL指令碼檔:Ch13-6-5-02.sql在建立TextBooks資料表後,使用巢狀WHILE迴圈來新增資料表的記錄資料,如下所示:DECLARE@book_Idint,@category_IdintCREATETABLETextBooks(book_Idint,category_Idint)SET@book_Id=0SET@category_Id=0WHILE@book_Id<2BEGINSET@book_Id=@book_Id+113-6-5WHILE迴圈控制指令-

巢狀迴圈(範例1-17113-6-5WHILE迴圈控制指令-

巢狀迴圈(範例1-2)WHILE@category_Id<3BEGINSET@category_Id=@category_Id+1INSERTINTOTextBooksVALUES(@book_Id,@category_Id)ENDSET@category_Id=0ENDSELECT*FROMTextBooksDROPTABLETextBooks13-6-5WHILE迴圈控制指令-

巢狀迴圈(範例1-27213-6-5WHILE迴圈控制指令-

BREAK指令跳出迴圈(說明)WHILE迴圈如果尚未到達結束條件,我們可以在BEGIN/END區塊使用BREAK指令來強迫跳出迴圈,即中斷WHILE迴圈的執行。13-6-5WHILE迴圈控制指令-

BREAK指令跳出迴7313-6-5WHILE迴圈控制指令-

BREAK指令跳出迴圈(範例2-1)SQL指令碼檔:Ch13-6-5-03.sql使用WHILE迴圈計算1加至5的總和,WHILE迴圈是使用BREAK指令中斷迴圈執行,如下所示:DECLARE@counterint,@totalintSET@total=0SET@counter=1WHILE@counter<=15BEGINSET@total=@total+@counter13-6-5WHILE迴圈控制指令-

BREAK指令跳出迴7413-6-5WHILE迴圈控制指令-

BREAK指令跳出迴圈(範例2-2)PRINT'計數:'+CAST(@counterASchar)

SET@counter=@counter+1IF@counter>5BREAKENDPRINT'1加到5='+CAST(@totalASchar)13-6-5WHILE迴圈控制指令-

BREAK指令跳出迴7513-6-5WHILE迴圈控制指令-

CONTINUE指令繼續迴圈(說明)CONTINUE指令可以讓我們不用執行完整個迴圈,就馬上執行下一次迴圈。13-6-5WHILE迴圈控制指令-

CONTINUE指令7613-6-5WHILE迴圈控制指令-

CONTINUE指令繼續迴圈(範例3-1)SQL指令碼檔:Ch13-6-5-04.sql使用WHILE迴圈配合CONTINUE指令來計算1至100間的奇數總和,如下所示:DECLARE@counterint,@totalintSET@total=0SET@counter=0WHILE@counter<=99BEGIN13-6-5WHILE迴圈控制指令-

CONTINUE指令7713-6-5WHILE迴圈控制指令-

CONTINUE指令繼續迴圈(範例3-2)

SET@counter=@counter+1IF@counter%2=0CONTINUESET@total=@total+@counterENDPRINT'總和:'+CAST(@totalASchar)13-6-5WHILE迴圈控制指令-

CONTINUE指令7813-6-6GOTO跳躍指令-語法T-SQL語言的GOTO指令可以變更執行流程至指定的標籤(Label),其基本語法如下所示:GOTO標籤名稱上述語法可以跳躍至標籤名稱的下一個指令敘述來繼續的執行。標籤的基本語法如下所示:標籤名稱:上述語言在標籤名稱後是一個「:」符號。GOTO指令最常見的應用是跳出巢狀迴圈,因為BREAK指令只能跳出目前這一層WHILE迴圈,如果需要跳出整個巢狀迴圈,就需要使用GOTO指令。13-6-6GOTO跳躍指令-語法T-SQL語言的GOTO7913-6-6GOTO跳躍指令-範例1-1SQL指令碼檔:Ch13-6-6.sql在建立TextBooks資料表後,使用巢狀WHILE迴圈產生記錄資料,批次是使用GOTO指令跳出巢狀迴圈,所以並沒有執行完,如下所示:DECLARE@book_Idint,@category_IdintCREATETABLETextBooks(book_Idint,category_Idint)SET@book_Id=0SET@category_Id=0WHILE@book_Id<2BEGINSET@book_Id=@book_Id+1

13-6-6GOTO跳躍指令-範例1-1SQL指令碼檔:C8013-6-6GOTO跳躍指令-範例1-2WHILE@category_Id<3BEGINSET@category_Id=@category_Id+1IF@book_id=1AND@category_id=3GOTOBREAK_POINTINSERTINTOTextBooksVALUES(@book_Id,@category_Id)ENDSET@category_Id=0ENDBREAK_POINT:SELECT*FROMTextBooksDROPTABLETextBooks13-6-6GOTO跳躍指令-範例1-2WHILE@ca8113-6-7WAITFOR暫停執行指令-語法WAITFOR指令可以暫停批次、預存程序或交易的執行,其基本語法如下所示:WAITFOR{DELAY|TIME}時間上述語法可以使用DELAY關鍵字來指定延遲一段時間,例如:2秒,或使用TIME關鍵字指定延遲至指定的時間,例如:下午10點。時間格式是hh:mm:ss。13-6-7WAITFOR暫停執行指令-語法WAITFOR8213-6-7WAITFOR暫停執行指令-範例SQL指令碼檔:Ch13-6-7-01.sql延遲3秒才執行【學生】資料表的查詢,如下所示:WAITFORDELAY'00:00:03'SELECT*FROM學生SQL指令碼檔:Ch13-6-7-02.sql延遲至下午23點才執行【員工】資料表的查詢,如下所示:WAITFORTIME'23:00'SELECT*FROM員工13-6-7WAITFOR暫停執行指令-範例SQL指令碼檔8313-7錯誤處理13-7-1錯誤處理結構13-7-2使用RAISERROR指令產生錯誤訊息13-7錯誤處理13-7-1錯誤處理結構8413-7-1錯誤處理結構-語法TRY/CATCH錯誤處理結構分為TRY和CATCH區塊,其中CATCH區塊必須緊接在TRY區塊後,其基本語法如下所示:BEGINTRYT-SQL指令敘述ENDTRYBEGINCATCHT-SQL指令敘述ENDCATCH13-7-1錯誤處理結構-語法TRY/CATCH錯誤處理結8513-7-1錯誤處理結構-範例1-1SQL指令碼檔:Ch13-7-1-01.sql使用TRY/CATCH指令建立除以零錯誤的錯誤處理結構,如下所示:BEGINTRYSELECT1/0--除以零的錯誤ENDTRYBEGINCATCH--顯示錯誤資訊

SELECTERROR_NUMBER()ASErrorNumber,13-7-1錯誤處理結構-範例1-1SQL指令碼檔:Ch18613-7-1錯誤處理結構-範例1-2ERROR_SEVERITY()ASErrorSeverity,ERROR_STATE()ASErrorState,ERROR_PROCEDURE()ASErrorProcedure,ERROR_LINE()ASErrorLine,ERROR_MESSAGE()ASErrorMessageENDCATCH13-7-1錯誤處理結構-範例1-28713-7-1錯誤處理結構-錯誤處理函數在CATCH區塊可以使用錯誤處理函數來取得TRY區塊產生的錯誤資訊,其相關函數的說明如下表所示:13-7-1錯誤處理結構-錯誤處理函數在CATCH區塊可以8813-7-2使用RAISERROR指令產生

錯誤訊息-新增錯誤訊息(語法)RAISERROR指令除了可以產生系統預設的錯誤訊息外,我們也可以自行新增所需的錯誤訊息,這是使用sp_addmessage系統預存程序所新增的錯誤訊息,其基本語法如下所示:EXECsp_addmessage訊息編號,嚴重等級,'錯誤訊息文字',@lang='使用的語言'13-7-2使用RAISERROR指令產生

錯誤訊息-新增8913-7-2使用RAISERROR指令產生

錯誤訊息-新增錯誤訊息(範例)SQL指令碼檔:Ch13-7-2-01.sql使用系統預存程序新增成績為負數的自訂錯誤訊息,如下所示:EXECsp_addmessage55555,5,'Error!score<0!',@lang='us_english'GOEXECsp_addmessage55555,5,'成績為負數的錯誤!',@lang='繁體中文'13-7-2使用RAISERROR指令產生

錯誤訊息-新增9013-7-2使用RAISERROR指令產生

錯誤訊息-產生錯誤訊息(語法)RAISERROR指令可以自行產生錯誤訊息,其基本語法如下所示:RAISERROR({錯誤編號|錯誤訊息},嚴重等級,錯誤狀態)13-7-2使用RAISERROR指令產生

錯誤訊息-產生9113-7-2使用RAISERROR指令產生

錯誤訊息-產生錯誤訊息(範例)SQL指令碼檔:Ch13-7-2-02.sql使用TRY/CATCH指令建立錯誤處理結構,其中的錯誤是由RAISERROR指令產生錯誤編號55555的自訂錯誤,如下所示:BEGINTRYRAISERROR(55555,7,10)ENDTRYBEGINCATCHSELECTERROR_NUMBER()ASErrorNumber,ERROR_SEVERITY()ASErrorSeverity,ERROR_STATE()ASErrorState,ERROR_PROCEDURE()ASErrorProcedure,ERROR_LINE()ASErrorLine,ERROR_MESSAGE()ASErrorMessageENDCATCH13-7-2使用RAISERROR指令產生

錯誤訊息-產生9213-8產生SQLServer指令碼13-8-1使用物件總管產生指令碼13-8-2產生SQLServer指令碼精靈13-8產生SQLServer指令碼13-8-1使用物9313-8-1使用物件總管產生指令碼在ManagementStudio的「物件總管」視窗可以建立整個資料庫的T-SQL指令碼,或以預設選項建立指定資料庫物件的指令碼。指令碼可以直接產生至「查詢編輯器」視窗、檔案或剪貼簿。13-8-1使用物件總管產生指令碼在Management9413-8-2產生SQLServer指令碼精靈在SQLServer的ManagementStudio提供資料庫物件的產生SQL指令碼精靈,可以自動產生指定物件的SQL指令碼檔案。精靈能夠逐步引導我們建立所需的指令碼,並且可以選取多個物件來產生指令碼。13-8-2產生SQLServer指令碼精靈在SQLS95EndEnd96第13章Transact-SQL程式設計13-1Transact-SQL語言的基礎13-2批次的使用13-3註解與自訂訊息13-4變數的宣告與使用13-5運算式與運算子13-6流程控制結構13-7錯誤處理13-8產生SQLServer指令碼第13章Transact-SQL程式設計13-1Tran9713-1Transact-SQL語言的基礎13-1-1Transact-SQL資料庫語言13-1-2Transact-SQL指令碼檔案13-1Transact-SQL語言的基礎13-1-1T9813-1-1Transact-SQL資料庫語言Transact-SQL(簡稱T-SQL)是MicrosoftSQLServer資料庫系統支援的資料庫查詢語言,為了方便說明,在本書是使用T-SQL取代全名Transact-SQL。T-SQL的語法是遵循ANSI-SQL92標準所制定,它最早是由Sybase公司所開發,只是擴充語法增加程式設計功能。簡單的說,T-SQL就是ANSI-SQL結構化查詢語言可程式化的擴充版本。T-SQL擴充ANSI-SQL增加功能強大的程式設計相關指令,包含:變數宣告、條件處理、錯誤處理、指標和眾多函數等,可以讓我們撰寫SQL程式碼檔案的批次、預存程序、自訂函數和觸發程序。13-1-1Transact-SQL資料庫語言Transa9913-1-2Transact-SQL指令碼檔案-說明SQLServer指令碼(Scripts)是儲存在檔案中的一系列T-SQL指令敘述,其副檔名是.sql,因為內容是一般文字檔案,所以,我們可以使用Windows記事本、WordPad或其他程式碼編輯工具來建立和編輯T-SQL指令碼檔案。在SQLServer的ManagementStudio和SQLCMD等工具程式都可以載入和執行儲存在檔案中的T-SQL指令敘述,例如:書附光碟各章節的SQL範例的指令碼檔案。13-1-2Transact-SQL指令碼檔案-說明SQL10013-1-2Transact-SQL指令碼檔案-

使用方式將建立資料庫或操作所執行的T-SQL指令碼永久保存至檔案,其功能如同是一種資料庫備份機制。事實上,ManagementStudio就提供產生SQLServer指令碼精靈,可以幫助我們自動產生資料庫的T-SQL指令碼。因為儲存成檔案,換句話說,我們可以在不同電腦或伺服器間交換、傳送和執行T-SQL指令碼檔案。為了方便訓練員工、除錯或升級所需,我們可以將T-SQL指令敘述儲存成檔案,以方便指令碼除錯、瞭解指令碼或修改指令碼內容。13-1-2Transact-SQL指令碼檔案-

使用方式10113-2批次的使用13-2-1批次的基礎13-2-2使用GO指令定義批次13-2批次的使用13-2-1批次的基礎10213-2-1批次的基礎-說明批次(Batch)是從應用程式將T-SQL指令敘述送至SQLServer資料庫引擎執行的基本單位。因為批次允許同時包裹一至多個T-SQL指令敘述,換句話說,我們能夠一次包裹執行多個T-SQL指令敘述。批次是一組T-SQL指令敘述的集合,我們可以在應用程式使用批次將多個T-SQL指令敘述包裹起來,一起送至SQLServer資料庫引擎來執行,對於SQLServer資料庫引擎來說,在剖析、編譯和執行批次時,批次的多個T-SQL指令敘述會編譯成單一的執行單位,稱為「執行計劃」(ExecutionPlan),然後一次就執行完執行計劃中的所有指令敘述。13-2-1批次的基礎-說明批次(Batch)是從應用程式10313-2-1批次的基礎-錯誤處理方式編譯階段錯誤:如果批次中的T-SQL指令語法有錯誤,就會中止編譯,因為尚未編譯成執行計劃,所以批次中的任何指令敘述都不會執行。例如:批次共有5個T-SQL指令敘述,若第3個指令敘述編譯錯誤,在批次中的所有指令敘述都不會執行。執行階段錯誤:如果批次完成編譯,在執行時發生錯誤,大部分情況是中止目前指令敘述和之後指令敘述的執行(例如:找不到資料表),不過,少數情況(例如:違反限制性條件時)就只會中止目前的指令敘述,仍然會執行剩下的指令敘述。13-2-1批次的基礎-錯誤處理方式編譯階段錯誤:如果批次10413-2-2使用GO指令定義批次-說明在SQLServer的ManagementStudio和SQLCMD工具程式是使用GO指令來定義批次的結束,GO指令並不是T-SQL指令,它只是一個代表結束點的符號,以便在T-SQL指令碼檔案分隔出一至多個批次。換句話說,如果T-SQL指令碼沒有使用GO指令,隱含表示這個T-SQL指令碼就是一個批次,因為SQLServer會自動替我們加上GO指令。13-2-2使用GO指令定義批次-說明在SQLServe10513-2-2使用GO指令定義批次-範例SQL指令碼檔:Ch13-2-2.sql使用GO指令建立擁有多個批次的T-SQL指令碼,如下所示:CREATEVIEW課程_高學分ASSELECT*FROM課程WHERE學分>=4GOSELECT*FROM課程_高學分13-2-2使用GO指令定義批次-範例SQL指令碼檔:Ch10613-2-2使用GO指令定義批次-範例說明GO指令是SQLServer工具程式ManagementStudio和SQLCMD定義批次的方式,其他工具或使用ADO、ADO.NET、OLEDB或ODBC撰寫的資料庫應用程式時,每一個T-SQL指令字串就是一個批次。請注意!一些T-SQL指令一定需要獨立成一個批次,並不能和其他T-SQL指令一起執行,這些指令有:CREATEDEFAULT、CREATEFUNCTION、CREATEPROCEDURE、CREATERULE、CREATETRIGGER或CREATEVIEW指令。換句話說,在這些指令後一定記得加上GO指令。13-2-2使用GO指令定義批次-範例說明GO指令是SQL10713-3註解與自訂訊息13-3-1註解13-3-2PRINT指令輸出自訂訊息13-3-3USE指令轉換資料庫13-3註解與自訂訊息13-3-1註解10813-3-1註解T-SQL語言的註解有兩種方式,第一種是使用「/*」和「*/」符號來標示註解文字,如下所示:/*使用教務系統資料庫*/USE教務系統GOT-SQL的註解還可以跨過很多列,如下所示:/*---------------------------

使用教務系統資料庫------------------------------*/USE教務系統GO13-3-1註解T-SQL語言的註解有兩種方式,第一種是使10913-3-2PRINT指令輸出自訂訊息PRINT輸出指令可以傳回使用者自訂訊息至用戶端程式,它能夠輸出字串資料型別的字串、Unicode字串常數、字串運算式或T-SQL變數值的訊息文字,其基本語法如下所示:PRINT字串運算式例如:一些PRINT指令的範例,如下所示:PRINT'Thisisatest.'PRINTN'Thisisabook.'PRINT@msg13-3-2PRINT指令輸出自訂訊息PRINT輸出指令可11013-3-3USE指令轉換資料庫USE指令可以轉換指令碼使用的資料庫,其基本語法如下所示:USE資料庫名稱上述語法可以轉換至指定【資料庫名稱】的資料庫,在同一個SQL指令碼檔案,我們可以重複使用USE指令來轉換成不同資料庫來執行T-SQL指令敘述,例如:轉換成【教務系統】資料庫,如下所示:USE教務系統13-3-3USE指令轉換資料庫USE指令可以轉換指令碼使11113-4變數的宣告與使用13-4-1宣告變數與變數初值13-4-2指定變數值13-4-3變數的範圍13-4-4SQLServer的系統函數13-4變數的宣告與使用13-4-1宣告變數與變數初值11213-4變數的宣告與使用T-SQL的變數(Variables)是一種批次中的物件,可以用來儲存指定資料型別在批次執行期間的暫存資料,其主要用途如下所示:在不同T-SQL指令敘述間傳遞資料。流程控制迴圈結構的計數器(Counter)或測試條件。預存程序或自訂函數的傳入參數或儲存傳回值。作為WHERE子句的條件。在T-SQL宣告的變數分為使用「@」開頭的區域變數(LocalVariables)和「@@」符號開始的系統函數(它也是一種全域變數)。13-4變數的宣告與使用T-SQL的變數(Variable11313-4-1宣告變數與變數初值-

宣告變數(語法)使用者在批次宣告的變數是一種T-SQL區域變數,當宣告變數後,在同一個批次的指令敘述就可以指定變數值,並且在批次之後的程式敘述存取此變數值。T-SQL語言是使用DECLARE指令來宣告變數,其基本語法如下所示:DECLARE@變數名稱1資料型別

[,@變數名稱2資料型別]…13-4-1宣告變數與變數初值-

宣告變數(語法)使用者在11413-4-1宣告變數與變數初值-

宣告變數(範例)例如:宣告名為@balance的int整數型別的變數,如下所示:DECLARE@balanceintDECLARE指令宣告一個名為@balance的整數變數,可以用來儲存整數沒有小數點的變數值。13-4-1宣告變數與變數初值-

宣告變數(範例)例如:宣11513-4-1宣告變數與變數初值-變數初值在SQLServer2008版支援變數初值,可以在宣告時,使用「=」等號來指定變數的初值。例如:宣告名為@total的int整數型別的變數,並且指定初值為100,如下所示:DECLARE@totalint=10013-4-1宣告變數與變數初值-變數初值在SQLServ11613-4-1宣告變數與變數初值-宣告多個變數不只如此,我們也可以在同一列T-SQL指令同時宣告多個變數且指定初值,而且可以是不同的資料型別,如下所示:DECLARE@myNamevarchar(12),@amountint=123,@mycounterint=513-4-1宣告變數與變數初值-宣告多個變數不只如此,我們11713-4-1宣告變數與變數初值-範例SQL指令碼檔:Ch13-4-1.sql在批次宣告名為@balance和@total變數,同時指定變數@total的初值後,使用PRINT指令顯示變數值,如下所示:DECLARE@balanceintDECLARE@totalint=100PRINT@balancePRINT@total13-4-1宣告變數與變數初值-範例SQL指令碼檔:Ch111813-4-2指定變數值-

使用SET指令(語法)在批次宣告T-SQL變數後,我們就可以使用SET指令來指定變數值,其語法如下所示:SET@變數名稱=運算式上述語法指定T-SQL變數是使用「=」指定運算子來指定成之後的運算式值,它可以是常數值、第13-5節的運算式或SELECT指令敘述的查詢結果。13-4-2指定變數值-

使用SET指令(語法)在批次宣告11913-4-2指定變數值-

使用SET指令(範例1)SQL指令碼檔:Ch13-4-2-01.sql在批次宣告T-S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论