SQL查询中表名称中的减号/连字符



我刚刚意识到,在表名中包含减号"-"的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

另请注意:+角色表现出类似的行为。而:*则没有。

最新更新