2012-05-10 19 views
11

Trong khi tôi đang viết một số truy vấn T-SQL với NOEXEC ON, tôi có kinh nghiệm hành vi thú vị của SQL Server và tôi tò mò về lý do tại sao nó xảy ra. Đôi khi tôi chỉ nhận đượchành vi Thú vị trong "noexec ON"

Lệnh thành công.

nhắn như tôi mong đợi, nhưng đôi khi tôi nhận được một hoặc nhiều

(0 row (s) bị ảnh hưởng)

tin nhắn.

Tôi biết rằng SET NOEXEC ON lệnh biên dịch truy vấn nhưng không thực hiện nó, vì vậy tôi nghĩ tôi không nên nhận (hàng 0 (s) bị ảnh hưởng) bất kỳ

tin nhắn.

Trong ví dụ đầu tiên, mọi thứ có vẻ bình thường.

SET NOEXEC ON 
INSERT INTO Test (column1) VALUES ('etc') 

Kết quả:

Command (s) thành công.

Nhưng trong ví dụ thứ hai, tôi nghĩ có gì đó không ổn ...

SET NOEXEC ON 
DELETE FROM Test 

Kết quả:

(0 row (s) bị ảnh hưởng)

Trong ví dụ thứ ba tôi đã sử dụng bảng temp:

CREATE TABLE #tmp (id INT IDENTITY(1, 1), idX INT) 

SET NOEXEC ON 
INSERT INTO #tmp (idX) VALUES (1) 
DELETE FROM Test 

SET NOEXEC OFF 
DROP TABLE #tmp 

Kết quả:

(0 row (s) bị ảnh hưởng)

Và cuối cùng tôi chỉ GO thêm vào truy vấn của tôi, tôi nghĩ rằng kết quả là thú vị

CREATE TABLE #tmp (id INT IDENTITY(1, 1), idX INT) 
SET NOEXEC ON 
GO 

INSERT INTO #tmp (idX) VALUES (1) 
DELETE FROM Test 

SET NOEXEC OFF 
DROP TABLE #tmp 

Kết quả:

(0 hàng (s) bị ảnh hưởng)

(0 hàng bị ảnh hưởng)

+0

Hm Tôi không thể repro bất kỳ trường hợp mà tôi nhận được "(0 hàng (s) bị ảnh hưởng)". Không phải trong Denali cũng không phải trong SQL Server 2008. Bạn chỉ cần thực hiện các văn bản SQL bằng cách sử dụng SSMS mà không có bất kỳ tùy chọn đặc biệt hoặc hành động? – usr

+0

Có, tôi đã thực hiện các văn bản SQL này bằng SSMS trên SQL Server 2008 R2 và tôi không sử dụng bất kỳ tùy chọn đặc biệt nào. – ogun

Trả lời

2

Mặc dù điều này có thể không phải là câu trả lời cho câu hỏi của bạn:

Nhưng khi bạn xóa

SET NOEXEC ON 
DELETE FROM Test 

Nếu bạn thêm một nơi mà điều kiện để các DELETE BÁO CÁO như DELETE FROM Test WHERE COLUMN1='etc'

Bạn sẽ nhận được các kết quả mong muốn ... Hành vi này có thể là do các câu lệnh DDL và DML mà chúng ta đã thực hiện.

Tôi cũng đã phân tích tình huống thứ ba nếu bạn chèn vào bảng tạm thời nó cung cấp cho bạn (0 hàng bị ảnh hưởng) nhưng nếu cùng một chèn trên một số cơ sở dữ liệu hoặc bảng vĩnh viễn được thực hiện nó cho (Command (s) hoàn tất thành công .)

Đây có thể là do bảng tạm thời và bảng vĩnh viễn.

Đối với một thứ 4 bạn đã thêm một GO:

GO sẽ thực thi các lệnh sql liên quan n lần.

Vì vậy, nếu bạn thực hiện riêng câu lệnh chèn và lệnh xóa cả hai đều có giá trị trả về và GO sẽ thêm chúng vào gói hàng loạt.

1

Tôi tái tạo hành vi trên SQl Server 2005 và 2008 để nó không độc quyền với R2 và điều tương tự xảy ra với lần chèn, xảy ra với bản cập nhật, vì vậy, xóa có vẻ là ngoại lệ.Tôi cũng nghĩ rằng nó có thể là một điều SQL Server Management Studio nhưng không, tôi đã thử nghiệm trên một công cụ khác và thậm chí chạy nó trên SQLCMD và có thể thấy hành vi tương tự. :

enter image description here

Trừ rằng "Command (s) thành công." tin nhắn không xuất hiện (điều này phải là độc quyền của SSMS)

Dù sao, tôi không thể giải thích, nhưng tôi có thể đoán. Tôi tưởng tượng điều đó xảy ra bởi vì câu lệnh xóa thực hiện điều gì đó khác (hoặc ít hơn) mà Chèn và Cập nhật thì không. Quá trình biên dịch được chia thành bốn phần: phân tích cú pháp, chuẩn hóa, biên dịch và tối ưu hóa. Tôi cho rằng một cái gì đó bên trong các bước này được thực hiện khác nhau bởi các tuyên bố xóa, đó là lý do tại sao chúng tôi nhận được một kết quả khác nhau

+0

Cảm ơn bạn đã quan tâm. Tôi không nghĩ rằng chúng tôi sẽ tìm thấy câu trả lời trừ khi nhìn vào mã máy chủ sql ... – ogun

+0

yeah Tôi nghĩ rằng đó là ra khỏi câu hỏi :) Tôi tự hỏi nếu có ai có thể gửi này như là một "lỗi"? hoặc ít nhất là ở đâu đó để giải thích – Diego

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