2010-06-25 47 views
5

Các truy vấn sau đây trả về không có kết quả và không có lỗi về SQL Server 2008 (thử nghiệm trên SP1), bạn có thể chạy nó chống lại bất kỳ cơ sở dữ liệu, thậm chí thạc sĩ:Vai trò của dấu ngoặc đơn trong truy vấn SELECT của SQL Server?

WITH computed_table (id) AS 
(
    SELECT id FROM this_table_does_not_exist 
) 
(SELECT * FROM computed_table) 
UNION 
(SELECT * FROM another_table_that_does_not_exists) 

Mở SQL Server 2005, bạn nhận được một lỗi vì bảng không tồn tại. Bạn nhận được cũng nhận được một lỗi nếu bạn loại bỏ một số dấu ngoặc đơn:

WITH computed_table (id) AS 
(
    SELECT id FROM this_table_does_not_exist 
) 
SELECT * FROM computed_table 
UNION 
(SELECT * FROM another_table_that_does_not_exists) 

Cùng một loại vấn đề xuất hiện với bảng thực: trên một số trường hợp, các truy vấn không trả lại kết quả nào, và nếu bạn làm cho một số một số thay đổi nhỏ , giống như loại bỏ một dấu cách hoặc một vận chuyển, nó hoạt động trở lại ...

Tôi nghĩ rằng có thể có vấn đề trong truy vấn, vì SELECT được đính kèm trong dấu ngoặc đơn có thể được hiểu là biểu thức thay vì truy vấn con, trong this page. Nhưng điều đó ít nhất phải trả lại một lỗi.

Tôi có thiếu gì đó không?

Chỉnh sửa 26/06/2010: Tôi đã chạy một số phiên lược tả, với các kết quả sau.

Đối với các truy vấn trên, chuỗi các sự kiện là:

  • Exception (Lỗi: 208, tên đối tượng không hợp lệ)
  • SQL: BatchStarting
  • SQL: StmtStarting
  • SQL: BatchCompleted

Đối với truy vấn không có dấu ngoặc đơn:

  • Exception (Lỗi: 208)
  • SQL: BatchStarting
  • SQL: StmtStarting
  • Exception (Lỗi: 208)
  • Lỗi tài khoản tin nhắn (tên đối tượng không hợp lệ 'this_table_does_not _exist')
  • SQL : BatchCompleted

Đối với một truy vấn làm việc:

  • SQL: BatchStarting
  • SQL: StmtStarting
  • Showplan Tất cả
  • SQL: StmtCompleted
  • SQL: BatchCompleted

tôi cũng chạy một trong các truy vấn với các bảng thực sự mà gây cho tôi cùng vấn đề.Chuỗi các sự kiện là:

  • SQL: BatchStarting
  • SQL: StmtStarting
  • SQL: BatchCompleted

Không sớm "ngoại lệ" => các bảng tồn tại. Không "SQL: StmtCompleted" => có nghĩa là đã xảy ra lỗi, tôi không thể thấy bất kỳ lý do nào khác khiến sự kiện này không được nâng lên. Không "Showplan All" => nó có nghĩa là lỗi xảy ra trước (hoặc khi) kế hoạch thực hiện được tính toán. Nó có thể được gây ra bởi sự kết hợp của cte và dấu ngoặc đơn.

Tôi sẽ nêu vấn đề với sự hỗ trợ của Microsoft vào tuần tới.

+0

bạn đã thử thay đổi tên * thành tên cột thực tế chưa? – DForck42

+1

thật là một câu hỏi tuyệt vời! Đầu tiên, trong năm 2008, bạn cũng gặp lỗi trên câu lệnh thứ hai. Ngoài ra, tôi không thấy rằng tuyên bố UNION có bất cứ điều gì để làm với các hành vi lạ như loại bỏ các công đoàn và lựa chọn thứ hai dường như không thay đổi kết quả. Một điều thú vị - khi sử dụng câu lệnh đầu tiên, và yêu cầu một kế hoạch thực hiện ước tính, tôi hoàn toàn không có kế hoạch nào. Tôi sẽ chạy một dấu vết ngay bây giờ. TTYL. – MaasSql

+0

Bạn cũng sẽ đăng mã được giới thiệu bởi: "Tôi cũng đã chạy một trong các truy vấn với các bảng thực đang khiến tôi gặp vấn đề tương tự." Ngoài ra, trong sự tò mò tinh khiết, bạn có coi đây là một công cụ chặn để phát triển/vấn đề sản xuất không? Nếu có, có vẻ như cách giải quyết sẽ không tuân theo cte, sau đó là mẫu dấu ngoặc đơn. – MaasSql

Trả lời

3

Vì vậy, tôi đã đơn giản hóa sql một chút, theo nhận xét trước đó của tôi về câu hỏi gốc.

WITH computed_tabled AS 
(
    SELECT id FROM this_table_does_not_existd 
) 
(SELECT id FROM computed_tabled) 

Điều này dường như cung cấp cho chúng ta cùng một hành vi. Sau đó, tôi chạy một dấu vết. lớp học tổ chức sự kiện:

  • SQL: hàng loạt Bắt đầu
  • SQL: hàng loạt Hoàn
  • SQL: StmtStarting
  • SQL: StmtCompleted
  • Showplan Tất cả
  • XML Showplan

Những gì tôi bắt được không mong muốn:

  • SQL: BatchStarting
  • SQL: StmtStarting
  • SQL: BatchCompleted

Lưu ý: không có SQL: StmtCompleted, không có kế hoạch. Vì vậy, tiếp theo, tôi quay lại cài đặt chụp và thêm vào mọi Lớp sự kiện duy nhất trong phần Lỗi và cảnh báo. ReRun truy vấn, và những gì bạn biết? Sự kiện bị bắt đầu tiên là:

Error: 208, Severity: 16, State: 1 

Đoán xem 208 là gì? Tuy nhiên, khách hàng không bao giờ thấy lỗi.

Điều tôi nghĩ rằng đang xảy ra là mã trong DBMS đang nói - này, họ không yêu cầu chúng tôi trả lại bất cứ điều gì hoặc làm bất cứ điều gì, vậy tại sao phải bận tâm? Hãy giải phóng một số tài nguyên cho một ai đó đòi hỏi nhiều hơn.

Vì vậy, tôi đã cố gắng đoạn mã này:

--asdfasdf 
(SELECT 1) 

nào hoàn toàn thổi lý thuyết của tôi đi. Dấu ngoặc đơn KHÔNG được hiểu là một biểu thức. Thay vào đó, chúng được hiểu là một truy vấn đầy đủ (tức là, khách hàng yêu cầu trả lại một cái gì đó) và trả lại một bản ghi với 1 cột và 1 hàng. Nhưng không có kế hoạch - có lẽ b/c không có kế hoạch là cần thiết, như không có đối tượng db tham gia.

Vì vậy, để gây rối với tâm trí của tôi một số chi tiết tôi đã cố gắng này:

declare @id as integer; 
; 
WITH computed_table AS 
(
    SELECT id FROM this_table_does_not_exist 
) 
select @id = (SELECT id FROM computed_table) 

nào, giống như loại bỏ các dấu ngoặc đơn, tạo ra một thông báo lỗi tài khoản.

Tôi nói, bạn không thiếu gì cả. Tôi nghĩ rằng đây là một lỗi MS SQL Server. Nó chắc chắn có vẻ liên quan đến cte và dấu ngoặc đơn. Tôi đã thử googling để đề cập đến nó, nhưng không tìm thấy bất cứ điều gì. Điều này sẽ cho tôi một cái gì đó để nói về tại cuộc họp PASS địa phương tiếp theo. Xin lỗi tất cả những gì tôi phải thêm vào tình huống là nhầm lẫn. Nếu tôi học được điều gì đó, tôi sẽ chắc chắn và đăng nó ở đây!


Cập nhật: 2010-06-26 10:09 CST Tôi đã truy cập Microsoft Connect để tìm sự cố này. Tôi không thể tìm thấy thứ gì đó quanh cte 208 hoặc cte invalid object. Thành thật mà nói, tôi không biết một trang danh sách lỗi cho máy chủ sql mà người ta có thể kiểm tra. Tôi cũng đã thử tìm kiếm Hỗ trợ của Microsoft và, một lần nữa, Google.

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