我刚刚意识到,在表名中包含减号"-"的SQL语句执行时不会出错。例如:
SELECT * from MYTAB-10;
SELECT * from MYTAB-9;
也使用adodb对象:
rst.Open "MYTAB-10",conn, adOpenDynamic, adLockOptimistic
而我并没有名为MYTAB-10的桌子,只有MYTAB。我真的很惊讶,因为从来没有听说过表名中有这样的运算符。两个版本中的行数(带-和不带(以及末尾的行数都是相同的,那么这里到底发生了什么呢?到目前为止,我还没有找到任何关于它的信息。这背后有什么道理吗?
Access自动解释-
之前的单词中断
这意味着:
SELECT * from MYTAB-10
相当于以下查询
SELECT * FROM MYTAB -10 -- Space added
SELECT * from [MYTAB] AS [-10] -- Explicit alias to make meaning more clear
这也意味着您可以编写以下
SELECT [-10].SomeField FROM MYTAB-10 INNER JOIN MYTAB-11 ON [-10].SomeField = [-11].AnotherField
如果只提供一个表名,ADO会自动添加SELECT * FROM
,这是等价的。
但是:永远不要使用这个。这种行为还没有标准化,这将使您的代码不可移植,因为其他RDBMS会在代码上出现语法错误
还要注意,当直接打开表而不是使用自动生成的SQL语句时,这在ADO中不起作用:
Set rst = CurrentProject.Connection.Execute("MYTAB-10", Options := adCmdTableDirect)
'Errors: cannot find input table or query MYTAB-10
另请注意:+
角色表现出类似的行为。而、
:
和*
则没有。