Trong SQL Server, bạn có thể sử dụng GOTO
để thay đổi luồng thực thi. Bạn có thể sử dụng nó để "chuyển" sang một phần khác trong mã T-SQL.
Cách hoạt động của nó là bạn tạo một nhãn, sau đó bạn có thể sử dụng GOTO
để chuyển đến nhãn đó. Bất kỳ mã nào giữa GOTO
và nhãn được bỏ qua và quá trình xử lý tiếp tục ở nhãn.
GOTO
các câu lệnh và nhãn có thể được sử dụng ở bất kỳ đâu trong một thủ tục, lô hoặc khối câu lệnh. Chúng cũng có thể được lồng vào nhau.
Ví dụ 1 - Cách sử dụng cơ bản
Đây là một ví dụ cơ bản để chứng minh.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 PRINT 5 Bookmark: PRINT 6
Kết quả:
1 2 3 6
Ví dụ 2 - Nhãn phải là duy nhất
Mỗi nhãn phải là duy nhất trong lô truy vấn hoặc quy trình được lưu trữ.
Đây là điều sẽ xảy ra nếu bạn cung cấp cùng một nhãn nhiều lần.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 Bookmark: PRINT 5 Bookmark: PRINT 6
Kết quả:
Msg 132, Level 15, State 1, Line 8 The label 'Bookmark' has already been declared. Label names must be unique within a query batch or stored procedure.
Ví dụ 3 - Nhãn không theo lô
Nhãn phải nằm trong cùng một lô với GOTO
. Nó không thể chuyển đến một nhãn bên ngoài lô hiện tại.
Dưới đây là một ví dụ về việc cố gắng chuyển đến một nhãn trong một đợt khác:
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 GO PRINT 5 Bookmark: PRINT 6 GO
Kết quả:
Msg 133, Level 15, State 1, Line 6 A GOTO statement references the label 'Bookmark' but the label has not been declared.
Trong trường hợp này, tôi đã sử dụng GO
lệnh tách mã thành hai lô.
Ví dụ 4 - GOTO Trong câu lệnh IF
Bạn có thể sử dụng GOTO
trong một IF
để nó chuyển đến một đoạn mã nhất định tùy thuộc vào điều kiện là đúng.
Ở đây tôi đặt @color
biến thành Red
và do đó mã sẽ chuyển đến Red_Team
.
DECLARE @color varchar(50) = 'Red'; IF @color = 'Red' GOTO Red_Team IF @color = 'Blue' GOTO Blue_Team ELSE GOTO Other_Team Red_Team: PRINT 'Red Team'; GOTO Finish_Line Blue_Team: PRINT 'Blue Team'; GOTO Finish_Line Other_Team: PRINT 'Other Team'; GOTO Finish_Line Finish_Line: PRINT 'Finished!';
Kết quả:
Red Team Finished!
Đây là những gì sẽ xảy ra nếu tôi đặt @color
thành Blue
:
DECLARE @color varchar(50) = 'Blue'; IF @color = 'Red' GOTO Red_Team IF @color = 'Blue' GOTO Blue_Team ELSE GOTO Other_Team Red_Team: PRINT 'Red Team'; GOTO Finish_Line Blue_Team: PRINT 'Blue Team'; GOTO Finish_Line Other_Team: PRINT 'Other Team'; GOTO Finish_Line Finish_Line: PRINT 'Finished!';
Kết quả:
Blue Team Finished!
Và để hoàn thiện, đây là điều sẽ xảy ra nếu tôi cung cấp một màu khác:
DECLARE @color varchar(50) = 'Orange'; IF @color = 'Red' GOTO Red_Team IF @color = 'Blue' GOTO Blue_Team ELSE GOTO Other_Team Red_Team: PRINT 'Red Team'; GOTO Finish_Line Blue_Team: PRINT 'Blue Team'; GOTO Finish_Line Other_Team: PRINT 'Other Team'; GOTO Finish_Line Finish_Line: PRINT 'Finished!';
Kết quả:
Other Team Finished!
Rõ ràng đây là những ví dụ rất đơn giản, nhưng chúng thể hiện khái niệm cơ bản về GOTO
.
Ví dụ 5 - Vị trí nhãn
GOTO
phân nhánh có thể đi đến một nhãn được xác định trước hoặc sau GOTO
.
Dưới đây là ví dụ về việc chuyển đến một nhãn trước GOTO
:
DECLARE @Counter int = 0; Loop: SET @Counter = @Counter + 1 IF @Counter < 10 PRINT @Counter ELSE GOTO Finish_Line GOTO Loop Finish_Line: PRINT 'Finished!'
Kết quả:
1 2 3 4 5 6 7 8 9 Finished!
Bạn cần phải cẩn thận để không bắt đầu một vòng lặp vô hạn khi đặt nhãn trước GOTO
Tuy nhiên.
Ngoài ra, ví dụ này chỉ dành cho mục đích trình diễn. Bạn có thể nhận được kết quả tương tự bằng cách sử dụng WHILE
vòng lặp:
DECLARE @Counter int = 1; WHILE @Counter < 10 BEGIN PRINT @Counter SET @Counter = @Counter + 1 END PRINT 'Finished!'
Kết quả:
1 2 3 4 5 6 7 8 9 Finished!