带“.”的表以其名义

Posted

技术标签:

【中文标题】带“.”的表以其名义【英文标题】:table with "." in its name 【发布时间】:2014-01-06 18:36:57 【问题描述】:

我试图使用 sqlFetch。当我将表的名称更改为具有下划线而不是句点时,提取工作完美。所以如果我使用命令

sqlFetch(conn, "HelloWorld_40")

它工作正常。可惜我的朋友都是用真名的表

sqlFetch(conn, "HelloWorld.40")

然后它崩溃了,它告诉我

Error in sqlColumns(conn, "HelloWorld.40") : 
'HelloWorld.40': table not found on channel

我猜是句号“。”是表的非法名称。但我不希望我的朋友改变它,因为很多人都会受到影响。有没有办法可以调用表格,或者我必须偷偷去他们的数据库,在我使用它时更改名称,然后将其更改回一个句号(冒着我会忘记的风险,有人会读,等等) .

谢谢。

【问题讨论】:

也许尝试转义它\。 没用。但是很好的建议。没试过。 它需要一个双反斜杠 - sqlFetch(conn, "HelloWorld\\.40") 在任何情况下,在名称中包含一个点的表是个坏主意,因为它们实际上在 SQL 中有一个函数 我会检查sqlQuery(conn, "SELECT top 1 * from [HelloWorld.40]")sqlQuery(conn, 'SELECT top 1 * from "HelloWorld.40"') 是否有效。 【参考方案1】:

将表名放在方括号中:

[HelloWorld.40]

【讨论】:

【参考方案2】:

sqlFetch 解析表名的问题。不幸的是它没有处理表引号,所以它在模式HelloWorld 中搜索表40。您需要直接调用sqlQuery(带引号的表名,括号为MS SQL Server):

sqlQuery(dbhandle, "SELECT * FROM [HelloWorld.40]") 

附注:您应该指定您正在使用的数据库。

【讨论】:

【参考方案3】:

最好的分隔符是双引号——这应该适用于大多数底层数据库:

"HelloWorld.40"

mysql 中,您还可以使用反引号 (`):

`HelloWorld.40`

在SQL Server、Access,我认为是Sybase,也可以使用方括号:

[HelloWorld.40]

【讨论】:

以上是关于带“.”的表以其名义的主要内容,如果未能解决你的问题,请参考以下文章

如何查询具有基数的表以显示所有 Pk,同时还显示具有 FK 的表中的匹配元素

如何优化 Netezza 中的表以补充日期条件的联接

创建具有指标功能的表以进行组合

如何过滤我的表以在 Oracle 中显示结果?

DataGrip 是不是可以添加包含外键的行并导航到引用的表以选择它?

使用 SQL,我可以遍历复合键上的表以查找特定数据并计算新值吗?