使用 ODBC 包将数据从 SQL Server 保存或读取到 R

Posted

技术标签:

【中文标题】使用 ODBC 包将数据从 SQL Server 保存或读取到 R【英文标题】:Save or Read data from SQL Server in to R using ODBC package 【发布时间】:2021-03-08 21:34:31 【问题描述】:

如果我想将 R 连接到数据库,是否还需要为 R 用户安装驱动程序?

我已成功连接服务器,但无法读取/写入/获取表格。

library(odbc)
con <- dbConnect(odbc::odbc(), 
         .connection_string = 'driver=SQL Server;server=DW01;database=AF_DW;trusted_connection=true')

现在我可以在 RStudio 连接中看到 AF_DW。

dbListFields(con, "Visits")

我可以看到“访问”表中的所有变量

data <- dbReadTable(con, "Visits")

出现错误:nanodbc/nanodbc.cpp:1655: 42000: [Microsoft][ODBC SQL Server Driver][SQL Server]无效的对象名称“访问”。 [Microsoft][ODBC SQL Server Driver][SQL Server]无法准备语句。 'SELECT * FROM "访问")

data3 <- dbGetQuery(con, "SELECT * FROM Visits")

遇到同样的错误

data4 <- dbSendQuery(con, "SELECT * FROM Visits")

遇到同样的错误

con_in_R <- dbFetch(dbSendQuery(con,"SELECT * FROM Visits"))

(函数 (cond) 中的错误:在为函数“dbFetch”选择方法时评估参数“res”时出错:nanodbc/nanodbc.cpp:1655:42000:[Microsoft][ODBC SQL Server Driver][SQL服务器]无效的对象名称“访问”。[Microsoft][ODBC SQL Server Driver][SQL Server]无法准备语句。“SELECT * FROM Visits”

感谢您的帮助。谢谢。

【问题讨论】:

【参考方案1】:

根据您的图像,Visits 不像所有查询所假定的那样存储在默认的 dbo 架构中,而是存储在 eCW 架构下。

与大多数 RDBMS 一样,SQL Server 遵循对象(表、存储过程、函数)的三部分命名约定:[database].[schema].[object] 数据库特定连接不需要数据库,dbo 默认不需要架构。

因此,您需要在尝试的查询中引用架构和表名。

s <- Id(schema = "eCW", table = "Visits")

# READ FROM NON-DEFAULT SCHEMA TABLE
data3 <- dbReadTable(con, s) 
data3 <- dbGetQuery(con, "SELECT * FROM [eCW].[Visits]")

# WRITE TO NON-DEFAULT SCHEMA TABLE
dbWriteTable(conn, s, mydataframe)
dbWriteTable(con, SQL("eCW.Visits"), mydataframe)

【讨论】:

我认为您已正确阅读@Parfait。 AF_DW 是一个数据库(目录),在 AF_DW 内部:DW、eCW、WG 是模式。 Visits 是 eCW 内的一张表。 嗯...看起来这是 R 中的一个已知问题:R DBI ODBC error: nanodbc/nanodbc.cpp:3...。表中可能有很多 large data types(例如,varbinary(max)textimage)。尝试使用*SELECT col1, col2, col3 FROM [eCW].[Visits] 选择列而不是全部。 dbReadTableCREATE TABLE 语句的顺序读取所有列。 然后,明确地SELECT 所有需要的列,并选择大数据类型作为非常 last 列以避免早期错误(这不是由于行而是由于列)。如需进一步帮助,请发布schema of your table。需要查看表是否包含大数据类型。 请用这么长的信息更新您的帖子并删除上面的cmets,甚至过去的cmets。再次尝试明确命名您需要的列,就像上面的 R 错误帖子显示一样,将 varbinarytext 放在 SELECTend 处。

以上是关于使用 ODBC 包将数据从 SQL Server 保存或读取到 R的主要内容,如果未能解决你的问题,请参考以下文章

请教!为何我设置odbc数据源连接sql server数据库连接不上?

停止 .NET 应用程序的 SQL Server DB 可以通过使用 ODBC 的 Access 进行修改?

将数据从 SAP 提取到 SQL Server

无法将 ODBC 数据源添加到 SQL Server

C#实现ODBC驱动代码连接Sql Server数据库

使用 ODBC 连接时如何在 MS Access 或 SQL Server 中使用日期数据类型