【问题标题】:Invalid object name Error when querying SQL Server Database from R using ODBC使用 ODBC 从 R 查询 SQL Server 数据库时出现无效的对象名称错误
【发布时间】:2018-04-04 19:48:00
【问题描述】:

我已经在 R 中建立了一个连接:

conn <- dbConnect(odbc::odbc(),
                 Driver = "SQL Server",
                 Server = "...",
                 Database = "AdventureWorks2012")

默认的 ODBC 驱动程序是 AdventureWorks2012。我可以看到数据集很好,例如,以下代码运行没有问题:

dbGetQuery(conn, "SELECT TOP 10 * FROM Person.Person")

另一方面,运行

dbReadTable(conn, "Person.Person")

产量:

Error: <SQL> 'SELECT * FROM "Person.Person"'
  nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'Person.Person'. 

类似,正在运行

data <- tbl(conn, "Person.Person")

产量:

Error: <SQL> 'SELECT *
FROM "Person.Person" AS "zzz12"
WHERE (0 = 1)'
  nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'Person.Person'.

另外,我对WHERE (0 = 1) 感到困惑:无法弄清楚它来自哪里!!!

(1) 该表确实存在于数据库中。 (2) 我已经用正确的 Schema 限定了名称。 (3) 我已将 ODBC 中的默认数据库设置为 AdventureWorks2012。

感谢您的帮助和洞察力。谢谢...

> tableList <- dbListTables(conn)
> tableList
  [1] "AWBuildVersion"                                      
  [2] "DatabaseLog"                                         
  [3] "DeleteExample"                                       
  [4] "EmployeeSales"                                       
  [5] "ErrorLog"                                            
  [6] "PersonCross"                                         
  [7] "PhoneCross"                                          
  [8] "Department"                                          
  [9] "Employee"                                            
 [10] "EmployeeDepartmentHistory"                           
 [11] "EmployeePayHistory"                                  
 [12] "JobCandidate"                                        
 [13] "Shift"                                               
 [14] "Address"                                             
 [15] "AddressType"                                         
 [16] "BusinessEntity"                                      
 [17] "BusinessEntityAddress"                               
 [18] "BusinessEntityContact"                               
 [19] "ContactType"                                         
 [20] "CountryRegion"                                       
 [21] "EmailAddress"                                        
 [22] "Password"                                            
 [23] "Person"                                              
 [24] "PersonPhone"
 ...

> dbReadTable(conn, "Person")
Error: <SQL> 'SELECT * FROM "Person"'
  nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'Person'. 

【问题讨论】:

  • 我对 odbc 的东西不太了解,但是 'SELECT * FROM "Person.Person"' 的东西看起来很奇怪。我不认为“-quotes 应该用于对象的名称,也许试试 dbReadTable(conn, Person.Person)?
  • 根据AdventureWorks,没有Person.Person 表。有Person.ContactSales.SalesPerson
  • AdventureWorks2012 有一个Person.Person 表。
  • 你有没有想过萨沙?

标签: sql r sql-server odbc invalid-object-name


【解决方案1】:

我遇到了同样的问题,并在 dbplyr 文档中找到了答案:

https://db.rstudio.com/best-practices/schema/ 其中包含此错误消息并说您必须这样做:tbl(con, in_schema("production", "flights"))

但是,此处的“生产”特定于您的数据库。

我花了一段时间才弄清楚我的架构名称是什么,但结果证明它只是数据库的名称。所以,也许你可以试试

    conn <- dbConnect(odbc::odbc(),
             Driver = "SQL Server",
             Server = "...",
             Database = "AdventureWorks2012")
    data <- tbl(conn, in_schema("AdventureWorks2012", "Person"))

    data <- tbl(conn, in_schema("Person", "Person"))

?

【讨论】:

    【解决方案2】:

    由于AdventureWorks 没有维护默认架构(即没有dbo),请考虑使用odbc::dbId 来正确选择此Git issue comment 所示架构下的表:

    conn <- dbConnect(odbc::odbc(),
                      Driver = "SQL Server",
                      Server = "...",
                      Database = "AdventureWorks2012")
    
    tbl <- dbId(conn, "Contact", "Person")
    dbReadTable(conn, tbl)
    

    注意:就在 15 天前,odbc 软件包的架构支持相对较新,每个 authors 之一。如果 CRAN 版本太旧,您可能需要重新安装 Git 开发版本。

    【讨论】:

    • 谢谢。 dbId 方法不在稳定的 master 分支中。我宁愿不使用它。
    • 明白。好奇,当您不放置任何符合条件的模式而只是查询表名时会发生什么?另外,dbListTables(conn) 显示什么?
    • 请编辑您的帖子以显示dbListTable(conn) 的输出。您不能在 SELECT 查询中使用确切的名称吗?
    【解决方案3】:

    我发现当我使用带有“Initial Catalogue=dbname”设置而不是“Database=dbname”的连接字符串时出现此错误:

    # This works
    connectionString <- "Driver={ODBC Driver 17 for SQL Server};Server=tcp:dbServer,1433;Database=dbName;Persist Security Info=False;UID=dbUser;PWD=dbPassword;MultipleActiveResultSets=False;Connection Timeout=30;"
    
    conn<-dbConnect(odbc::odbc(), .connection_string = connectionString)
    dbReadTable(conn, "Person")
    

    【讨论】:

      猜你喜欢
      • 2019-10-21
      • 1970-01-01
      • 2019-07-27
      • 2011-10-06
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      相关资源
      最近更新 更多