dbReadTable不会提取数据,但是dbListFields将看到正确的字段

时间:2019-10-08 15:46:07

标签: sql r r-dbi

我正在尝试从我有权访问的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]无效的对象名称“付款”。

没有以“付款”作为参数的情况稍有不同-只是说“找不到对象“付款””。

非常感谢任何帮助。

2 个答案:

答案 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 ...")