天天看點

T-SQL查詢進階--流程控制語句

     和其他進階語言一樣,T-SQL中也有用于控制流程的語句。T-SQL中的流程控制語句進一步擴充了T-SQL的力量……使得大部分業務邏輯可以在資料庫層面進行。但很多人對T-SQL中的流程控制語句并沒有系統的了解,本篇文章會系統的對T-SQL語句中的流程控制語句進行系統講解。

基本概念

     在沒有流程控制語句的情況下,T-SQL語句是按照從上到下的順序逐個執行:

     1

     使用流程控制語句可以讓開發人員可以基于某些邏輯進行選擇性的跳轉,實作了類似進階語言的跳轉結構:

     2 

流程控制語句的使用範圍和GO關鍵字

     流程控制語句隻能在單個批處理段(Batch),使用者自定義函數和存儲過程中使用。不能跨多個批處理段或者使用者自定義函數和存儲過程。

     因為這裡重點講到T-SQL查詢語句,是以這裡隻講批處理段(Batch).

     一個批處理段是由一個或者多個語句組成的一個批處理,之是以叫批處理是因為所有語句一次性被送出到一個SQL執行個體。在這個批處理範圍内,局部變量是互相可見的。

     而想讓多個語句分多次送出到SQL執行個體,則需要使用GO關鍵字。GO關鍵字本身并不是一個SQL語句,GO關鍵字可以看作是一個批處理結束的辨別符,當遇到GO關鍵字時,目前GO之前的語句會作為一個批處理直接傳到SQL執行個體執行。是以不在同一個批處理内局部變量不可見,也不可對跨批處理的語句使用流程控制語句.

     在同一個批進行中局部變量互相可見:

     3-1

    在不同批進行中局部變量不可見:

    3-2

    在不同批進行中,流程控制語句不能跨批處理:

    3-3

T-SQL中的8個流程控制語句關鍵字

    在T-SQL中,與流程控制語句相關的關鍵字有8個:

BEGIN...END

BREAK

GOTO

CONTINUE

IF...ELSE

WHILE

RETURN

WAITFOR

   下面對上述關鍵字進行挨個講解

BEGIN…END關鍵字

    BEGIN…END關鍵字也是流程控制語句需要用到的最基本關鍵字,用于将多個語句劃分成邏輯上的一部分。其實可以直接了解成類C語言中的花括号(“{}"“)

    4

WHILE/BREAK/CONTINUE關鍵字

   在T-SQL的流程控制語句中,循環語句隻有WHILE循環,并沒有傳統進階語言的FOR和SWITCH循環。WHILE除了被用于流程控制語句的循環之外,還經常被用于遊标之中。

   WHILE關鍵字和進階語言中的WHILE關鍵字幾乎完全一樣。WHILE循環中可以利用BREAK和CONTINUE關鍵字對循環進行控制。

   CONTINUE關鍵字用于結束本次循環,直接開始下一次循環。

   BREAK關鍵字用于直接跳出WHILE循環語句。

   這裡值得注意的是,當WHILE循環嵌套時,CONTINUE關鍵字和BREAK關鍵字隻會作用于它們所處的WHILE循環之内,不會對外部WHILE循環産生作用。

   一個簡單的例子如下:從1循環到10,當循環到7時,結束本次循環并繼續,當循環到8時,跳出循環

    5

IF..ELSE關鍵字

    IF..ELSE關鍵字實作了非此既彼的邏輯。和進階語言中的IF..ELSE具有完全一樣的使用方法,這裡就不再講述了,例子參看上圖。

    還有要注意的是IF經常會和EXISTS關鍵字相結合來檢視資料表中指定的資料是否存在,比如:

    我想查詢員工中沒有上級的人,如果有這個人,則輸出“XXX is our boss”,如果沒有,則輸出"There is no infomation about our boss”

    6

GOTO關鍵字

    GOTO關鍵字因為能打亂程式的整個流程而在進階語言中臭名卓著。GOTO關鍵字的使用非常簡單,定義一個跳轉标簽,隻要GOTO 标簽名就可以。如果說一定要使用GOTO關鍵字的話,最佳實踐是隻使用在錯誤處理上,比如:

    7

RETURN關鍵字

    Return是最簡單有效直接無條件告訴伺服器跳出某個批處理段(Batch),使用者自定義函數和存儲過程的方式。在同一個批進行中Return關鍵字直接截止目前Return所在的批處理(Batch),批處理有關概念請參考前面GO關鍵字那一節.

    簡單的Return概念如下例子:

    10

     在存儲過程中,Return語句後面可以傳回數字用于傳回執行狀态或者錯誤代碼。

     很多人會把Return語句和RAISERROR函數搞混,差別在于RAISERROR函數會引發錯誤,并且程式依然會往下執行:

     11

WAITFOR關鍵字

    WAITFOR關鍵字允許指定語句在特定時間或是推遲特定時間執行。

    推遲等待和在特定時間執行的文法分别是WAITFOR DELAY ‘需要等待的執行時間',WAITFOR TIME ‘需要執行程式的精确時間’

    簡單的文法例子如下:

    8

   WAITFOR的功能可以實作更為複雜的業務邏輯,比如:

   我想開始一項促銷活動,在目前時間10小時後開始,為8折,20小時後結束,變為9折:

   9

總結

   本篇文章從T-SQL查詢的角度講解了流程控制語句的8個關鍵字。利用好這些關鍵字是掌握複雜T-SQL查詢的必要條件。

分類: T-SQL

本文轉自CareySon部落格園部落格,原文連結http://www.cnblogs.com/CareySon/archive/2011/08/23/2150434.html,如需轉載請自行聯系原作者