问题描述
当我尝试通过JDBC连接将数据帧导入R中的sql Server时,出现以下错误:
dbWriteTable(dbhandle,"dbo.Testing",My_DF,row.names=FALSE,append = TRUE,temporary = FALSE)
Error in .sql.qescape(names(value),TRUE,[email protected]) :
The JDBC connection doesn't support quoted identifiers,but table/column name contains characters that
must be quoted
dbWriteTable(dbhandle,temporary = FALSE,identifier.quote = "\"")
但是,我得到完全相同的错误消息。 dbWriteTable中是否还有一些我仍然缺少的参数?据我所知,我的数据框的数据类型或结构没有什么奇怪的。
解决方法
从本质上讲,您的主要问题是两个相关的问题:1)使用大小写混合的标识符,Testing
中的dbWriteTable
和2)未在RJDBC的连接对象中设置双引号功能。
根据RJDBC docs,对于标识符引用,连接驱动程序调用{{1}}默认为JDBC()
,并进一步说明了参数:
JDBC(driverClass =“”,classPath =“”,identifier.quote =不适用)
identifier.quote
用于在自动生成的SQL语句中引用标识符的字符;如果
,则不适用 后端不支持带引号的标识符。请参阅下面的详细信息部分。
...因此,RJDBC实现尝试遵守SQL92标准,但并非所有数据库都兼容。 这主要影响必须自动生成SQL代码的功能,例如
NA
。一种主要功能是对带引号的标识符的支持。 SQL92标准使用双引号,但是许多数据库引擎要么不支持双引号,要么使用其他字符。 identifier.quote参数使您可以为所使用的数据库设置正确的引号字符。
具体来说,以下操作失败的原因是在新表名dbWriteTable
(上部)T
(下部)中混合大小写。
esting
这会强制dbWriteTable(dbhandle,"Testing",My_DF,row.names=FALSE,append=TRUE,temporary=FALSE)
运行带有双引号的基础SQL命令,例如带有双引号的create-table命令,以保留名称中的大小写:
dbWriteTable
RJDBC source code显示它检查是否在连接会话中设置了双引号,否则,将引发错误。要解决此问题,请考虑以下两种解决方案:
-
在
CREATE TABLE "Testing" ( ... )
通话中设置identifier.quote
:JDBC()
-
保留所有符合ANSI SQL-1992标准的大写字母(Oracle)或所有小写字母(Postgres)的标识符。
drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver","/path/to/sql/server.jar",identifier.quote = "\"") dbHandle <- dbConnect(drv,"jdbc:sqlserver://...","user","***")
这将允许运行没有双引号的任何查询:
dbWriteTable(dbhandle,"TESTING",temporary=FALSE) dbWriteTable(dbhandle,"testing",temporary=FALSE)
,select * from TeStInG
,等等。
但是,默认情况下,除非您在服务器,数据库或列级别调整了collation,否则SQL Server中的标识符不区分大小写。但是要绕过RDBJC检查并有效运行create-table命令,请考虑在驱动程序步骤中简单设置select * from testing
。