【发布时间】:2021-01-14 07:32:18
【问题描述】:
连接SQL服务器后,可以列出其中的数据库。
con = dbConnect(odbc(),
Driver = "ODBC Driver 17 for SQL Server",
Server = "xxxxxxxxxxxx",
UID = "xxxxxxxxxxxx",
PWD = "xxxxxxxxxxxx",
Port = xxxxxxxxxxxx)
在这里你可以找到一个成功的连接。
之后,我只想列出此 SQL 服务器中的数据库
databases = dbGetQuery(con, "SELECT name FROM master..sysdatabases")
由于我不熟悉SQL,看到“con”中有一个已经分配的数据库“DB01CWE5462”,我有点奇怪。该数据库也可以在 dbGetQuery (DB01CWE5462) 的结果中找到。我猜这个数据库是自动分配给con的。
但是,我想导出上面看到的黄色突出显示的表格。以下代码之前(一个月前)成功,但现在返回错误。
tbl(con, in_schema("DB01WEA84103.dbo","Ad10Min1_Average"))
错误:nanodbc/nanodbc.cpp:1655:42000:[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]无效的对象名 'DB01WEA84103.dbo.Ad10Min1_Average'。 [Microsoft][ODBC 驱动程序 17 用于 SQL Server][SQL Server]无法准备语句。 '选择 * 从“DB01WEA84103.dbo”。“Ad10Min1_Average”作为“q13” 哪里(0 = 1)'
经过一番搜索,我找到了一个解决方案,与上述代码之前成功运行相比,速度相当慢。
dbReadTable(con, 'Ad10Min1_Average', schema='DB01WEA84103.dbo')
那么,我错过了什么?产生错误的 con 和 in_schema 代码如何再次工作?
【问题讨论】:
-
DB01WEA84103.dbo不是模式,它是 db_name.schema。您可以使用SELECT * FROM [DB01WEA84103].[dbo].[Ad10Min1_Average] WHERE (0 = 1)之类的方式进行跨数据库查询(授予权限)。不过,您为什么不让事情变得更轻松,并在您的连接中提供catalog="DB01WEA84103"以便它位于正确的数据库中? -
首先,感谢您的回复。但是有 22 个数据库,我必须访问每个数据库中的表,因此我想创建一个循环。正如你所说,我可以在 dbConnect 函数中添加 database 或 catalog = “DB...” 参数。此外,dbReadTable 函数也可以工作,但考虑到循环,与 tbl 和 in_schema 组合相比,它们非常慢。总之,我只想通过一个连接来访问不同的数据库。
标签: r sql-server odbc database-schema dbplyr