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

问题描述

当我尝试通过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显示它检查是否在连接会话中设置了双引号,否则,将引发错误。要解决此问题,请考虑以下两种解决方案:

  1. CREATE TABLE "Testing" ( ... ) 通话中设置identifier.quote

    JDBC()
  2. 保留所有符合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