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

dbReadTable won't pull data but dbListFields will see correct fields

我正在尝试从我有权访问的 SQL 数据库中提取数据。我可以连接到数据库,查看 table 并获取与给定 table 关联的字段,但无法将 table 读入 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 包含 "Payments" 中的所有字段。这也有效。 我希望 testing456 是 Payments 的 data.frame 副本。这会产生: 错误:'SELECT * 来自 "Payments" nanodbc/nanobdc.cpp:1587 42s02 [Microsoft][ODBC SQL 服务器驱动程序][SQL 服务器] 无效的项目名称 'Payments'.

不使用 "Payments" 作为参数会略有不同 - 只是说“未找到对象 "Payments"”。

非常感谢任何帮助。

试着稍微改变你的 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 ...")

我怀疑这是因为您的 table 在不同的目录或架构中。

基本原理DBI::dbListFields 正在执行 select * from ... limit 0(这对于 sql 服务器来说是不正确的语法),但是 odbc::dbListFields实际上是在调用特定于 SQL 服务器的 C++ 函数 connection_sql_columns。它可能允许您有点马虎,因为即使您没有指定目录 and/or 模式,它也会找到 table。这就是您的 dbListFields 正常工作的原因。 但是DBI::dbReadTable实际上在幕后做select * from ...(并且odbc::没有覆盖它),所以它不允许你省略模式(and/or 目录)。

首先,为您的案例找到具体的 table 信息:

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") 不起作用,因此对于 "regular queries",您需要使用与 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]")

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