Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách sử dụng GOTO trong SQL Server

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!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cú pháp không chính xác gần ')' gọi thủ tục được lưu trữ với GETDATE

  2. Các nguyên tắc cơ bản về quản lý tệp dữ liệu trong SQL Server

  3. Chuyển đổi ngày và văn hóa:Sự khác biệt giữa DATE và DATETIME

  4. Tự động xóa các quy trình bị mắc kẹt trong MS SQL Server

  5. Chạy gói SSIS bằng dtexec