繁体   English   中英

JDBC 连接不支持带引号的标识符(dbWriteTable 错误)

[英]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源代码显示它检查是否在连接会话中设置了双引号,如果没有则抛出错误。 要修复考虑任一解决方案:

  1. JDBC()调用中设置identifier.quote

     drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver", "/path/to/sql/server.jar", identifier.quote = "\"") dbHandle <- dbConnect(drv, "jdbc:sqlserver://...", "user", "***")
  2. 将所有符合 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 TeStInGselect * from testing等。

但是,默认情况下,SQL 服务器中的标识符不区分大小写,除非您在服务器、数据库或列级别调整排序规则。 但是要绕过 RDBJC 检查并有效地运行 create-table 命令,请考虑在驱动程序步骤中简单地设置idenitier.quote

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM