Mô tả các lô

Đã hoàn thành

Các lô T-SQL là tập hợp của một hoặc nhiều câu lệnh T-SQL được máy khách gửi đến SQL Server dưới dạng một đơn vị duy nhất. SQL Server hoạt động trên tất cả các câu lệnh trong một lô cùng một lúc khi phân tích cú pháp, tối ưu hóa và thực thi mã.

Nếu bạn là người viết báo cáo thường viết truy vấn bằng cách sử dụng các câu lệnh chứ không phải SELECT thủ tục, điều quan trọng vẫn là phải hiểu ranh giới hàng loạt. Những ranh giới này ảnh hưởng đến công việc của bạn với các biến và tham số trong các thủ tục được lưu trữ và các quy trình khác. Ví dụ, một biến phải được khai báo trong cùng một lô mà nó được tham chiếu. Do đó, điều quan trọng là phải nhận ra những gì được chứa trong một lô.

Các lô được phân cách bởi ứng dụng máy khách. Cách bạn đánh dấu kết thúc lô tùy thuộc vào thiết đặt của máy khách của bạn. Đối với các ứng dụng khách của Microsoft bao gồm SQL Server Management Studio (SSMS) và SQLCMD, từ khóa là GO.

Trong ví dụ này, có hai lô riêng biệt, mỗi lô được kết thúc bằng một GO câu lệnh:

CREATE NEW <view_name>
AS ...
GO
CREATE PROCEDURE <procedure_name>
AS ...
GO

Các batch terminator GO không phải là một T-SQL từ khóa, nhưng là một trong những công nhận bởi SSMS để chỉ ra sự kết thúc của một lô.

Hãy ghi nhớ hai cân nhắc quan trọng khi bạn làm việc với các lô T-SQL:

  • Lô là ranh giới cho phạm vi biến, có nghĩa là một biến được xác định trong một lô chỉ có thể được tham chiếu bởi mã khác trong cùng một lô
  • Một số câu lệnh, thường là các câu lệnh định nghĩa dữ liệu như CREATE VIEW, CREATE FUNCTIONCREATE PROCEDURE không thể kết hợp với các câu lệnh khác trong cùng một lô.

Làm việc với các lô

Lô là một tập hợp các câu lệnh T-SQL được gửi đến SQL Server để phân tích và thực thi. Hiểu cách phân tích cú pháp lô rất hữu ích trong việc xác định thông báo lỗi và hành vi. Khi một lô được gửi bởi một máy khách, chẳng hạn như khi bạn nhấn nút Thực thi trong SSMS, lô được phân tích lỗi cú pháp bằng công cụ SQL Server. Bất kỳ lỗi nào được tìm thấy đều khiến toàn bộ lô hàng bị từ chối; Không có việc thực thi một phần các câu lệnh trong lô.

Nếu lô vượt qua kiểm tra cú pháp thì SQL Server sẽ chạy các bước khác, giải quyết tên đối tượng, kiểm tra quyền và tối ưu hóa mã để thực thi. Sau khi quy trình này hoàn tất và thực thi bắt đầu, các câu lệnh thành công hoặc thất bại riêng lẻ. Đây là độ tương phản quan trọng đối với việc kiểm tra cú pháp. Khi lỗi thời gian chạy xảy ra trên một dòng, dòng tiếp theo vẫn có thể thực thi, trừ khi bạn thêm xử lý lỗi vào mã.

Ví dụ: lô sau đây chứa lỗi cú pháp:

INSERT INTO dbo.t1 VALUE(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO

Nó cung cấp thông báo lỗi này:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'VALUE'.

Lỗi đã xảy ra trong dòng 1, nhưng toàn bộ lô bị từ chối và thực thi không tiếp tục với dòng 2. Ngay cả khi mỗi INSERT câu lệnh bị đảo ngược và lỗi cú pháp xảy ra ở dòng thứ hai, tuyến đầu sẽ không được thực thi vì toàn bộ lô sẽ bị từ chối.

Ngược lại, lô đã sửa này không chứa lỗi:

INSERT INTO dbo.t1 VALUES(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO

Các mẫu trước sử dụng INSERT các câu lệnh thay vì SELECT vì các câu lệnh sửa đổi thường được nhóm thành các lô.