我在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 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开发版本。
当我使用具有'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")