2017-05-11 20 views
7

Tôi có một truy vấn đơn giảnCác câu lệnh SQL được thực thi như thế nào trong SQL Server Management Studio với GO và không có câu lệnh GO?

CREATE TABLE #tempTable (id int) 
DROP TABLE #tempTable 

CREATE TABLE #tempTable (id int) 
DROP TABLE #tempTable 

Từ sự hiểu biết của tôi, trong phần thứ hai, cần tạo ra các #tempTable.

Nhưng nó cho thấy các lỗi sau

Msg 2714, Level 16, State 1, Line 4
Đã có một đối tượng tên là '#tempTable' trong cơ sở dữ liệu.

Tôi đã tìm kiếm nguyên nhân và phát hiện ra rằng đó là vì một tuyên bố GO giữa hai phần của truy vấn. Do đó, câu hỏi đúng là

CREATE TABLE #tempTable (id int) 
DROP TABLE #tempTable 
GO  

CREATE TABLE #tempTable (id int) 
DROP TABLE #tempTable 

Tôi cũng đã phát hiện ra rằng GO chỉ nói với SSMS để gửi câu lệnh SQL giữa mỗi GO theo lô cá nhân theo tuần tự.

Câu hỏi của tôi là, các câu lệnh SQL được thực thi như thế nào? Nó không được thực hiện tuần tự?

Nếu nó thực hiện tuần tự, thì tại sao truy vấn đầu tiên của tôi gây ra lỗi?

+1

'GO' là ** không ** một câu lệnh SQL - đó là một loạt tách ** ** được xác định bởi công cụ Management Studio GUI. –

+0

Cảm ơn thông tin :) –

Trả lời

5

Máy chủ SQL documentation thực hiện công việc khá tốt để giải thích điều này.

Trong trường hợp cụ thể của bạn, vấn đề là lỗi thời gian biên dịch so với lỗi thời gian thực thi.

Tính năng này hoạt động như thế nào? Nếu không có GO tách các tuyên bố, tất cả đều là được biên dịch cùng một lúc. Vấn đề là câu lệnh thứ ba là câu lệnh CREATE TABLE và bảng đã tồn tại. Tất cả những gì đã xảy ra là các câu lệnh được phân tích cú pháp và biên dịch.

Với GO, hai câu lệnh đầu tiên được biên dịch và thực thi. Thì đấy! Không có bảng cho số CREATE trong câu lệnh thứ ba.

+1

Được rồi, nhận điểm :). Tôi đã từng nghĩ rằng, các truy vấn SQL được giải thích. Nhưng tôi tò mò muốn biết, không phải là trình biên dịch hiểu 'DROP TABLE # tempTable'? –

+0

@NoorAShuvo Nó chỉ là trình phân tích cú pháp cho cú pháp như tôi đã nói trong câu trả lời của tôi. Trình biên dịch chỉ cần kiểm tra cú pháp không phải là một logic. –

2

Lý do chính của lỗi này là phân tích cú pháp truy vấn xảy ra trước khi thực hiện truy vấn.

Điều này xảy ra vì toàn bộ mã được thực hiện dưới dạng một lô. Và SQL Server có một nhiệm vụ để phân tích cú pháp và thực thi.

Đó là lý do tại sao lệnh GO (không phải là tuyên bố) cho phép bạn tránh sự cố này. Nó báo hiệu kết thúc của một đợt.

Dưới đây là một chủ đề tốt để đọc về nó: Understanding how SQL Server executes a query

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