SQL查询中的感叹号

SQL查询中的感叹号,sql,ms-access-2007,Sql,Ms Access 2007,我正在阅读这个问题,我遇到了一行我不明白的行,这是行 [FETT List]![FETT Search] 费特列表是一个表格 FETT搜索是FETT列表中的一列 有人能解释一下感叹号是什么意思吗 谢谢通常您可以在MS Access代码中看到这一点(对于感叹号,SQL server的句号)。可以按table.column引用列,或者如果为表指定别名,则可以按alias.column引用列。如果您想在使用联接时更加具体,您可以这样做,或者当查询/联接中的两个(或多个)表在每个表中具有相同的列名时,

我正在阅读这个问题,我遇到了一行我不明白的行,这是行

[FETT List]![FETT Search]
  • 费特列表是一个表格
  • FETT搜索是FETT列表中的一列
  • 有人能解释一下感叹号是什么意思吗


    谢谢

    通常您可以在MS Access代码中看到这一点(对于感叹号,SQL server的句号)。可以按table.column引用列,或者如果为表指定别名,则可以按alias.column引用列。如果您想在使用联接时更加具体,您可以这样做,或者当查询/联接中的两个(或多个)表在每个表中具有相同的列名时,您可能必须这样做。

    我认为esclamation标记只是一个常规的分隔符

    在Oracle PL/SQL中,使用点:

    [FETT列表][FETT搜索]


    还有其他线索吗

    嗯,你每天都能学到新东西

    我本来打算解释,如果你说参考是[表格]![费特名单]![FETT-Search],那么作为对[FETT-List]表单上[FETT-Search]控件的引用就很容易解释了。但是,如果没有父集合(窗体的报表),它在SQL语句的任何上下文中看起来都不是有效的引用

    但后来我想对它进行测试,发现(令我惊讶的是)这个SQL语句在Access表单中被视为有效:

      SELECT [tblCustomer]![LastName] AS LastName 
      FROM tblCustomer;
    
    在Access中,这100%等同于此SQL语句:

      SELECT tblCustomer.LastName 
      FROM tblCustomer;
    
    …所以我不明白为什么有人会写它,除非他们忘记了上下文(或者一开始就不理解)。这可能是一个混淆错误的例子,但这不是我认为的好形式。

    现在,关于
    这个一般性问题的详细答案(砰)与
    (点):

    通常,在Access中,bang操作符描述对象及其项的默认集合。点运算符描述对象及其方法、属性和成员

    即用于访问,并应用于访问对象和用于访问的对象模型

    但是Access中也使用SQL,因此SQL中也有
    TableName.FieldName
    ,其中点运算符分隔默认集合中的项
    TableName.FieldName
    可以被认为是
    TableName.Fields(“FieldName”)
    的缩写,就像您在
    表单中看到的那样!我的表格!MyControl
    等同于
    表单!控件(“MyControl”)
    。但此规则不适用于SQL--
    TableName.Fields(“FieldName”)不是有效的SQL,只有
    TableName.FieldName
    是有效的SQL

    因此,您必须明确哪个范例控制您正在使用的名称空间,即,它是访问名称空间还是SQL名称空间

    表格!MyForm还相当于
    Forms.Item(“MyForm”)
    ,因此超长表单将是
    Forms.Items(“MyForm”).Controls(“MyControl”)
    。请注意,对于具有点运算符的较长形式版本,bang运算符是一种快捷方式,因此,与点运算符相比,bang运算符更常用。还请注意,当您需要引用名称存储在变量中的项时,会使用较长的形式,而使用bang运算符则不可能:

      Dim strForm As String
    
      strForm = "MyForm"
      ' This is OK
      Debug.Print Forms(strForm).Controls.Count
      ' This is not
      Debug.Print Forms!strForm.Controls.Count
    
    此外,在VBA代码中,微软设计了一些东西来混淆表单和报表中的这种区别,而以前的情况是
    Me!MyFavoriteControl
    作为控件引用是合法的,而
    Me.MyFavoriteControl
    仅作为对自定义属性(或模块级变量,该变量将是对象的成员)的引用才是合法的。您还可以不明智地将函数或子函数命名为“MyFavoriteControl”,并且可以使用点运算符引用它

    但随着VBA的引入,MS在所有控件周围引入了隐式创建(和维护)隐藏属性包装器,以便您可以使用点运算符。这有一个巨大的优势,那就是控件引用的编译时检查。也就是说,如果您键入Me.MyFavoriteControl,并且在表单/报表的命名空间中没有使用该名称的控件,也没有其他任何类型的成员使用该名称,那么您将得到编译时错误(事实上,只要您离开出错的代码行,就会通知您该错误)。因此,如果您有以下代码:

      Debug.Print Me.Control1
    
    。。。如果将Control1重命名为MyControl,则下次编译代码时会出现错误

    编译时检查的缺点是什么?嗯,有几件事:

  • 程序员一看到代码就很难理解。过去,我!引用是指表单/报表的默认集合(字段和控件集合的联合)中的项。但是Me.Reference可以是控件、字段、自定义属性、公共模块级变量或公共子/函数,或者,或者。。。因此,它牺牲了代码的即时可理解性

  • 这取决于VBA的隐式行为及其编译。虽然这通常是一件可以做的事情(特别是如果您很好地维护代码的话)。多年来,经验丰富的开发人员报告说,使用点运算符会使代码更容易损坏,因为它添加了另一层隐藏代码,这些代码可能和您可以显式更改的应用程序部分不同步

  • 由于您无法控制这些隐式属性包装器,当它们出错时,您必须从头开始重新创建带有模块的对象(通常SaveAsText足以清除损坏而不会丢失任何内容)

  • 因此,许多有经验的开发人员(包括我自己)不使用点运算符来控制表单/报表

    如果使用一套标准的命名约定,这并不像有些人认为的那样是一个巨大的牺牲。例如,对于窗体上的绑定控件,允许它们使用默认名称(即控件绑定到的字段的名称)。如果我没有在代码中引用控件,我永远不会更改
      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