Trong SQL Server, khi nào bạn nên sử dụng GO và khi nào bạn nên sử dụng dấu chấm phẩy ;?


100

Tôi luôn bối rối với việc khi nào tôi nên sử dụng từ khóa GO sau các lệnh và liệu dấu chấm phẩy có bắt buộc ở cuối các lệnh hay không. Sự khác biệt là gì và tại sao / khi nào tôi nên sử dụng chúng?

Khi tôi chạy Generate-script trong SQL Server Management Studio, nó dường như sử dụng GO ở khắp nơi, nhưng không sử dụng dấu chấm phẩy.


Câu trả lời:


93

GOchỉ liên quan đến SSMS - nó không phải là Transact SQL thực tế, nó chỉ yêu cầu SSMS gửi các câu lệnh SQL giữa mỗi GOtrong các lô riêng lẻ một cách tuần tự.

Đây ;là một dấu phân cách câu lệnh SQL, nhưng phần lớn công cụ có thể giải thích nơi các câu lệnh của bạn được chia nhỏ.

Ngoại lệ chính và vị trí ;được sử dụng thường xuyên nhất là trước Câu lệnh Biểu thức Bảng Chung.


5
Nhấn mạnh vào GOkhông phải là T-SQL Phần còn ;
msarchet

2
Một MERGEcâu lệnh phải được kết thúc bằng dấu chấm phẩy.
ngày

15
Cập nhật: trong SQL Server 2012 KHÔNG sử dụng dấu chấm phẩy không được dùng nữa, có nghĩa là chúng sẽ được yêu cầu trong phiên bản tiếp theo. Vì vậy, bạn nên sử dụng dấu chấm phẩy vì nó sẽ yêu cầu ít thao tác hơn trong trường hợp di chuyển (và vì nó là một tiêu chuẩn). Nguồn: technet.microsoft.com/en-us/library/ms143729.aspx hoặc sách về SQL Server 2012: shop.oreilly.com/product/0790145321978.do
Paweł Bulwan

1
SQL 2014 vẫn liệt kê dấu chấm phẩy theo yêu cầu cho phiên bản tiếp theo. Tôi tự hỏi khi nào nó sẽ không còn được dùng nữa. technet.microsoft.com/en-us/library/ms143729.aspx
Frank

2
+ buli không nói rằng ;không được chấp nhận, KHÔNG sử dụng nó là không được chấp nhận, tức là nó sẽ trở thành bắt buộc theo nguồn.
cjk

78

Lý do tại sao bạn thấy rất nhiều GO trong các tập lệnh DDL được tạo là do quy tắc sau về 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 TRIGGER và CREATE VIEW không thể được 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ủa câu lệnh CREATE đầu tiên.

Một trong những trường hợp sử dụng cho Generated DDL là tạo nhiều đối tượng trong một tệp duy nhất. Vì điều này, một trình tạo DDL phải có khả năng tạo ra các lô. Như những người khác đã nói, tuyên bố GO kết thúc đợt.


10
Đây là người duy nhất thực sự trả lời câu hỏi "... khi nào bạn nên sử dụng GO ...?" một phần của câu hỏi.
Roimer

Đối với tôi, dường như GO chấm dứt các câu lệnh tạo đối tượng chứa SQL có thể chứa; trình kết thúc câu lệnh. Trong một DBMS khác, tôi đã thấy khả năng thiết lập chuỗi kết thúc. Ví dụ: bạn có thể chỉ định rằng các câu lệnh kết thúc bằng hai ký tự ống dẫn ||. Sau đó, bạn có thể đưa ra QUY TRÌNH TẠO ... nhiều SQL kết thúc bằng; ... || và dấu ngoặc kép kết thúc câu lệnh CREATE PROCEDURE. Vì vậy, câu hỏi của tôi là liệu điều này có liên quan đến tuyên bố MS GO không? Thứ hai, bạn có thể xác định lại chuỗi kết thúc trong SQLSERVER không?
youcantryreachingme

@youcantryreachingme Tôi không biết điều này có đúng vào năm 2010 hay không nhưng có vẻ như bạn có thể. Xem SSMS: Batch Separator . Tôi không chắc giới hạn của điều này là gì
Conrad Frix,

34

ĐI

Go là một bộ tách đợt. Điều này có nghĩa là mọi thứ trong lô đó là cục bộ cho lô cụ thể đó.

Bất kỳ khai báo nào về Biến, Biến bảng, v.v. không đi qua GO câu lệnh.

Các bảng #Temp là cục bộ của một kết nối, vì vậy chúng trải dài trên các câu lệnh GO.

Dấu chấm phẩy

Dấu chấm phẩy là một dấu chấm dứt câu lệnh. Điều này hoàn toàn được sử dụng để xác định rằng một tuyên bố cụ thể đã kết thúc.

Trong hầu hết các trường hợp, bản thân cú pháp câu lệnh đã đủ để xác định phần cuối của một câu lệnh.

Tuy nhiên, CTE yêu cầu rằng WITH là câu lệnh đầu tiên, vì vậy bạn cần có dấu chấm phẩy trước WITH.


4
Một MERGEcâu lệnh phải được kết thúc bằng dấu chấm phẩy.
ngày

11

Bạn nên sử dụng dấu chấm phẩy để kết thúc mọi câu lệnh SQL. Điều này được định nghĩa trong Tiêu chuẩn SQL,

Chắc chắn, thường xuyên hơn không SQL Server cho phép bạn bỏ qua dấu chấm dứt câu lệnh nhưng tại sao lại có thói quen xấu?

Như những người khác đã chỉ ra, câu lệnh đứng trước một biểu thức bảng chung (CTE) phải được kết thúc bằng dấu chấm phẩy. Do dân gian chưa hiểu hết về thuốc diệt mối bằng dấu chấm phẩy, chúng ta thấy như sau:

;WITH ...

mà tôi nghĩ trông thực sự kỳ quặc. Tôi cho rằng nó có ý nghĩa trong một diễn đàn trực tuyến khi bạn không thể nói chất lượng của mã mà nó sẽ được dán vào.

Ngoài ra, một MERGEcâu lệnh phải được kết thúc bằng dấu chấm phẩy. Bạn có thấy một mô hình ở đây? Đây là một số bổ sung mới hơn cho TSQL tuân theo các Tiêu chuẩn SQL. Có vẻ như nhóm SQL Server đang bắt đầu ủy thác việc sử dụng dấu chấm phẩy.


2
" mà tôi nghĩ trông thực sự kỳ quặc " - Tôi không thể đồng ý hơn. Và sự lặp lại liên tục dẫn này cho những câu hỏi kỳ lạ như này hay này
a_horse_with_no_name

SQL Server không cho phép bạn cẩu thả - nó cho phép bạn bỏ qua một dấu chấm dứt câu lệnh thừa; T-SQL, giống như hầu hết các SQL khác, không phải là SQL chuẩn thuần túy, nó giống như một lớp cơ sở trừu tượng hơn - không được sử dụng trong thực tế vì phương ngữ riêng của công cụ DB.
ProfK

@ProfK: cảm ơn bạn đã thêm dấu câu vào nhận xét của mình, giúp tôi dễ đọc và hiểu, đặc biệt là các ký tự dấu chấm câu. Mặc dù, việc bạn sử dụng dấu gạch nối không phù hợp với tiêu chuẩn tiếng Anh ...
onedaywhen

8

GO là một kết thúc hàng loạt, dấu chấm phẩy là một kết thúc câu lệnh.

bạn sẽ sử dụng GO khi bạn muốn có nhiều câu lệnh tạo proc trong 1 tập lệnh vì tạo proc phải là câu lệnh đầu tiên trong một lô. Nếu bạn sử dụng các biểu thức bảng thông thường thì câu lệnh trước nó cần được kết thúc bằng dấu chấm phẩy


Một MERGEcâu lệnh phải được kết thúc bằng dấu chấm phẩy.
ngày
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.