如何在没有默认数据库的连接上使用dbWriteTable

时间:2019-09-02 22:27:04

标签: sql r sql-server dbi r-dbi

我已经在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)来实现。

问题就变成了,我做错了什么吗?这是否与其他问题有关?

1 个答案:

答案 0 :(得分:2)

这是DBI软件包中的一个缺点。开发人员版本的DBI> = 1.0.0.9002不再受此问题的困扰,它将尽快以DBI 1.1.0的形式进入CRAN。