2010-05-07 20 views
7

Truy vấn đơn giản này ném lỗi "Tên không rõ ràng tên TaskID" trên một máy chủ db chỉ. Chuyện này thật vớ vẩn. Chúng tôi đã thử nghiệm điều này với cấu trúc cơ sở dữ liệu tương tự trên các máy chủ khác nhau và các phiên bản khác nhau của SQL Server (2005/2008), và nó chỉ là máy chủ của khách hàng cụ thể này mà ném lỗi. Tôi thực sự thất vọng.Lỗi "Tên không rõ ràng" trên một máy chủ cụ thể

SELECT Tasks.TaskID 
FROM Tasks 
INNER JOIN TaskHelpers ON TaskHelpers.TaskID = Tasks.TaskID 
ORDER BY TaskID 

Vâng, tôi biết tôi có thể đặt Tasks.TaskID vào mệnh đề order by, nhưng đối với một số lý do tôi không thể.

+1

tôi chưa bao giờ tìm ra lý do tại sao bạn phải tự xác định một trong một cột tham gia bạn đang đề cập đến. Chắc chắn nếu họ tham gia họ sẽ giống nhau sao !? (có thể là một số công cụ lập chỉ mục lạ mà tôi không hiểu) –

+0

Âm thanh thú vị (+1). Bây giờ, câu hỏi là gì ?? – Unreason

+0

nếu sự cố không tồn tại trên các máy chủ khác, thì có thể bạn nên kiểm tra bản cập nhật sql hoặc một số cài đặt có thể? – Rob

Trả lời

4

Wow. Vấn đề là với chế độ tương thích cơ sở dữ liệu. Nó được đặt thành "80" (sql 2000). Tôi đã đặt nó thành 90 và truy vấn hoạt động tốt ngay bây giờ.

Thông tin thêm về mức độ tương thích có thể được tìm thấy ở đây: http://msdn.microsoft.com/en-US/library/ms178653(SQL.90).aspx

+3

Bạn đã thay đổi mức độ tương thích? Mà không tìm ra lý do tại sao nó được thiết lập theo cách đó? Ý tưởng rất tồi. Bạn có thể phá vỡ rất nhiều thứ. Không bao giờ thay đổi một mức độ compitibilty trừ khi bạn tích cực biết nó có thể được thay đổi. Nếu ai đó làm điều này trên máy chủ của chúng tôi thì họ sẽ bị sa thải. – HLGEM

+0

@HLGEM chào mừng bạn đến với thế giới tư vấn. Chúng tôi đã không thay đổi nó, khách hàng đã làm :( – Alex

0

Bạn có ý nghĩa gì không? Rõ ràng là cả Tasks và TaskHelpers đều có một cột có tên TaskID. Bạn cần phải chỉ ra bảng nào trong cột theo thứ tự được liên kết với.

5

Bạn có thể chỉ định các chỉ số của cột để sắp xếp thay vì:

SELECT Tasks.TaskID 
FROM Tasks 
INNER JOIN TaskHelpers ON TaskHelpers.TaskID = Tasks.TaskID 
order by 1 
+0

Tại sao downvote? Nếu bạn không giải thích những gì bạn nghĩ là sai, nó không thể cải thiện câu trả lời. – Guffa

+0

Vì câu trả lời sai. Không nên có lỗi khi có một cột có tên/bí danh đó trong mệnh đề 'SELECT' và tên đó được tham chiếu trong' ORDER BY'. Xem ** [SQL-Fiddle] (http://sqlfiddle.com/#!3/c16f95/1) ** Lỗi này là do lỗi trong một số phiên bản cũ/mức độ tương thích của SQL-Server, đã được sửa –

+0

@ypercube: Có vẻ như SQL Server thực sự làm điều đó, ít nhất là trong các phiên bản mới hơn. Bạn có bất kỳ tham chiếu đến * tại sao * nó làm điều đó? Tại sao các trường được chọn được sử dụng làm mặc định cho đơn hàng? – Guffa

1

gì nếu bạn thử với định danh? Bằng cách sử dụng các định danh này, SQL server biết cột nào được sắp xếp theo. Tôi chưa bao giờ thực hiện nó theo bất kỳ cách nào khác và không bao giờ có bất kỳ vấn đề gì. Tôi không chính xác lý do tại sao sql cần những số nhận dạng này, rõ ràng là anh ta không biết phải đặt hàng ở đâu khi có các tên cột thiên nhiên. Hãy thử một cái gì đó như;

SELECT t.TaskID 
FROM Tasks t 
INNER JOIN TaskHelpers th ON th.TaskID = t.TaskID 
order by t.TaskID 

EDIT: Và lý do gì bạn không thể? SQL ném một lỗi?

+0

Không. Trên thực tế, người tiền nhiệm của tôi đã xây dựng SQL- mã truy vấn trong nhiều hoạt động nghiệp vụ logic và truy vấn trong câu hỏi là phiên bản VERY đơn giản của truy vấn ... thực sự có các truy vấn con, công đoàn, v.v. – Alex

8

My Momma nói luôn hội đủ điều kiện MỌI cột trong một truy vấn với một tên bảng/bí danh giống như "luôn luôn bao gồm tất cả các tên cột trong Phụ trang" và justs như "không SELECT *", vv

Khác hơn là làm cho nó dễ dàng hơn bởi vì nó là tự tài liệu mã nguồn, bạn ngăn chặn lỗi này nếu bạn đã bao giờ thêm/thay đổi cột.

kiểm tra mức độ tương thích của bạn, có sự khác biệt giữa chúng và cách ORDER BY hoạt động!

Nói chung, ở mức độ tương thích 90 trở lên, mức mặc định cho SQL Server 2008, một ORDER BY không có bảng tên/tuyên bố bí danh tạo lỗi.

phần ALTER DATABASE Compatibility Level (Transact-SQL) see: Sự khác nhau giữa Compatibility Level 80 và Level 90

thiết lập Compatibility cấp 80

KHI ràng buộc tham chiếu cột trong ORDER BY danh sách các cột định nghĩa trong danh sách SELECT, cột không rõ ràng bị bỏ qua và cột tiền tố đôi khi bị bỏ qua. Điều này có thể khiến kết quả được đặt trở lại trong một thứ tự không mong muốn.

Ví dụ, một mệnh đề ORDER BY với một cột single gồm hai phần (.) Được sử dụng như một tham chiếu đến một cột trong một danh sách SELECT được chấp nhận, nhưng bảng bí danh được bỏ qua. Hãy xem xét truy vấn sau đây.

CHỌN c1 = -c1 TỪ t_table AS x ORDER BY x.c1

Khi thực hiện, tiền tố cột là bỏ qua trong ORDER BY. Hoạt động sắp xếp không xảy ra trên cột nguồn được chỉ định (x.c1) là được mong đợi; thay vào đó, nó xuất hiện trên cộtdẫn xuất c1 được xác định trong truy vấn . Kế hoạch thực hiện cho truy vấn này cho thấy rằng các giá trị cho cột bắt nguồn được tính trước tiên và thì các giá trị được tính toán được sắp xếp.

thiết lập Compatibility cấp 90

lỗi được nâng lên trên sự mơ hồ cột. Tiền tố cột, nếu có, được chỉ định trong ORDER BY không bị bỏ qua khi gắn vào cột được xác định trong danh sách SELECT.

Xem xét truy vấn sau.

CHỌN c1 = -c1 TỪ t_table AS x ORDER BY x.c1

Khi thực hiện, tiền tố cột trong mệnh đề ORDER BY không được bỏ qua. Hoạt động sắp xếp xảy ra trên cột được chỉ định (x.c1) như mong đợi. Kế hoạch thực hiện cho truy vấn này cho thấy rằng toán tử sắp xếp yêu cầu các hàng trả về từ t_table và sau đó các giá trị cho cột có nguồn gốc c1 được xác định trong danh sách SELECT được tính toán.

+0

Tôi đang bối rối. Các văn bản từ trang web của Microsoft nói rằng khi cấp độ là 80, sự mơ hồ được bỏ qua, khi mức độ là 90 thì lỗi mơ hồ được nâng lên. Nhưng nó quay lại hoàn toàn ngược lại (kiểm tra các câu trả lời khác). Tôi có đúng không? – natenho

11

Bạn sẽ nhận được lỗi tên cột không rõ ràng nếu bạn chạy truy vấn của mình trên máy chủ sql 2000 hoặc dưới mức tương thích 80 trở xuống. Trên máy chủ sql 2005/2008 với mức độ tương thích 90 hoặc tốt hơn, truy vấn yur chạy tốt.

Từ thứ tự bằng docs khoản:

"Trong SQL Server 2005, tên cột có trình độ và bí danh được giải quyết vào các cột liệt kê trong mệnh đề FROM Nếu order_by_expression là không đủ điều kiện, giá trị phải là duy nhất trong số tất cả các cột. được liệt kê trong câu lệnh SELECT. "

+0

vâng, bạn nói đúng! Ray, chúng tôi đã đăng câu trả lời tương tự trong vòng một phút;) – Alex

+0

những ý tưởng tuyệt vời ... :) – Ray

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