[英]JDBC connection doesn't support quoted identifier (dbWriteTable error)
当我尝试通过 JDBC 连接将数据帧导入 R 中的 SQL 服务器时,出现以下错误:
dbWriteTable(dbhandle, "dbo.Testing", My_DF, row.names=FALSE, append = TRUE, temporary = FALSE)
Error in .sql.qescape(names(value), TRUE, conn@identifier.quote) :
The JDBC connection doesn't support quoted identifiers, but table/column name contains characters that
must be quoted
我在网上搜索并通过指定引号找到了建议的解决方案,即
dbWriteTable(dbhandle, "dbo.Testing", My_DF, row.names=FALSE, append = TRUE, temporary = FALSE, identifier.quote = "\"")
但是,我得到完全相同的错误消息。 dbWriteTable 中是否有一些我仍然缺少的论点? 据我所知,我的数据框的数据类型或结构没有什么奇怪的。
本质上,您的主要问题是两个相关的事情:1)使用混合大小写标识符,在dbWriteTable
中进行Testing
和 2)未在 RJDBC 的连接 object 中设置双引号功能。
根据RJDBC docs ,连接驱动程序调用JDBC()
默认为NA
用于标识符引号,并进一步解释了参数:
JDBC (driverClass = "", classPath = "", identifier.quote = NA)
标识符.quote
用于在自动生成的 SQL 语句中引用标识符的字符或 NA 如果
后端不支持带引号的标识符。 请参阅下面的详细信息部分。
...因此,RJDBC 实现尝试遵守 SQL92 标准,但并非所有数据库都兼容。 这主要影响
dbWriteTable
等必须自动生成 SQL 代码的函数。 一项主要功能是支持带引号的标识符。 SQL92 标准使用双引号,但许多数据库引擎要么不支持它,要么使用其他字符。 identifier.quote 参数允许您为使用的数据库设置正确的引号字符。
具体来说,以下失败的原因是在您的新表名T
(上) esting
(下)中混合了大小写。
dbWriteTable(dbhandle, "Testing", My_DF, row.names=FALSE, append=TRUE, temporary=FALSE)
这会强制dbWriteTable
运行带有双引号的底层 SQL 命令,例如带有双引号的 create-table 命令,以便在名称中保留大小写:
CREATE TABLE "Testing" (
...
)
RJDBC源代码显示它检查是否在连接会话中设置了双引号,如果没有则抛出错误。 要修复考虑任一解决方案:
在JDBC()
调用中设置identifier.quote
:
drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver", "/path/to/sql/server.jar", identifier.quote = "\"") dbHandle <- dbConnect(drv, "jdbc:sqlserver://...", "user", "***")
将所有符合 ANSI SQL-1992 标准的标识符全部大写 (Oracle) 或全部小写 (Postgres)。
dbWriteTable(dbhandle, "TESTING", My_DF, row.names=FALSE, append=TRUE, temporary=FALSE) dbWriteTable(dbhandle, "testing", My_DF, row.names=FALSE, append=TRUE, temporary=FALSE)
这将允许在没有双引号的情况下运行任何查询: select * from TeStInG
, select * from testing
等。
但是,默认情况下,SQL 服务器中的标识符不区分大小写,除非您在服务器、数据库或列级别调整排序规则。 但是要绕过 RDBJC 检查并有效地运行 create-table 命令,请考虑在驱动程序步骤中简单地设置idenitier.quote
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.