如何访问 R 中的嵌套 SQL 表?

Jas*_*ter 1 sql-server odbc r r-dbi dbplyr

从 R Studio 的ODBC 数据库文档中,我可以看到一个如何将 SQL 表读入 R 数据框架的简单示例:

data <- dbReadTable(con, "flights")
Run Code Online (Sandbox Code Playgroud)

BGBUref让我粘贴我正在尝试读取 R 数据框的表格图形(?)。这是来自我在 R studio 中的连接窗格。

嵌套表

如果我使用与上面相同的语法,con我的输出在哪里dbConnect(...) ,我得到以下内容:

df <- dbReadTable(con, "BGBURef")
#> Error: <SQL> 'SELECT * FROM "BGBURef"' nanodbc/nanodbc.cpp:1587: 42S02: 
#> [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name
#> 'BGBURef'.
Run Code Online (Sandbox Code Playgroud)

我对“表”的理解是否不正确?或者我是否需要执行类似的操作才能访问嵌套BGBUref表:

df <- dbReadTable(con, "QnRStore\dbo\BGBURef")
#> Error: '\d' is an unrecognized escape in character string starting ""QnRStore\d"
Run Code Online (Sandbox Code Playgroud)

如果我单击小电子表格图标,数据BGBUref框将出现在 R Studio 中。就我而言,我只是不知道如何将其放入定义的数据框中df


这是我运行这些命令时的输出:

df <- dbReadTable(con, "QnRStore")
#> Error: <SQL> 'SELECT * FROM "QnRStore"'
#> nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC Driver 17 for SQL 
#> Server][SQL Server]Invalid object name 'QnRStore'. 
Run Code Online (Sandbox Code Playgroud)

和:

dbListTables(con)
#>  [1] "spt_fallback_db"                                         
#>  [2] "spt_fallback_dev"                                        
#>  [3] "spt_fallback_usg"                                        
#>  [4] "spt_monitor"                                             
#>  [5] "trace_xe_action_map"                                     
#>  [6] "trace_xe_event_map"                                      
#>  [7] "spt_values"                                              
#>  [8] "CHECK_CONSTRAINTS"                                       
#>  [9] "COLUMN_DOMAIN_USAGE"                                     
#> [10] "COLUMN_PRIVILEGES" 
#> ...
#> [650] "xml_schema_types"                                        
#> [651] "xml_schema_wildcard_namespaces"                          
#> [652] "xml_schema_wildcards"
Run Code Online (Sandbox Code Playgroud)

Par*_*ait 5

一般背景

首先,考虑阅读关系数据库架构,其中表封装在模式中,模式本身封装在数据库中,然后封装在服务器或集群中。请注意图像中的图标对应于对象类型:

cluster/server < catalog/database < schema/namespace < table
Run Code Online (Sandbox Code Playgroud)

因此,您的情况没有嵌套表,而是典型的架构:

myserver < QnRStore < dbo < BGBURef
Run Code Online (Sandbox Code Playgroud)

要在 SQL 查询中从服务器级别访问此体系结构,您将使用句点限定名称:

SELECT * FROM database.schema.table

SELECT * FROM QnRStore.dbo.BGBURef
Run Code Online (Sandbox Code Playgroud)

SQL Server 的默认架构是dbo(与 Postgres 相比,它是public)。通常,像 R 这样的 DB-APIodbc连接到数据库,该数据库允许连接到任何底层模式和相应的表,假设连接的用户有权访问此类模式。请注意,此规则不可普遍适用。例如,Oracle 的模式与所有者一致,而 MySQL 的数据库与模式同义。

请参阅进一步阅读:


具体案例

因此,要连接到默认架构中的 SQL Server 数据库表,只需引用表 ,BGBURef它假定该表驻留在dbo连接数据库的架构中。

df <- dbReadTable(con, "BGBURef")
Run Code Online (Sandbox Code Playgroud)

如果您使用非默认模式,则需要相应地指定它,您最近可以使用它DBI::Id,并且可以类似地将其用于dbReadTableand dbWriteTable

s <- Id(schema = "myschema", table = "mytable")

df <- dbReadTable(con, s)

dbWriteTable(conn, s, mydataframe)
Run Code Online (Sandbox Code Playgroud)

或者,您可以运行所需的时间段限定 SQL 查询:

df <- dbGetQuery(con, "SELECT * FROM [myschema].[mytable]")
Run Code Online (Sandbox Code Playgroud)

您可以用于SQL()写入持久表:

dbWriteTable(con, SQL("myschema.mytable"), mydataframe)
Run Code Online (Sandbox Code Playgroud)