SQL SERVER中的流程控制語(yǔ)句
T-SQL中用來(lái)編寫(xiě)流程控制模塊的語(yǔ)句有:BEGIN...AND語(yǔ)句、IF...ELSE語(yǔ)句、CASE語(yǔ)句、WHILE語(yǔ)句、GOTO語(yǔ)句、BREAK語(yǔ)句、WAITFOR語(yǔ)句和RETURN語(yǔ)句。
批處理
一個(gè)批處理段是由一個(gè)或者多個(gè)語(yǔ)句組成的一個(gè)批處理,之所以叫批處理是因?yàn)樗姓Z(yǔ)句一次性被提交到一個(gè)SQL實(shí)例。
- 批處理是分批提交到SQL Server示例,因此在不同的批處理里局部變量不可訪問(wèn)。
- 在不同批處理中,流程控制語(yǔ)句不能跨批處理。
- 如果想讓多個(gè)語(yǔ)句分多次提交到SQL實(shí)例,則需要使用GO關(guān)鍵字。GO關(guān)鍵字本身并不是一個(gè)SQL語(yǔ)句,GO關(guān)鍵字可以看作是一個(gè)批處理結(jié)束的標(biāo)識(shí)符,當(dāng)遇到GO關(guān)鍵字時(shí),當(dāng)前GO之前的語(yǔ)句會(huì)作為一個(gè)批處理直接傳到SQL實(shí)例執(zhí)行。
DECLARE @i int; SET @i = 1; GO --分批了 PRINT @i --@i在這個(gè)批里未定義
1、BEGIN...AND語(yǔ)句
語(yǔ)句塊是多條Transact-SQL語(yǔ)句組成的代碼段,從而可以執(zhí)行一組Transact-SQL語(yǔ)句。經(jīng)常與while或if...else組合起來(lái)使用,可以相互嵌套。
示例:
DECLARE @count INT
SELECT @count = 0
WHILE @count < 10
BEGIN
PRINT 'count = ' + CONVERT(VARCHAR(10), @count)
SELECT @count = @count + 1
END
PRINT 'loop finished, count = ' + CONVERT(VARCHAR(10), @count)2、IF...ELSE語(yǔ)句
IF...ELSE語(yǔ)句用于在執(zhí)行一組代碼之前進(jìn)行條件判斷,根據(jù)判斷的結(jié)果執(zhí)行不同的代碼。IF...ELSE語(yǔ)句語(yǔ)句對(duì)布爾表達(dá)式進(jìn)行判斷,如果布爾表達(dá)式返回為T(mén)RUE,則執(zhí)行IF關(guān)鍵字后面的語(yǔ)句塊;如果布爾表達(dá)式返回FALSE,則執(zhí)行 ELSE關(guān)鍵字后面的語(yǔ)句塊。
語(yǔ)法:
IF Boolean_expression
{ sql_statement | statement_block }
[ ELSE
{ sql_statement | statement_block } ]示例:
DECLARE @score INT
SET @score = 100
IF @score >= 60
PRINT '及格'
ELSE
PRINT '不及格'3、 CASE語(yǔ)句
CASE語(yǔ)句是多條件分支語(yǔ)句,相比IF...ELSE語(yǔ)句,CASE語(yǔ)句進(jìn)行分支流程控制可以使代碼更加清晰,易于理解。CASE語(yǔ)句根據(jù)表達(dá)式邏輯值的真假來(lái)決定執(zhí)行的代碼流程。
語(yǔ)法:
CASE input_expression
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END或
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END示例:
DECLARE @score INT
SET @score = 100
SELECT CASE @score
WHEN 100 THEN '滿分'
WHEN 60 THEN '及格'
END
AS '成績(jī)'或者
DECLARE @score INT
SET @score = 100
SELECT CASE
WHEN @score >= 90 THEN '優(yōu)秀'
WHEN @score >= 80 THEN '良好'
WHEN @score >= 70 THEN '中等'
WHEN @score >= 60 THEN '及格'
ELSE '不及格'
END
AS '成績(jī)'4、 WHILE語(yǔ)句
WHILE語(yǔ)句根據(jù)條件重復(fù)執(zhí)行一條或多條T-SQL代碼,只要條件表達(dá)式為真,就循環(huán)執(zhí)行語(yǔ)句??梢允褂?BREAK 和 CONTINUE 關(guān)鍵字在循環(huán)內(nèi)部控制 WHILE 循環(huán)中語(yǔ)句的執(zhí)行。
語(yǔ)法:
WHILE Boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }參數(shù):
- Boolean_expression:返回 TRUE 或 FALSE 的表達(dá)式。 如果布爾表達(dá)式中含有 SELECT 語(yǔ)句,則必須用括號(hào)將 SELECT 語(yǔ)句括起來(lái)。
- {sql_statement | statement_block}:Transact-SQL 語(yǔ)句或用語(yǔ)句塊定義的語(yǔ)句分組。 若要定義語(yǔ)句塊,請(qǐng)使用控制流關(guān)鍵字 BEGIN 和 END。
- BREAK:導(dǎo)致從最內(nèi)層的 WHILE 循環(huán)中退出。 將執(zhí)行出現(xiàn)在 END 關(guān)鍵字(循環(huán)結(jié)束的標(biāo)記)后面的任何語(yǔ)句。
- CONTINUE:使 WHILE 循環(huán)重新開(kāi)始執(zhí)行,忽略 CONTINUE 關(guān)鍵字后面的任何語(yǔ)句。
DECLARE @i int;
SET @i = 0;
WHILE(@i < 10)
BEGIN
SET @i = @i + 1;
IF(@i % 2 = 0)
BEGIN
PRINT('跳過(guò)2的倍數(shù)' + CAST(@i AS varchar));
CONTINUE;
END
ELSE IF (@i = 7)
BEGIN
PRINT('到' + CAST(@i AS varchar) + '就跳出循環(huán)');
BREAK;
END
PRINT @i;
END5、無(wú)條件退出語(yǔ)句RETURN
RETURN語(yǔ)句用于使程序從一個(gè)查詢、存儲(chǔ)過(guò)程或批量處理中無(wú)條件返回,其后面的語(yǔ)句不再執(zhí)行。如果在存儲(chǔ)過(guò)程中使用return語(yǔ)句,那么此語(yǔ)句可以指定返回給調(diào)用應(yīng)用程序、批處理或過(guò)程的負(fù)整數(shù);如果沒(méi)有為return指定整數(shù)值,那么該存儲(chǔ)過(guò)程將返回0。
BEGIN
PRINT(1);
PRINT(2);
RETURN;
PRINT(3); --在RETURN之后的代碼不會(huì)被執(zhí)行,因?yàn)闀?huì)跳過(guò)當(dāng)前批處理
END
GO
BEGIN
PRINT(4);
END6、無(wú)條件跳轉(zhuǎn)語(yǔ)句GOTO
GOTO語(yǔ)句可以使程序無(wú)條件跳轉(zhuǎn)到指定的程序執(zhí)行點(diǎn),增加了程序設(shè)計(jì)的靈活性。但破壞了程序的結(jié)構(gòu)化,使程序結(jié)構(gòu)變得復(fù)雜而且難以測(cè)試。
使用說(shuō)明:語(yǔ)句標(biāo)識(shí)符可以是數(shù)字或者字母的組合,但必須以":"結(jié)束。而在GOTO語(yǔ)句后的標(biāo)識(shí)符不必帶":"。
注意事項(xiàng):GOTO語(yǔ)句和跳轉(zhuǎn)標(biāo)簽可以在存儲(chǔ)過(guò)程、批處理或語(yǔ)句塊中的任何地方使用,但不能超出批處理的范圍。
DECLARE @i int;
SET @i = 1;
SET @i = 2;
SET @i = 3;
SET @i = 4;
GOTO ME;
SET @i = 5; --這行被跳過(guò)了
SET @i = 6; --這行被跳過(guò)了
SET @i = 7; --這行被跳過(guò)了
ME:PRINT('跳到我了?');
PRINT @i輸出結(jié)果如下:
跳到我了? 4
7、WAITFOR語(yǔ)句
waitfor語(yǔ)句用于掛起語(yǔ)句的執(zhí)行,直到指定的時(shí)間點(diǎn)或者指定的時(shí)間間隔。
語(yǔ)法:
WAITFOR
{
DELAY 'time_to_pass'
| TIME 'time_to_execute'
| [ ( receive_statement ) | ( get_conversation_group_statement ) ]
[ , TIMEOUT timeout ]
}在waitfor語(yǔ)句中不能包含打開(kāi)游標(biāo),定義視圖這樣的操作。在包含事務(wù)的語(yǔ)句中不要使用waitfor語(yǔ)句,因?yàn)閣aitfor語(yǔ)句在時(shí)間點(diǎn)或時(shí)間間隔執(zhí)行期間將一直擁有對(duì)象的鎖,當(dāng)事務(wù)中包含waitfor語(yǔ)句,事務(wù)的其他語(yǔ)句又需要訪問(wèn)被鎖住的數(shù)據(jù)對(duì)象事就容易發(fā)生死鎖現(xiàn)象。
7.1 DELAY參數(shù)
DELAY參數(shù)指定了等待的時(shí)間段。不能指定天數(shù),只能指定小時(shí)數(shù)、分鐘數(shù)和秒數(shù)。允許延遲的最長(zhǎng)時(shí)間為24小時(shí)。
WAITFOR DELAY '01:00'
將運(yùn)行WAITFOR語(yǔ)句前的任何代碼,然后到達(dá)WAITFOR語(yǔ)句,停止1小時(shí),之后繼續(xù)執(zhí)行下一條語(yǔ)句中的代碼。
7.2 TIME參數(shù)
TIME參數(shù)指定到達(dá)指定時(shí)間的等待時(shí)間。
WAITFOR TIME '01:00'
將運(yùn)行WAITFOR語(yǔ)句前的任何代碼,然后到達(dá)WAITFOR語(yǔ)句,直到凌晨1點(diǎn)停止執(zhí)行,之后執(zhí)行WAITFOR語(yǔ)句后的下一條語(yǔ)句。
到此這篇關(guān)于SQLSERVER流程控制語(yǔ)句的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信