流程式控制制語句
流程式控制制語句是指那些用來控製程序執行和流程分支的命令,在SQL Server 2000中,育種控制語句主要用來控制SQL語句、語句塊或者預存程序執行流程。
( 1 ). begin end語句
begin end語句能夠將多個Transact - SQL語句組合成一個語句塊,並將它們視為一個單元處理。在條件陳述式和迴圈等控制流程程語句中,當符合特定條件便要執行兩個或者多個語句時,就需要使用beginend語句,其文法形式為:
begin
{sql_statement | statement_block}
end
例:
use taihang
go
declare @message varchar ( 200 )
if exists ( select * from 員工資料表
where 所屬部門 = ' 辦工室 ' )
begin
set @message = ' 下列人員在辦公室工作 '
print @message
select 員工姓名 from 員工資料表
where 所屬部門 = ' 辦公室 '
end
else
begin
set @message = ' 沒有人在辦公室 '
print @message
end
go
( 2 ). if else語句
if else語句是條件判斷語句,其中,else子句是可先的,最簡單的if語句沒有else子句部分。 if else語句用來判斷當某一條件成立時執行某段程式,條件不成立時執行另一段程式。SQL Server允許嵌套使用ifelse語句,而且嵌套層數沒有限制。
文法:
if boolean_expression
{sql_statement | statement_block}
[ else
{sql_statement|statement_block} ]
( 3 ). if exists
1 > .if後面的布林運算式可含有select語句,如果select語句一個值,它可用來與另一值進行比較,以得到布林運算式。
2 > .如果select語句返回不止一個值,可使用if exists .文法如下:
if exists ( select statement)
{sql_statement | statement_block}
[ else [bolean_expression ]
{sql_statement | statement_block}]
例:查詢標識號為1389的出版商出版的任何書的資訊
if exists ( select * from titles
where pub_id = ' 1389 ' )
begin
print ' 包含如書 '
select * from titles
where pub_id = ' 1389 '
end
else
print ' 無 '
注意:一定不要把ifexists和彙總函式一起使用,因為彙總函式總是返回資料,即使資料是0
( 4 ).while語句
while語句用於設定重複執行SQL語句或語句塊的條件。只要指定的條件為真,就重複執行語句。其中,continue語句可以使程式跳過continue語句後面的語句,回到while迴圈的第一行命令。break語句則使程式完全跳出迴圈,結束while語句的執行。
1 > break語句交在某些情況發生時,立即無條件地退出最內層while迴圈,文法為:
while邏輯運算式
begin
break
end
2 > continue語句在某些情況發生時,控製程序跳出本次迴圈,重新天始下一次while迴圈。文法為:
while邏輯運算式
begin
continue
end
注意:如果select語句用作while語句的條件,那麼,select語句必須包含在英文括弧中。
例:
declare @x int , @y int , @c int
select @x = 1 , @y = 1
while @x < 3
begin
print @x
while @y < 3
begin
select @c = 100 * @x + @y
print @c
select @y = @y + 1
end
select @x = @x + 1
select @y = 1
end
( 5 ).case運算式
case運算式可以計算多個條件,並將其中一個合格結果運算式返回。case運算式的文法為:
case 欄位名或變數名
when 邏輯運算式1 then 結果運算式1
when 邏輯運算式2 then 結果運算式2
when 邏輯運算式3 then 結果運算式3
else 結果運算式
end
例:調整員工工資,工作層級為1的上調8 % ,工作層級為2的上調7 % ,工作層級為3的上調6 % ,其它上調5 %
use taihang
go
update employee
set wage =
case
when job_level = ' 1 ' then wage * 1.08
when job_level = ' 2 ' then wage * 1.07
when job_level = ' 3 ' then wage * 1.06
else
then wage * 1.05
( 6 ).return語句
return語句用於無條件地終止一個查詢、預存程序或者批處理,此時位於return之後的程式將不會被執行。return語句的文法形式為:
return 整數運算式
通常,預存程序使用傳回碼表示預存程序執行的成功或失敗。無錯誤,則返回0,否則,返回非零值。
( 7 ).waitfor語句
waitfor語句用於暫時停止執行SQL語句、語句塊或者預存程序等,直到所設定的時間已過或者所設定的時間已到才繼續執行。
文法:
waitfor delay 時間間隔
其中:時間間隔指定執行waitfor語句之前需要等待事件,最多為24小時。
也可寫成: waitfor time 時間值
其中,時間值指定waitfor語句將要執行的時間
流程式控制制語句
Transact-SQL語言提供了一些可以用於改變語句執行順序的命令,稱為流程式控制制語句。流程式控制制語句允許使用者更好地組織預存程序中的語句,方便地實現程式的功能。流程式控制制語句與常見的程式設計語言類似,主要包含以下幾種。
(1) IF…ELSE語句
IF <條件運算式>
<命令列或程式塊>
[ELSE [條件運算式]
<命令列或程式塊>]
其中<條件運算式>可以是各種運算式的組合,但運算式的值必須是“真”或“假”。ELSE子句是可選的。IF…ELSE語句用來判斷當某一條件成立時執行某段程式,條件不成立時執行另一段程式。如果不使用程式塊,IF或ELSE只能執行一條命令。IF…ELSE可以嵌套使用,最多可嵌套32級。
(2) BEGIN…END語句
BEGIN
<命令列或程式塊>
END
BEGIN…END用來設定一個程式塊,該程式塊可以被視為一個單元執行。BEGIN…END經常在條件陳述式中使用,如IF…ELSE語句。如果當IF或ELSE子句為真時,想讓程式執行其後的多條語句,這時就要把這多條語句用BEGIN…END括起來使之成為一個語句塊。在BEGIN…END語句中可以嵌套另外的BEGIN…END語句來定義另一程式塊。
(3) CASE語句
CASE<運算式>
WHEN<運算式>THEN<運算式>
…
WHEN<運算式>THEN<運算式>
[ELSE<運算式>]
END
例如,在pubs資料庫中查詢每個作者所居住州的全名,可以使用如下代碼實現:
SELECT au_fname, au_lname,
CASE state
WHEN 'CA' THEN 'California'
WHEN 'KS' THEN 'Kansas'
WHEN 'TN' THEN 'Tennessee'
WHEN 'OR' THEN 'Oregon'
WHEN 'MI' THEN 'Michigan'
WHEN 'IN' THEN 'Indiana'
WHEN 'MD' THEN 'Maryland'
WHEN 'UT' THEN 'Utah'
END AS StateName
FROM pubs.dbo.authors
ORDER BY au_lname
執行結果:
au_fname au_lname StateName
-------------------- ---------------------------------------- ----------
Abraham Bennet California
Reginald Blotchet-Halls Oregon
Cheryl Carson California
Michel DeFrance Indiana
Innes del Castillo Michigan
Ann Dull California
…
(4) WHILE…CONTINUE…BREAK語句
WHILE<條件運算式>
BEGIN
<命令列或程式塊>
[BREAK]
[CONTINUE]
[命令列或程式塊]
END
WHILE語句在設定的條件為真時會重複執行命令列或程式塊。CONTINUE語句可以讓程式跳過CONTINUE語句之後的語句,回到WHILE迴圈的第一行。BREAK語句則讓程式完全跳出迴圈,結束WHILE迴圈的執行。WHILE語句也可以嵌套使用。
注意:如果嵌套了兩個或多個WHILE迴圈,內層的BREAK語句將導致退出到下一個外層迴圈。首先運行內層迴圈結束之後的所有語句,然後下一個外層迴圈重新開始執行。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/gloomylilac/archive/2007/12/17/1943386.aspx