sql - 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'。
如果没有“付款”作为参数,它会略有不同 - 只是说“找不到对象“付款””。
非常感谢任何帮助。
解决方案
我怀疑这是因为您的表位于不同的目录或架构中。
基本原理: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]")
(使用[
和]
引用标识符括号通常是个人喜好,仅在某些极端情况下严格要求。)
推荐阅读
- oracle-apex - Oracle Apex 同一页面上的多个授权
- javascript - 正则表达式验证asp.net数据注释中格式化货币的最小值
- ios - 将特定元素从可编码类数组映射到数组
- azure - Azure 中的 Databricks:增量表的集群性能比较
- css - 在表格列内弹出
- javascript - 对象作为 React 子对象无效(找到:带有键 {} 的对象)。在本地机器(chrome浏览器)中工作,但不在生产和其他浏览器中工作
- javascript - react项目制作的脚本文件如何将静态html变成动态应用程序?
- spring - Spring boot 错误处理,保持对标准属性的支持
- windows - powershell ExecutionPolicy 设置不正确
- magento - Magento 2.4系统>配置>目录在后端显示空白页