我已经在SO和DBI Github上看到许多有关使用DBI::dbWriteTable
(即[1],[2])的问题的帖子。这些主要与使用非默认模式有关。
那不是我的情况。
我有一台运行SQL Server 2014的服务器。该服务器包含多个数据库。
我正在开发一个程序,它可以同时与许多这些数据库进行交互。因此,我使用DBI::dbConnect()
定义了连接,而没有使用Database=
参数。
到目前为止,我只需要在数据库上执行SELECT,并且此连接与dbGetQuery()
一起正常工作。我只需要命名包含数据库名称的表即可:DatabaseFoo.dbo.TableBar
,因为它使事情变得透明且有意,所以这是很好的。这也阻止了我变得懒惰,并且使我忽略了我在连接中命名的任何DB上的数据库名称的调用。
我现在需要将数据添加到表中,但我无法使其正常工作。呼叫
DBI::dbWriteTable(conn, "DatabaseFoo.dbo.TableBar", myData, append = TRUE)
可以工作,但是在DatabaseFoo.dbo.TableBar
数据库中创建了一个名为master
的表,这不是我的意思(我什至不知道有一个master
数据库)。 / p>
DBI::dbWriteTable
手册页指出名称应为
一个字符串,指定未加引号的DBMS表名,或调用
dbQuoteIdentifier()
的结果。
所以我尝试了dbQuoteIdentifier()
(以及其他一些变体):
DBI::dbWriteTable(conn,
DBI::dbQuoteIdentifier(conn,
"DatabaseFoo.dbo.TableBar"),
myData)
# no error, same problem as above
DBI::dbWriteTable(conn,
DBI::dbQuoteIdentifier(conn,
DBI::SQL("DatabaseFoo.dbo.TableBar")),
myData)
# Error: Can't unquote DatabaseFoo.dbo.TableBar
DBI::dbWriteTable(conn,
DBI::SQL("DatabaseFoo.dbo.TableBar"),
myData)
# Error: Can't unquote DatabaseFoo.dbo.TableBar
DBI::dbWriteTable(conn,
DBI::dbQuoteIdentifier(conn,
DBI::Id(catalog = "DatabaseFoo",
schema = "dbo",
table = "TableBar")),
myData)
# Error: Can't unquote "DatabaseFoo"."dbo"."TableBar"
DBI::dbWriteTable(conn,
DBI::Id(catalog = "DatabaseFoo",
schema = "dbo",
table = "TableBar"),
myData)
# Error: Can't unquote "DatabaseFoo"."dbo"."TableBar"
在DBI::Id()
尝试中,我还尝试使用cluster
代替catalog
。没有效果,同样的错误。
但是,如果我更改了dbConnect()
调用以添加一个Database="DatabaseFoo"
参数,我可以简单地使用dbWriteTable(conn, "TableBar", myData)
来实现。
问题就变成了,我做错了什么吗?这是否与其他问题有关?
答案 0 :(得分:2)
这是DBI软件包中的一个缺点。开发人员版本的DBI> = 1.0.0.9002不再受此问题的困扰,它将尽快以DBI 1.1.0的形式进入CRAN。