Có ích gì khi có bộ tách lô?
Sau khi đọc nhiều câu trả lời và đóng góp ý kiến, đây là những gì tôi nghĩ.
Câu hỏi thực sự là "Có ích lợi gì khi có một mẻ?"
Có 2 hàm ý của việc phân lô có một số ý nghĩa và có một cách sử dụng bổ sung go
có thể hữu ích:
1. Tất cả các câu lệnh trong một lô được biên dịch thành một kế hoạch thực thi duy nhất
Điều này ảnh hưởng đến bạn như thế nào, với tư cách là một nhà phát triển SQL, tôi không biết. Nhưng nó đây rồi. Ý nghĩa của điều này là bạn không thể có một số câu lệnh trong cùng một lô . Ví dụ, bạn không thể ALTER
thêm một bảng để thêm một cột, sau select
đó cột đó trong cùng một lô - bởi vì trong khi biên dịch kế hoạch thực thi, cột đó không tồn tại để chọn.
Tôi nghĩ rằng có một đối số mở về việc liệu SQL Server có thể tự phát hiện điều này mà không yêu cầu nhà phát triển đưa các go
câu lệnh vào tập lệnh của họ hay không. Hơn nữa, các tài liệu cho biết kết nối ODBC có thể không bao giờ đưa ra go
lệnh. Tôi không rõ một tập lệnh chạy qua ODBC sẽ hoạt động như thế nào nếu nó bao gồm ALTER
/ SELECT
ví dụ vừa đưa ra.
2. Các biến được khai báo cục bộ chỉ tồn tại trong phạm vi của lô mà chúng được khai báo
Hai điểm này kết hợp kiểu hút. Tôi có một tập lệnh tạo và thay đổi cấu trúc DB (bảng, thủ tục, v.v.) và tôi muốn khai báo các biến ở đầu tập lệnh sẽ được sử dụng để điều chỉnh hành vi của tập lệnh tổng thể. Ngay khi tôi cần kết thúc một lô (ví dụ, một ALTER
câu lệnh - xem điểm 1 của tôi ở trên), các biến "cấu hình" đó nằm ngoài phạm vi và không thể sử dụng thêm trong tập lệnh. Cách giải quyết của tôi là tạo một bảng, duy trì các biến cấu hình trong bảng, sau đó đọc từ bảng đó toàn bộ thông qua tập lệnh của tôi, sau đó thả bảng ở cuối (trong trường hợp bất kỳ ai khác đang phải đối mặt với điều này).
Hàm ý thứ hai này thực sự có thể được sử dụng để tạo lợi thế - nếu tập lệnh của bạn đang thực hiện nhiều công việc và bạn chỉ muốn xóa tất cả các biến cục bộ của mình, bạn có thể chỉ cần bao gồm một GO
câu lệnh và sau đó khai báo các biến mới (tức là và sử dụng lại cùng tên, nếu đó là những gì bạn muốn).
3. GO có một tham số tùy chọn (có tên "count") cho máy chủ lặp lại các hành động hàng loạt nhiều lần
Việc sử dụng này dường như là một chức năng bổ sung tuyệt vời được thêm vào GO
câu lệnh. Tôi tin rằng chức năng ban đầu hoặc chức năng chính của GO
liên quan nhiều hơn đến việc biên dịch một kế hoạch thực thi đơn lẻ, như đã đề cập ở điểm 1 - nếu không thì từ khóa cũng có thể giống như thế REPEAT 10
- nhưng hãy lặp lại điều gì? Lô. Không GO
biểu thị một lô, một lệnh lặp chỉ có thể lặp lại câu lệnh đơn trước đó. Do đó GO
là một cách tốt đẹp để lặp lại hàng loạt .
Tài liệu tham khảo
Tất cả những điều này đến từ việc cố gắng hiểu tài liệu MS về GO . Nhiều câu trả lời khác - ở đây và các câu hỏi khác - chọn từ các phần của tài liệu nhưng tôi nghĩ rằng bản thân tài liệu không thực sự giải thích được tại sao lại có lợi cho việc phân lô ngay từ đầu - do đó, đóng góp của tôi cho một câu hỏi.
Phụ lục
Sau khi viết phần trên, tôi đã tìm thấy Quy tắc sử dụng hàng loạt được Microsoft đề cập trong GO
tài liệu. Trang được liên kết giải thích rằng một kế hoạch thực thi bao gồm nhiều câu lệnh. Nó cũng nói rằng các câu lệnh riêng lẻ có thể được biên dịch lại thành một kế hoạch thực thi mới (tức là bằng SQL Server, trong khi xử lý hàng loạt, tự động). Ví dụ: sau một câu lệnhCREATE TABLE
bạn có thể có một INSERT
trong bảng đó. Câu INSERT
lệnh đó sẽ được biên dịch lại sau khi bảng đã được tạo trong câu lệnh trước.
Điều này thực thi lại ý tưởng rằng SQL Server có thể có thể phát hiện những trường hợp trong đó ALTER
một bảng được theo sau bởi một SELECT
và rằng nó cần phải biên dịch lại SELECT
(xem điểm 1 của tôi ở trên) và có thể đây chính xác là những gì sẽ xảy ra nếu sử dụng ODBC (xem điểm 1 ở trên).
Không có thông tin mới nào thay đổi 3 điểm đã nêu ở trên. Liên kết tôi vừa cung cấp chứa phần đọc bổ sung và kết thúc bằng "các quy tắc", đó là:
Các câu lệnh TẠO DEFAULT, TẠO CHỨC NĂNG, TẠO QUY TRÌNH, TẠO QUY TẮC, TẠO SCHEMA, TẠO TRIGGER và TẠO XEM không thể kết hợp với các câu lệnh khác trong một lô. Câu lệnh CREATE phải bắt đầu lô. Tất cả các câu lệnh khác tiếp theo trong lô đó sẽ được hiểu là một phần của định nghĩa câu lệnh CREATE đầu tiên.
Một bảng không thể được thay đổi và sau đó các cột mới được tham chiếu trong cùng một lô.
Nếu một câu lệnh EXECUTE là câu lệnh đầu tiên trong một lô, thì từ khóa EXECUTE không bắt buộc. Từ khóa EXECUTE là bắt buộc nếu câu lệnh EXECUTE không phải là câu lệnh đầu tiên trong lô.