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]
谢谢通常您可以在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