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

How to use dbWriteTable on a connection with no default Database

我在 SO 和 DBI Github 上看到很多关于使用 DBI::dbWriteTable(即 [1], [2])的问题的帖子。这些主要与使用非默认模式或诸如此类的东西有关。

那不是我的情况。

我有一个服务器 运行 SQL Server 2014。这个服务器包含多个数据库。

我正在开发一个程序,它可以同时与这些数据库中的许多数据库进行交互。因此,我使用没有 Database= 参数的 DBI::dbConnect() 定义了我的连接。

到目前为止,我只需要在数据库上执行 SELECT,这个连接在 dbGetQuery() 上工作得很好。我只需要命名我的 tables,包括数据库名称:DatabaseFoo.dbo.TableBar,这非常好,因为它使事情变得透明和有意。它还阻止我变得懒惰,并阻止我在连接中命名的任何数据库上省略数据库名称。

我现在需要将数据添加到 table,但我无法让它工作。致电

DBI::dbWriteTable(conn, "DatabaseFoo.dbo.TableBar", myData, append = TRUE)

有效,但在 master 数据库中创建了一个名为 DatabaseFoo.dbo.TableBar 的 table,这不是我的意思(我什至不知道有一个 master 数据库).

DBI::dbWriteTable 手册页指出名称应为

A character string specifying the unquoted DBMS table name, or the result of a call to 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) 即可。

所以问题就变成了,我是不是做错了什么?这与其他问题中的问题有关吗?

这是 DBI 包中的一个缺点。开发版本 DBI >= 1.0.0.9002 不再受此问题困扰,很快就会作为 DBI 1.1.0 命中 CRAN。