如何在SQL Server非标准架构表上使用dplyr tbl

时间:2022-03-21 09:50:41

My question is how can I use dplyr functions, such as tbl, on SQL Server tables that do not use the default "dbo" schema?

我的问题是如何在不使用默认“dbo”架构的SQL Server表上使用dplyr函数(如tbl)?

For more context, I am trying to apply the R database example given here to my own tables: https://db.rstudio.com/ (scroll down to the section entitle "Quick Example").

有关更多上下文,我尝试将此处给出的R数据库示例应用于我自己的表:https://db.rstudio.com/(向下滚动到“快速示例”部分)。

It starts out ok. This first section runs fine:

它开始没问题。第一部分运行良好:

install.packages("dplyr")
install.packages("odbc")
install.packages("dbplyr")
install.packages("DBI")

con <- DBI::dbConnect(odbc::odbc(),
                   Driver    = "SQL Server", 
                   Server    = [My Server Name],
                   Database  = "mydatabase",
                   UID       = [My User ID],
                   PWD       = [My Password],
                   Port      = 1433)

I am able to connect to my SQL Server and load in the tables in my database. I know this because

我能够连接到我的SQL Server并加载到我的数据库中的表中。我知道这是因为

DBI::dbListTables(con)

DBI :: dbListTables(CON)

returns the names of my available tables (but without any schema).

返回可用表的名称(但没有任何架构)。

The next line of example code also works when applied to one of my own tables, returning the names of the columns in the table.

当应用于我自己的一个表时,下一行示例代码也可以工作,返回表中列的名称。

DBI::dbListFields(con, "mytable1")

DBI :: dbListFields(con,“mytable1”)

However, once I try to run the next line:

但是,一旦我尝试运行下一行:

dplyr::tbl(con, "mytable1")

dplyr :: tbl(con,“mytable1”)

I get an Invalid object name 'mytable1' error, rather than the expected table preview as in the example.

我得到一个无效的对象名称'mytable1'错误,而不是示例中的预期表预览。

This error does not arise when I run the same code on a different table, mytable2. This time, as expected, I get a preview of mytable2 when I run:

当我在另一个表mytable2上运行相同的代码时,不会出现此错误。正如预期的那样,这次我在运行时获得了mytable2的预览:

dplyr::tbl(con, "mytable2")

dplyr :: tbl(con,“mytable2”)

One difference between mytable1 and mytable2 is the schema. mytable1 uses a made-up "abc" schema i.e. mydatabase.abc.mytable1. mytable2 uses the default "dbo" schema i.e. mydatabase.dbo.mytable2.

mytable1和mytable2之间的一个区别是架构。 mytable1使用一个虚构的“abc”模式,即mydatabase.abc.mytable1。 mytable2使用默认的“dbo”架构,即mydatabase.dbo.mytable2。

I tried dplyr::tbl(con, "abc.mytable1") but I get the same Invalid object name error. Likewise when I tried dplyr::tbl(con, "dbo.mytable2") (although it runs fine when I exclude the dbo part).

我尝试了dplyr :: tbl(con,“abc.mytable1”),但我得到了相同的无效对象名称错误。同样,当我尝试dplyr :: tbl(con,“dbo.mytable2”)时(虽然当我排除dbo部分时运行正常)。

So how can I use dplyr functions, such as tbl, on SQL Server tables that do not use the default "dbo" schema? Thanks.

那么如何在不使用默认“dbo”架构的SQL Server表上使用dplyr函数(如tbl)?谢谢。

1 个解决方案

#1


7  

You can use dbplyr::in_schema.

您可以使用dbplyr :: in_schema。

In your case:

在你的情况下:

dplyr::tbl(con, dbplyr::in_schema("abc", "mytable1"))

#1


7  

You can use dbplyr::in_schema.

您可以使用dbplyr :: in_schema。

In your case:

在你的情况下:

dplyr::tbl(con, dbplyr::in_schema("abc", "mytable1"))