使用ODBC从R查询SQL Server数据库时,对象名称无效

Sas*_*aei 5 sql sql-server odbc r invalid-object-name

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

conn <- dbConnect(odbc::odbc(),
                 Driver = "SQL Server",
                 Server = "...",
                 Database = "AdventureWorks2012")
Run Code Online (Sandbox Code Playgroud)

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

dbGetQuery(conn, "SELECT TOP 10 * FROM Person.Person")
Run Code Online (Sandbox Code Playgroud)

另一方面,跑步

dbReadTable(conn, "Person.Person")
Run Code Online (Sandbox Code Playgroud)

产量:

Error: <SQL> 'SELECT * FROM "Person.Person"'
  nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'Person.Person'. 
Run Code Online (Sandbox Code Playgroud)

相似,正在运行

data <- tbl(conn, "Person.Person")
Run Code Online (Sandbox Code Playgroud)

产量:

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'.
Run Code Online (Sandbox Code Playgroud)

另外,我很困惑WHERE (0 = 1):无法弄清楚它的来源!!!

(1)该表确实存在于数据库中。(2)我已经用正确的模式限定了名称。(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'. 
Run Code Online (Sandbox Code Playgroud)

Par*_*ait 1

由于AdventureWorks不维护默认架构(即 no dbo),请考虑使用odbc::dbId来正确选择此类架构下的表,如此Git 问题评论中所示:

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

tbl <- dbId(conn, "Contact", "Person")
dbReadTable(conn, tbl)
Run Code Online (Sandbox Code Playgroud)

注意:odbc根据一位作者的说法,对模式的支持对于包来说是相对较新的,就在 15 天前。如果 CRAN 版本太旧,您可能需要重新安装 Git 开发版本。