T SQL 之 控制流語句

2022-02-06 16:06:54 字數 3951 閱讀 9588

控制流語句也稱為流程控制語句,是和高階程式語言中的類似功能一致的,引入控制流語句將使t-sql**有順序執行轉變為按控制執行。

批處理:乙個批處理段是由乙個或者多個語句組成的乙個批處理,之所以叫批處理是因為所有語句一次性被提交到乙個sql例項。

[1] 批處理是分批提交到sql server示例,因此在不同的批處理裡區域性變數不可訪問。

[2] 在不同批處理中,流程控制語句不能跨批處理。

[3] 如果想讓多個語句分多次提交到sql例項,則需要使用go關鍵字。go關鍵字本身並不是乙個sql語句,go關鍵字可以看作是乙個批處理結束的識別符號,當遇到go關鍵字時,當前go之前的語句會作為乙個批處理直接傳到sql例項執行。  

不同的批處理區域性變數不可訪問,例如:

declare

@iint

;set@i=

1;go--

分批了print

@i--

@i在這個批里未定義

輸出:

訊息 137,級別 15,狀態 2,第 1 行

必須宣告標量變數 "@i"。

流程控制語句不能跨批處理,例如:

declare

@iint

;set@i=

1;if(@i=1

)

print('1'

); go--

分批了else

print('

不知道');  --

else找不到if了,控制流語句不跨批,因此報錯。

結果如下:

1

訊息 156,級別 15,狀態 1,第 1 行

關鍵字 'else' 附近有語法錯誤。

1、程式塊語句begin...end

程式塊語句用於將多條t-sql語句封裝起來構成乙個程式塊。sqlserver在處理時,將整個程式塊視為一條t-sql語句執行。

begin

end

常與與while 或 if...else 組合起來使用,可以相互巢狀。

2、判斷語句 if...else

if...else 語句用於條件判斷,系統將根據條件滿足與否來決定如何執行語句,else 子句是可選的。語法:

if

邏輯表示式    

語句塊1

else

語句塊2

語句塊3

if 的形式通常包括 if exists(用於判斷是否存在)和 if not(是否條件不滿足)

3、迴圈語句 while

while 語句用於執行迴圈,可以根據迴圈條件重複執行語句塊。通常使用 break 和 continue 關鍵字在迴圈內部進行控制。語法:

while

《條件表示式》

begin

[break

][continue

]end

break:程式跳出迴圈體,結束while的迴圈。

4、分支判斷語句case

case語句用於執行多條件的分支判斷。語法如下:

case

input_expression

when

when_expression

then

result_expression

[...n][

else else_result_expression

]end

5、無條件退出語句return

return 語句用於使程式從乙個查詢、儲存過程或批量處理中無條件返回,其後面的語句不再執行。如果在儲存過程中使用return語句,那麼此語句可以指定返回給呼叫應用程式、批處理或過程的整數;如果沒有為return指定整數值,那麼該儲存過程將返回0。

儲存過程返回值:

返回值含義

0儲存過程執行成功

-1沒有找到資料庫物件

-2資料型別錯誤

-3程序死鎖錯誤

-4程序死鎖錯誤

-5語法錯誤

-6其他使用者錯誤

-7資源錯誤

-8非致命的內部錯誤

-9達到系統配置引數極限

-10內部一致性致命錯誤

-11內部一致性致命錯誤

-12表或索引崩潰

-13資料庫崩潰

-14硬體錯誤

語法:

return

[整數表示式

]

例項如下:

begin

print(1

);

print(2

);

return

;

print(3); --

在return之後的**不會被執行,因為會跳過當前批處理

endgo

begin

print(4

);end

輸出如下:1 2 4

6、無條件跳轉語句 goto

goto語句可以使程式無條件跳轉到指定的程式執行點,增加了程式設計的靈活性。但破壞了程式的結構化,使程式結構變得複雜而且難以測試。

語法:

goto 語句識別符號

使用說明:

[1] 語句識別符號可以是數字或者字母的組合,但必須以":"結束。而在goto語句後的識別符號不必帶":"。

注意:goto語句和跳轉標籤可以在儲存過程、批處理或語句塊中的任何地方使用,但不能超出批處理的範圍。

示例:

declare

@iint

;set@i=

1;set@i=2

;set@i=

3;set@i=4

;goto

me;set@i=

5;  --

這行被跳過了

set@i

=6;  --

這行被跳過了

set@i

=7;  --

這行被跳過了

me:print('

跳到我了?');

print

@i

結果如下:跳到我了?4

7、延期執行語句 waitfor

waitfor 語句用於掛起語句的執行,直到指定的時間點或者指定的時間間隔。waitfor語句常用語某個特定的時間點或時間間隔自動執行某些任務。在waitfor語句中不能包含開啟游標,定義檢視這樣的操作。在包含事務的語句中不要使用waitfor語句,因為waitfor語句在時間點或時間間隔執行期間將一直擁有物件的鎖,當事務中包含waitfor語句,事務的其他語句又需要訪問被鎖住的資料物件事就容易發生死鎖現象。

[1] 指定時間點的語法

waitfor

示例:對著時間來看真是分毫不差。

waitfor time '

15:49:22

'begin

print

'定時輸出

'end

[2] 指定等待時間間隔的語法

waitfor

interval為時間間隔,指定執行waitfor語句之前需要等待的時間,最多為24小時。

示例:

waitfor delay '

00:00:03

'begin

print

'延遲3秒輸出!';

end

T SQL 控制流語句

go 關鍵字可以對批量處理的sqlserver 進行分批次處理 declare i int set i 1 go 分批了 print i i在這個批里未定義 輸出 訊息 137,級別 15,狀態 2,第 1 行 必須宣告標量變數 i 控制流語句不能跨批執行declare iint set i 1 i...

T SQL流程控制語句

格式 if 布林表示式 begin endelse begin end示例 declare a int set a 3 if a 2 1 print a為奇數 else print a為偶數 格式 case 表示式 when 常量 then 結果表示式 else 結果表示式 end示例 declar...

T SQL(二)自定義函式的控制流語句

自定義函式 內聯錶值函式 返回值為可更新表。函式內包含單個 select 語句且該語句可更新,則返回的表也可以更新。多語句錶值函式 返回值為不可更新表。函式內包含多個 select 語句且該語句可更新,則返回的表不可更新。標量函式 返回值為標量值。自定義函式由乙個或者多個 t sql 語句構成的子程...