2010-06-04 12 views
22

tôi bơ ngón tay một truy vấn trong SQL Server 2000 và thêm một khoảng thời gian ở giữa của tên bảng:Tại sao SQL Server 2000 xử lý kiểm tra SELECT. * Và SELECT t.est. * Giống nhau?

SELECT t.est.* FROM test 

Thay vì:

SELECT test.* FROM test 

Và truy vấn vẫn được thực thi một cách hoàn hảo. Thậm chí SELECT t.e.st.* FROM test thực hiện mà không có vấn đề.

Tôi đã thử cùng truy vấn trong SQL Server 2008 nơi truy vấn không thành công (lỗi: tiền tố cột không khớp với tên bảng hoặc bí danh được sử dụng trong truy vấn). Vì lý do tò mò tinh khiết, tôi đã cố gắng tìm ra cách SQL Server 2000 xử lý các tên bảng theo cách cho phép truy vấn bơ được chạy, nhưng tôi chưa có nhiều may mắn cho đến nay.

Mọi chuyên gia sql đều biết tại sao SQL Server 2000 chạy truy vấn mà không có vấn đề?

Cập nhật: Các truy vấn xuất hiện để làm việc không phụ thuộc vào giao diện sử dụng (ví dụ Enterprise Manager, SSMS, OSQL) và như Jhonny chỉ ra bên dưới nó kỳ lạ thậm chí làm việc khi bạn cố gắng:

SELECT TOP 1000 dbota.ble.* FROM dbo.table 
+0

Nếu Tôi đã phải mạo hiểm một dự đoán là bởi vì SQL có truy vấn của bạn như là một gợi ý. Để đảm bảo rằng các kết quả được trả về theo cách hiệu quả nhất, nó nhìn vào truy vấn của bạn và thay đổi nó để làm cho nó hoạt động tốt hơn. Trong ví dụ của bạn, bí danh là không quan trọng vì nó là một bảng * TỪ ... Mặc dù tôi không có cách nào chứng minh điều này (do đó nhận xét và không trả lời) Bạn có thể thử tham gia để bạn có 2 bảng và thử nghiệm nó như thế không? nếu có cơ hội cho sự mơ hồ, nó có thể bắt đầu quan tâm nhiều hơn. – Shaded

+0

Bạn cũng đã khiến tôi tò mò! Tôi không có một trường hợp SQL Server 2000 để tay tại mo, nhưng am hấp dẫn ... – AdaTheDev

+0

@Shaded, tôi đã nghĩ bạn có thể đã nhấn vào giải pháp nhưng nó xuất hiện rằng nó hoạt động ngay cả khi nhiều bảng có mặt trong truy vấn . Truy vấn này cũng hoạt động mà không có vấn đề: 'SELECT t.est. *, T.est2. * FROM test, test2'. Tôi cũng đã cố gắng bên trong tham gia một vài bảng để đảm bảo và cũng chạy tốt. –

Trả lời

4

Có thể tên bảng được xây dựng từ sự ghép nối ngây thơ của tiền tố và tên cơ sở.

't' + 'est' == 'test' 

Và có thể trong các phiên bản sau này của SQL Server, sự khác biệt đã trở nên phức tạp hơn/nghiêm ngặt hơn.

{ owner = t, table = est } != { table = test } 
+0

Tôi nghi ngờ rằng bạn đã nhấn vào câu trả lời. Nếu chúng tôi có thể tìm thấy bất kỳ tài liệu hỗ trợ MS nào, tôi nghĩ chúng tôi có thể đóng hồ sơ về vấn đề này. –

4

SQL Server Năm 2005 và lên có một "đúng" thực hiện các lược đồ. SQL 2000 và trước đó thì không. Các chi tiết thoát khỏi tôi (đã được nhiều năm kể từ khi tôi sử dụng SQL 2000), tất cả những gì tôi nhớ lại rõ ràng là bạn muốn tạo ra những thứ không thuộc sở hữu của "dbo". Tất cả đều gắn kết với người dùng và quyền sở hữu đối tượng, nhưng mô hình năm 2000 và trước đó khá dễ bị tổn thương. Hy vọng rằng ai đó sẽ đọc trên BOL, thực hiện một số thử nghiệm và đăng kết quả của họ tại đây.

+1

" ... bạn sẽ là hạt ... "rõ ràng chỉ là cá nhân của tôi opninion, như bị che mờ bởi việc đi qua nhiều năm. –

+0

+1. Không có nghi ngờ đó là một ý kiến ​​được tổ chức bởi nhiều người khác, bản thân tôi bao gồm. – NotMe

1

Ở chế độ xem "Bảng mở" của SSMS hoặc qua Enterprise Manager hoặc qua cửa sổ truy vấn SSMS?

There is/was a SQL Server 2005 issue with SSMS để bạn chạy truy vấn ảnh hưởng đến cách hoạt động của truy vấn.

+1

Nó xuất hiện công việc bất kể tôi đang sử dụng giao diện nào. Cho đến nay tôi đã kiểm tra OSQL, Enterprise Manager và SSMS 2008 Query Window. –

3

S-SQL reference manual:

"[dot] Can be used to combine multiple names into a name of the form A.B to refer to a column in a table, or a table in a schema. Note that you calso just use a symbol with a dot in it."

Vì vậy, tôi nghĩ rằng nếu bạn tham chiếu tblTest như tblT.est nó sẽ làm việc OK miễn là có không phải là một cột gọi là 'est' trong tblTest.

Nếu không thể tìm thấy tên cột được tham chiếu bằng dấu chấm, tôi tưởng tượng nó sẽ kiểm tra phần tử gốc của đối tượng.

1

Đây là lỗi.

Nó phải làm với biểu diễn nội bộ của tên cột trong SQL server 2000 leaked out.

Bạn cũng sẽ không thể tạo tablecolumn với tên trùng với bảng + cột nối với cột khác, như, nếu bạn có bảng Người dùng và UserDetail, bạn sẽ không thể có cột DetailAge và Age in các bảng này, tương ứng.

2

Tôi tìm thấy một tài liệu tham khảo để nó là một lỗi

Note: as a result of a comparison algorithm bug in SQL Server 2000, dot symbols themselves have no effect on matching, so "dbo.t" will successfully match with tables "dbot", "d.b.o.t", etc

từ http://blogs.msdn.com/b/ialonso/archive/2007/12/21/msg-1013-the-object-s-and-s-in-the-from-clause-have-the-same-exposed-names-use-correlation-names-to-distinguish-them.aspx

Nó được cố định trong SQL Server 2005. Cùng link> Những thay đổi được giới thiệu trong SQL Server 2005

  1. Dot-related comparison bug has been fixed.