簡體   English   中英

使用ODBC從R查詢SQL Server數據庫時出現無效的對象名稱時出錯

[英]Invalid object name Error when querying SQL Server Database from R using ODBC

我在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'. 

我遇到了同樣的問題,並在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"))

由於AdventureWorks沒有維護默認模式(即沒有dbo ),因此請考慮使用odbc::dbId在此Git問題注釋中顯示的模式下正確選擇表:

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

tbl <- dbId(conn, "Contact", "Person")
dbReadTable(conn, tbl)

注意:最近15天前,每位作者odbc軟件包的模式支持相對較新。 如果CRAN版本太舊,您可能必須重新安裝Git開發版本。

當我使用具有'Initial Catalog = 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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM