2009-10-04 63 views

Trả lời

50

GO không thực sự là lệnh T-SQL. Lệnh GO đã được giới thiệu bởi các công cụ của Microsoft như một cách để tách các câu lệnh lô như kết thúc của một thủ tục được lưu trữ. GO được hỗ trợ bởi các công cụ ngăn xếp Microsoft SQL nhưng không chính thức là một phần của các công cụ khác.

Bạn không thể đặt GO vào một chuỗi SQL và gửi nó như là một phần của đối tượng lệnh ADO.NET vì chính SQL không hiểu thuật ngữ đó. Một cách khác để chứng minh điều này là với profiler: thiết lập một số câu lệnh sử dụng GO trong Query Analyzer/Management Studio và sau đó chạy profiler khi bạn thực hiện. Bạn sẽ thấy chúng được phát hành dưới dạng các lệnh riêng biệt cho máy chủ.

Dấu chấm phẩy được sử dụng để biểu thị sự kết thúc của một tuyên bố, không nhất thiết là toàn bộ lô.

http://msdn.microsoft.com/en-us/library/ms188037.aspx

+0

Tôi đã bắt đầu kết nối để tìm cách trở thành lệnh t-sql hợp lệ: https://connect.microsoft.com/SQLServer/feedback/details/3138257/make-go-a-first-class- ngôn ngữ-từ khóa –

21

dấu chấm phẩy là dấu tách câu lệnh. (Các) câu lệnh trước không nhất thiết phải được thực thi khi gặp phải dấu chấm phẩy.

GO 

Ký kết thúc của một đợt. Thực hiện lô lệnh trước đó, cũng như không gặp phải phần cuối của khối.

GO 2 

Có nghĩa là thực hiện lô nhiều lần. Tôi nghĩ rằng tôi đã sử dụng tùy chọn đó có thể hai lần trong cuộc sống của tôi. Sau đó, một lần nữa, tôi không phải là một DBA bởi thương mại.

0

Tôi nghĩ; ký tự phân tách danh sách các lệnh SQL, GO chỉ hướng dẫn SQL Server cam kết tất cả các lệnh trước đó.

4

'GO' thường được dùng để báo hiệu kết thúc một batch các câu lệnh SQL có nghĩa là bạn có thể có một begin transactionend transaction gói lên thành một bộ sưu tập duy nhất của báo cáo mà có thể thất bại hay thành công với nhau.

';' thường được sử dụng để phân tách nhiều câu lệnh SQL với nhau. Điều này là đáng chú ý trong các kịch bản SQL cần phải trả về nhiều bản ghi, chẳng hạn như `select * từ table1; chọn * từ bảng2; ' điều này sẽ dẫn đến hai tập bản ghi riêng biệt ở phía khách hàng.

27

"GO" tương tự; trong nhiều trường hợp, nhưng thực tế có nghĩa là kết thúc một đợt.

Mỗi đợt cam kết khi "GO" tuyên bố được gọi, vì vậy nếu bạn có:

SELECT * FROM table-that-does-not-exist; 
SELECT * FROM good-table; 

trong bó, thì tốt-bảng chọn sẽ không bao giờ được gọi vì chọn đầu tiên sẽ gây ra một lỗi.

Nếu bạn thay vì có:

SELECT * FROM table-that-does-not-exist 
GO 
SELECT * FROM good-table 
GO 

Các lựa chọn công bố đầu tiên vẫn gây ra một lỗi, nhưng kể từ khi tuyên bố thứ hai là trong hàng loạt của riêng mình, nó vẫn sẽ thực thi.

GO không liên quan gì đến việc thực hiện giao dịch.

1

Lệnh GO có nghĩa là kết thúc một đợt. Do đó tất cả các biến được khai báo trước GO đều không hợp lệ sau lệnh GO. Chống lại dấu chấm phẩy không kết thúc lô.

Nếu bạn sẽ sử dụng lệnh DML trong quy trình, hãy sử dụng dấu chấm phẩy thay vì GO. Ví dụ:

CREATE PROCEDURE SpMyProc 
@myProcParam VARCHAR(20) 
AS 
DECLARE @myOtherParam INT = 5 
;DISABLE TRIGGER ALL ON tMyTable 
UPDATE tMyTable SET myVar = @myProcParam, mySecondVar = @myOtherParam 
;ENABLE TRIGGER OLL ON tMyTable 
2
  1. Dưới SQL Server TSQL (2005 - 2016) nhớ rằng:

    • Dấu chấm phẩy (;) là một khối terminator.
    • GO là người kết thúc.
  2. Bên cạnh đó, GO có thể được sử dụng để gọi cùng một khối DML nhiều lần bằng cách sử dụng cú pháp sau:

GO [đếm]

đâu [đếm] là một số nguyên dương mà cho biết khối TSQL của các lệnh trước GO nói bao nhiêu lần được thực hiện lặp đi lặp lại.

  1. Ngoài ra, không giống như dấu chấm phẩy, GO là bắt buộc trước một DDL mới, chẳng hạn, khi bạn tạo một cái nhìn mới, vì một dấu chấm phẩy tách lệnh trước đó sẽ kích hoạt lỗi. Ví dụ:

thả xem #temporary_view
GO
tạo view #another_view ...
-> NO LỖI

Nếu bạn thay thế GO bằng dấu chấm phẩy trong ví dụ trước, nó sẽ nâng cao thông báo lỗi sau:

'TẠO XEM' phải là câu lệnh đầu tiên trong chuỗi truy vấn.

Các vấn đề liên quan