聊聊 SQL 中的流程控制,你明白了嗎?
流程控制的定義
一般是指用來控制程序執行和流程分至點額命令,一般指的是邏輯計算部分的控制。
流程控制種類
常見的流程控制有以下8種:
BEGIN ... END | WAITFOR | GOTO |
WHILE | IF ... ELSE | BREAK |
RETURN | CONTINUE |
下面給大家具體介紹每種流程控制的用法。
BEGIN...END
BEGIN ... END語句用于將多個T-SQL語句合為一個邏輯塊。當流程控制語句必須執行一個包含兩條或兩條以上的T-SQL語句的語句塊時,使用BEGIN ... END語句。
語法
- BEGIN
- sql_statement...
- END
示例
我們在數據庫中打印出我們公眾號的名稱"SQL數據庫開發"
DECLARE @A VARCHAR(20)
SET @A='SQL數據庫開發'
BEGIN
SELECT @A
END
結果如下:

這里的SELECT @A就是一條被執行的命令語句。
IF [...ELSE]
IF [...ELSE]表示可以只使用IF,也可以IF和ELSE一起使用,表示條件判斷。當滿足某個條件使,就執行IF 下面的語句,否則執行ELSE下面的語句
IF語法
- IF <條件表達式>
- {命令行 | 程序塊}
IF示例
如果某字符串的長度大于5,就打印該字符串
DECLARE @A VARCHAR(20)
SET @A='SQL數據庫開發'
IF LEN(@A)>5
SELECT @A
結果:

這里結果與上面的BEGIN...END一樣,但是如果我們將條件改成大于8,結果可能就不是這樣的了,小伙伴們可以試一下。
IF...ELSE語法
- IF <條件表達式>
- {命令行 | 程序塊}
- ELSE {命令行 | 程序塊}
IF...ELSE示例
如果字符串的長度大于10,就打印該字符串,否則打印"字符串長度太短"
DECLARE @A VARCHAR(20)
SET @A='SQL數據庫開發'
IF LEN(@A)>10
SELECT @A
ELSE
SELECT '字符串長度太短'
結果:

很明顯字符串"SQL數據庫開發"長度不大于10,所以返回ELSE里的結果了。
WHILE
WHILE是循環控制,當滿足WHILE后面的條件后,就可以循環執行WHILE下面的語句。通常與CONTINUE和BREAK一起使用,Break命令讓程序完全跳出循環語句,結束WHILE命令,CONTINUE是讓命令繼續返回執行
語法
- WHILE <條件表達式>
- {命令行 | 程序塊}
- CONTINUE
- {命令行 | 程序塊}
- BREAK
- {命令行 | 程序塊}
示例
有1到10這樣一組數字,從1按順序開始,遇到偶數就跳過,遇到奇數就打印出來,當遇到9就結束打印。
DECLARE @i int;
SET @i = 0;
WHILE(@i < 10)
BEGIN
SET @i = @i + 1;
IF(@i % 2 = 0)
BEGIN
PRINT ('跳過偶數數' + CAST(@i AS varchar));
CONTINUE;
END
ELSE IF (@i = 9)
BEGIN
PRINT ('到' + CAST(@i AS varchar) + '就結束打印');
BREAK;
END
PRINT @i;
END
結果如下:

我們只正常打印出來了1-3-5-7其他的不是跳過就是到9就結束了。
RETURN
RETURN語句用于使程序從一個查詢、存儲過程或批量處理中無條件返回,其后面的語句不再執行。如果在存儲過程中使用return語句,那么此語句可以指定返回給調用應用程序、批處理或過程的整數;如果沒有為RETURN指定整數值,那么該存儲過程將返回0。
語法
RETURN [整數表達式]
示例
BEGIN
PRINT(1);
PRINT(2);
RETURN ;
PRINT(3); --在RETURN之后的代碼不會被執行,因為會跳過當前批處理
PRINT(4);
END
GO
BEGIN
PRINT(5);
END
結果如下:

RETURN后面的3-4都沒打印,說明在當前批處理的RETURN后都沒執行,而新起的BEGIN...END不受上面的RETURN影響,所以打印了5
GOTO
- GOTO命令用來改變程序執行的流程,使程序跳轉到標識符指定的程序行再繼續往下執行。
- GOTO命令雖然增加了程序設計的靈活性,但破壞了程序的結構化,使程序結構變得復雜而且難以測試。
注意:
語句標識符可以是數字或者字母的組合,但必須以":"結束。而在GOTO語句后的標識符不必帶":"。
GOTO語句和跳轉標簽可以在存儲過程、批處理或語句塊中的任何地方使用,但不能超出批處理的范圍。
語法
GOTO 標識符
示例
DECLARE @i INT;
SET @i = 1;
PRINT @i;
SET @i = 2;
PRINT @i;
GOTO ME;
SET @i = 3; --這行被跳過了
PRINT @i;
ME:PRINT('跳到我了?');
PRINT @i
結果如下:

從上面可以看出,當跳到ME的時候,GOTO之前的數有打印,之后的數就跳過了
WAITFOR
用于掛起語句的執行,直到指定的時間點或者指定的時間間隔。
注意:
WAITFOR常用語某個特定的時間點或時間間隔自動執行某些任務。在WAITFOR語句中不能包含打開游標,定義視圖這樣的操作。在包含事務的語句中不要使用WAITFOR語句,因為WAITFOR語句在時間點或時間間隔執行期間將一直擁有對象的鎖,當事務中包含WAITFOR語句,事務的其他語句又需要訪問被鎖住的數據對象事就容易發生死鎖現象。
指定時間點的語法
WAITFOR TIME <具體時間>
示例
在'08:10:00'執行打印字符串"SQL數據庫開發"
WAITFOR TIME '08:10:00'
PRINT 'SQL數據庫開發'
如果你執行這句話,那如果在今天這個點之前,那么等到這個時候它就會打印字符串,如果在今天這個點之后,那你需要等到第二天的這個時間點才會打印。在未執行之前查詢窗口是一直"正在執行查詢..."狀態

指定等待時間間隔的語法
- WAITFOR DELAY 'INTERVAR'
INTERVAR為時間間隔,指定執行WAITFOR 語句之前需要等待的時間,最多為24小時。
示例
WAITFOR DELAY '00:00:03'
PRINT 'SQL數據庫開發'
在等到3秒鐘后,會打印出字符串

總結
流程控制是SQL開發中經常需要使用到的,特別是條件判斷IF...ELSE,循環執行WHILE是經常使用的,對于想在SQL開發中有所提高的同學,務必要掌握這幾個流程控制的用法。



































