我正在尝试从我有权访问的SQL数据库中提取数据。我可以连接到数据库,查看表并获取与给定表关联的字段,但是无法将表读入R变量。
我正在R Studio工作,以防万一。
除了dbReadTable()示例外,我尝试使用在线代码段(R的新功能)来完成这些工作。我已经将“ Payments”和name =“ Payments”用作第二个参数,并且使用和不使用“”引号。
library(DBI)
con<-(dbConnect(odbc::odbc(), .connection_string="Driver={SQL Server},
Server=example_1234
Database=exampleDB
TrustedConnection=TRUE")
testing123 <- dbListFields(con,"Payments")
testing456 <- dbReadTable(con,"Payments")
我希望与现在称为con的数据库建立连接。这可行。 我希望test123包含“付款”中的所有字段。这也有效。 我希望test456是Payments的data.frame副本。这将产生: 错误:“ SELECT *来自“付款” nanodbc / nanobdc.cpp:1587 42s02 [Microsoft] [ODBC SQL SERVER DRIVER] [SQL SERVER]无效的对象名称“付款”。
没有以“付款”作为参数的情况稍有不同-只是说“找不到对象“付款””。
非常感谢任何帮助。
答案 0 :(得分:1)
我怀疑是因为您的表位于不同的目录或架构中。
合理性:DBI::dbListFields
正在执行select * from ... limit 0
(对于sql server,这不是正确的语法),但是odbc::dbListFields
确实在调用C ++函数{{1 }}是特定于SQL Server的。这可能使您变得草率,因为即使您未指定目录和/或架构,它也会找到表。这就是您的connection_sql_columns
工作正常的原因。 但是,dbListFields
实际上是在后台进行DBI::dbReadTable
(并且select * from ...
不会覆盖它),因此它不允许您省略架构(并且/或目录)。
首先,找到适合您的案例的表格信息:
odbc::
(我在计划您会找到的东西。)
从这里开始,尝试以下操作之一,直到它起作用:
DBI::dbGetQuery(con, "select top 1 table_catalog, table_schema, table_name, column_name from information_schema.columns where table_name='events'")
# table_catalog table_schema table_name column_name
# 1 my_catalog dbo Payments Id
我的猜测是x <- DBI::dbReadTable(con, DBI::SQL("[Payments]")) # equivalent to the original
x <- DBI::dbReadTable(con, DBI::SQL("[dbo].[Payments]"))
x <- DBI::dbReadTable(con, DBI::SQL("[my_catalog].[dbo].[Payments]"))
不起作用,因此对于“常规查询”,您将需要使用DBI::dbGetQuery(con, "select top 1 * from Payments")
的相同层次结构,例如其中之一
catalog.schema.table
(使用DBI::dbGetQuery(con, "select top 1 * from dbo.Payments")
DBI::dbGetQuery(con, "select top 1 * from [dbo].[Payments]")
DBI::dbGetQuery(con, "select top 1 * from [my_catalog].[dbo].[Payments]")
和[
带引号的括号通常是个人喜好,仅在某些特殊情况下严格要求。)
答案 1 :(得分:0)
尝试稍微更改con参数:
con <- DBI::dbConnect(odbc::odbc(),
Driver = "SQL Server",
Server = "example_1234",
Database = "exampleDB",
TrustedConnection = TRUE)
# read table to df
testing456 <- dbReadTable(con,"Payments")
# you can also use SQL queries directly, such as:
testing789 <- dbGetQuery(con, statement = "SELECT * FROM Payments WHERE ...")