首页 > 解决方案 > dbReadTable 不会提取数据,但 dbListFields 会看到正确的字段

问题描述

我正在尝试从我有权访问的 SQL 数据库中提取数据。我可以连接到数据库,查看表并获取与给定表关联的字段,但无法将表读入 R 变量。

我在 R Studio 工作,以防万一。

我尝试使用在线代码片段(R 的新手)并且这些工作,除了 dbReadTable() 示例。我使用了 "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 的数据库。这行得通。我希望 testing123 包含“付款”中的所有字段。这也有效。我希望 testing456 是付款的 data.frame 副本。这会产生:错误:'SELECT * FROM "Payments" nanodbc/nanobdc.cpp:1587 42s02 [Microsoft][ODBC SQL SERVER DRIVER][SQL SERVER]无效的 pbject 名称'Payments'。

如果没有“付款”作为参数,它会略有不同 - 只是说“找不到对象“付款””。

非常感谢任何帮助。

标签: sqlrr-dbi

解决方案


我怀疑这是因为您的表位于不同的目录或架构中。

基本原理DBI::dbListFields正在做select * from ... limit 0(这不是 sql server 的正确语法),但odbc::dbListFields实际上是在调用connection_sql_columns特定于 SQL Server 的 C++ 函数。它可能允许您有点草率,因为即使您没有指定目录和/或模式,它也会找到表。这就是你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]")

(使用[]引用标识符括号通常是个人喜好,仅在某些极端情况下严格要求。)


推荐阅读