带“.”的表以其名义
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 的表中的匹配元素