2010-05-18 33 views
10

Tôi đang đọc qua truy vấn này, và tôi đi theo một đường mà tôi không hiểu heres dòngMarks Exclamation trong một truy vấn SQL

[FETT List]![FETT Search] 
  1. Fett Danh sách là một bảng
  2. Fett Tìm kiếm là một cột trong Danh sách FETT

Ai đó có thể giải thích dấu chấm than nghĩa là gì?

Cảm ơn

+2

Vui lòng thêm các thẻ thích hợp vào câu hỏi của bạn. Tôi đã thêm 'ms-access', bởi vì tôi tin rằng đây là Access, nhưng tôi có thể sai. Hãy chắc chắn rằng nó không sao. –

+0

Không có phiên bản nào cụ thể năm 2007 về câu hỏi này, do đó, thực sự, truy cập ms là một thẻ thích hợp (mặc dù người ta có thể đề cập đến phiên bản 2007 trong câu hỏi). –

Trả lời

8

Thông thường bạn thấy điều này trong mã MS Access (cho dấu chấm than, dấu chấm cho máy chủ SQL). Bạn có thể tham chiếu đến một cột theo table.column hoặc nếu bạn đặt cho bảng một bí danh, sau đó là alias.column. Bạn có thể làm điều này nếu bạn muốn được cụ thể khi sử dụng tham gia, hoặc bạn có thể phải làm điều đó khi hai (hoặc nhiều) bảng trong một truy vấn/tham gia có cùng tên cột trong mỗi bảng.

+1

The! là một cách không chuẩn để chỉ định các trường trong câu lệnh SQL trong Access. Nó được xử lý, nhưng bây giờ tốt, như [Bảng]! [Lĩnh vực] được gán một bí danh on-the-fly trong QBE, trong khi Table.Field sẽ kế thừa tên trường (tức là, không có bí danh). –

0

Tôi nghĩ rằng dấu chấm than chỉ là dấu tách thông thường.

Trong Oracle PL/SQL bạn sử dụng dấu chấm:.

[Fett Danh sách] [Fett Search]

Bất kỳ manh mối khác ?!

+1

Oracle có cho phép một không gian trong tên của một bảng/cột không? Tôi nghĩ rằng trong Oracle nó có lẽ sẽ là 'FETT_List.FETT_Search'. – FrustratedWithFormsDesigner

+0

Có, Oracle cho phép các dấu cách trong bảng hoặc một cột, NHƯNG bạn phải kèm theo toàn bộ chuỗi giữa các dấu ngoặc kép, như trong ví dụ sau: TẠO BÀN TABLE ("cột của tôi" VARCHAR2 (1000)); – UltraCommit

+0

Xin lưu ý khoảng trống giữa từ và từ UltraCommit

16

Vâng, bạn học điều gì đó mới mỗi ngày! Tôi đã có kế hoạch ban đầu để giải thích rằng nếu bạn nói tham chiếu là [Biểu mẫu]! [Danh sách FETT]! [FETT Search], thì sẽ dễ dàng giải thích, như là một tham chiếu đến [Tìm kiếm FETT] kiểm soát trên biểu mẫu [FETT List]. Nhưng nếu không có một bộ sưu tập cha mẹ (hoặc là Báo cáo biểu mẫu), nó không giống như một tham chiếu hợp lệ trong bất kỳ ngữ cảnh nào trong một câu lệnh SQL.

Nhưng sau đó tôi nghĩ rằng để kiểm tra nó, và phát hiện ra (để ngạc nhiên của tôi) rằng câu lệnh SQL này được coi là hợp lệ trong một hình thức truy cập:

SELECT [tblCustomer]![LastName] AS LastName 
    FROM tblCustomer; 

Trong Access, đó là 100% tương đương với SQL này tuyên bố:

SELECT tblCustomer.LastName 
    FROM tblCustomer; 

... vì vậy, tôi không hiểu tại sao mọi người lại viết nó, trừ khi họ quên ngữ cảnh (hoặc không bao giờ hiểu ngữ cảnh). Nó có thể là một trường hợp của aliasing đi sai, nhưng nó không phải là những gì tôi xem xét hình thức tốt.

Bây giờ, câu trả lời dài cho câu hỏi chung của! (bang) so với. (dấu chấm):

Nói chung, trong Access, toán tử bang phân định tập hợp mặc định của một đối tượng và các mục của nó. Toán tử dấu chấm phân định đối tượng và các phương thức, thuộc tính và thành viên của đối tượng.

Đó là dành cho Truy cập và áp dụng cho các đối tượng Access và mô hình đối tượng cho Access.

Nhưng bạn cũng sử dụng SQL trong Access và do đó bạn cũng có TableName.FieldName trong SQL, trong đó toán tử dấu chấm phân tách một mục trong bộ sưu tập mặc định. TableName.FieldName có thể được coi là viết tắt của TableName.Fields ("FieldName"), như bạn tìm thấy với các biểu mẫu! MyForm! MyControl tương đương với Form! MyForm.Controls ("MyControl"). Nhưng quy tắc này không áp dụng trong SQL - TableName.Fields ("FieldName") không phải là SQL hợp lệ, chỉ có TableName.FieldName là.

Vì vậy, bạn phải giữ thẳng mô hình nào đang kiểm soát không gian tên bạn đang làm việc, nghĩa là, đó là không gian tên Access hoặc vùng tên SQL.

Biểu mẫu MyForm cũng tương đương với Forms.Item ("MyForm"), do đó, biểu mẫu siêu dài sẽ là Forms.Items ("MyForm"). Điều khiển ("MyControl"). Lưu ý cách toán tử bang là một lối tắt cho phiên bản biểu mẫu dài hơn với toán tử dấu chấm, do đó toán tử bang được sử dụng khá thường xuyên tùy thuộc vào toán tử dấu chấm. Cũng lưu ý rằng hình thức còn kết thúc lên được sử dụng khi bạn cần phải tham khảo một mục có tên được lưu trữ trong một biến, đó là không thể với các nhà điều hành tiếng vang lớn:

Dim strForm As String 

    strForm = "MyForm" 
    ' This is OK 
    Debug.Print Forms(strForm).Controls.Count 
    ' This is not 
    Debug.Print Forms!strForm.Controls.Count 

Ngoài ra, trong mã VBA, Microsoft đã Những điều được thiết kế để làm xáo trộn sự khác biệt này trong các biểu mẫu và báo cáo, nơi mà nó từng là Me! MyFavoriteControl là hợp pháp như một tham chiếu điều khiển, và Me.MyFavoriteControl sẽ chỉ hợp pháp như một tham chiếu đến một thuộc tính tùy chỉnh (hoặc biến cấp mô-đun, đó sẽ là thành viên của đối tượng). Bạn cũng có thể bỏ tên một chức năng hoặc phụ "MyFavoriteControl" và nó có thể được gọi với toán tử dấu chấm.

Nhưng với sự ra đời của VBA, MS đã giới thiệu các trình bao bọc ẩn được tạo hoàn toàn (và duy trì) xung quanh tất cả các điều khiển để bạn có thể sử dụng toán tử dấu chấm. Điều này có một lợi thế rất lớn, và đó là kiểm tra thời gian biên dịch các tham chiếu điều khiển. Tức là, nếu bạn gõ Me.MyFavoriteControl và không có quyền kiểm soát nào đối với tên đó và không có thành viên nào khác có tên đó trong không gian tên của biểu mẫu/báo cáo, thì bạn sẽ nhận được lỗi biên dịch (thực sự, bạn sẽ thông báo về lỗi ngay khi bạn rời khỏi dòng mã nơi bạn đã thực hiện lỗi). Vì vậy, nếu bạn đã có mã này:

Debug.Print Me.Control1 

... và bạn đổi tên thành Control1 thành MyControl, bạn sẽ gặp lỗi trong lần biên dịch mã tiếp theo.

Điều gì có thể là nhược điểm của việc kiểm tra thời gian biên dịch? Vâng, một số điều:

  1. mã trở nên khó hơn cho lập trình viên để hiểu rõ hơn. Trong quá khứ, Me! Tham chiếu có nghĩa là một mục trong bộ sưu tập mặc định của một biểu mẫu/báo cáo (là một liên minh của các bộ sưu tập Fields và Controls). Nhưng Me.Reference có thể là một điều khiển hoặc một trường hoặc một thuộc tính tùy chỉnh hoặc một biến cấp mô đun công khai hoặc một hàm phụ/chức năng công cộng hoặc, hoặc, hoặc ... Vì vậy, nó hy sinh tính toàn diện mã ngay lập tức.

  2. bạn tùy thuộc vào hành vi ngầm của VBA và quá trình biên dịch của nó. Trong khi điều này thường là một điều OK để làm (đặc biệt nếu bạn chăm sóc tốt mã của bạn), VBA compilation is very complex and subject to corruption. Trong những năm qua, các nhà phát triển có kinh nghiệm đã báo cáo rằng việc sử dụng toán tử dấu chấm làm cho mã trở nên bị tham nhũng hơn, vì nó thêm một lớp mã ẩn khác có thể thoát khỏi đồng bộ với các phần của ứng dụng mà bạn có thể thay đổi một cách rõ ràng.

  3. vì bạn không thể kiểm soát các trình bao bọc nội dung ngầm, khi chúng sai, bạn phải tạo lại đối tượng mô-đun từ đầu (thường là SaveAsText đủ để xóa tham nhũng mà không làm mất bất kỳ thứ gì).

Vì vậy, nhiều nhà phát triển có kinh nghiệm (không bao gồm) không sử dụng toán tử dấu chấm để kiểm soát trên biểu mẫu/báo cáo.

Nó không phải là một sự hy sinh lớn như một số có thể nghĩ rằng nếu bạn sử dụng một tập hợp tiêu chuẩn của quy ước đặt tên.Ví dụ, với các điều khiển bị ràng buộc trên các biểu mẫu, hãy để chúng sử dụng các tên mặc định (tức là tên của trường điều khiển được ràng buộc). Nếu tôi không nói đến sự kiểm soát trong mã, tôi không bao giờ thay đổi tên của nó. Nhưng lần đầu tiên tôi đề cập đến nó trong mã, tôi thay đổi tên của nó để tên điều khiển khác với tên của trường mà nó bị ràng buộc (sự định hướng này là rất quan trọng trong các ngữ cảnh nhất định). Vì vậy, một hộp văn bản được gọi là MyField trở thành txtMyField tại thời điểm tôi quyết định tham chiếu đến nó trong mã. Lần duy nhất tôi từng thay đổi tên trường sau khi viết mã là nếu tôi bằng cách nào đó quyết định rằng trường đã bị đặt tên sai. Trong trường hợp đó, thật dễ dàng để thực hiện Tìm/Thay thế.

Một số người cho rằng họ không thể từ bỏ Intellisense, nhưng không đúng khi bạn hoàn toàn từ bỏ khi bạn sử dụng toán tử bang. Có, bạn từ bỏ Intellisense "thực sự thông minh", tức là phiên bản giới hạn danh sách Intellisense đối với các phương thức/thuộc tính/thành viên của đối tượng đã chọn, nhưng tôi không cần nó - tôi cần Intellisense để lưu các tổ hợp phím , và với Ctrl-SPACEBAR bạn sẽ có được một danh sách đầy đủ Intellisense tự động hoàn thành giống như Intellisense theo ngữ cảnh cụ thể, và sau đó có thể đoản mạch việc gõ.

Khu vực khác của sự nhầm lẫn dấu chấm/bang là với tập DAO trong mã VBA, trong đó bạn sử dụng toán tử dấu chấm cho SQL mà bạn sử dụng để mở recordset và toán tử bang để tham chiếu đến trường trong recordset kết quả:

Dim rs As DAO.Recordset 

    Set rs = CurrentDB.OpenRecordset("SELECT MyTable.MyField FROM MyTable;") 
    rs.MoveFirst 
    Debug.Print rs!MyField 

    rs.Close 
    Set rs = Nothing 

Nếu bạn ghi nhớ không gian tên nào bạn đang làm việc, điều này không quá khó hiểu - dấu chấm được sử dụng trong câu lệnh SQL và đoạn mã trong mã DAO.

Vì vậy, để tóm tắt:

  1. trong SQL, bạn sử dụng toán tử chấm cho các lĩnh vực trong bảng.

  2. trong biểu mẫu và báo cáo, bạn sử dụng toán tử bang cho điều khiển và toán tử dấu chấm cho thuộc tính/phương pháp (mặc dù bạn cũng có thể sử dụng toán tử dấu chấm, nhưng không nhất thiết phải khuyến khích).

  3. trong mã VBA, tham chiếu đến điều khiển trên biểu mẫu và báo cáo có thể sử dụng dấu chấm hoặc chữ số, mặc dù dấu chấm có thể dễ bị tham nhũng mã có thể xảy ra.

  4. trong SQL, bạn có thể thấy toán tử bang được sử dụng, nhưng chỉ khi có tham chiếu đến điều khiển trên biểu mẫu hoặc báo cáo Truy cập, trong biểu mẫu "Form! FormName! ControlName" hoặc "Report! ReportName! ControlName ".

  5. trong mã VBA làm việc với DAO recordsets, bạn có thể thấy cả toán tử dấu chấm và bang, trước đây trong định nghĩa SQL được sử dụng để mở recordset và sau này tham chiếu đến các trường trong recordset kết quả đang mở.

Điều đó có đủ phức tạp cho bạn không?

+1

Đây là câu trả lời dài nhất mà tôi từng thấy trên SO – msarchet

+2

Tôi đã viết lâu hơn thế! –