使用 DPLYR 从链接的 SQL Server 中提取数据

问题描述 投票:0回答:1

我正在尝试使用 dplyr 从链接的 SQL Server 上的表中提取数据。只要我 (1) 提供完全限定的路径 ([服务器名称].[数据库名称].[架构名称].[表名称]) 和 (2) 设置,我就可以使用 dbGetQuery 方法连接并运行查询启动不带 DB 参数的 dbConnect 方法(以便连接到整个服务器,而不是特定的 DB)。如果我尝试连接到链接服务器上的数据库,我会收到“未找到”错误。

所以我正在使用服务器级连接,但是当我连接到服务器并尝试将数据从 SQL 表提取到 tbl 对象中时,我收到“无效的对象名称”错误。

我在跑步

``tbl(con, dbplyr::in_schema("[server name].[database name].[schema name]", "table name")``

我已经尝试过与

in_catalog
相同的方法,但没有成功。

有没有办法在 dplyr 中使用这些方法从链接服务器中提取数据?如果可以避免的话,我宁愿不运行

select *

我希望根据链接服务器表中的数据在 R studio 中创建一个表。相反,我收到一条错误消息,说我提供了“无效的对象名称”。我尝试过 in_schema 和 in_catalog 。我也确认了连接细节。

r sql-server linked-server dbplyr
1个回答
0
投票

这个问题是由

in_schema
的运作方式引起的。与我的回答类似here,我们需要告诉 dbplyr server-database-schema 字符串已经准备好了 sql。


说明

命令

dbplyr::in_schema("text1", "text2")
希望将所有
text1
视为模式名称,并将所有
text2
视为表名称。

这会在以下情况下导致问题:

in_schema("[server name].[database name].[schema name]", "table name")

因为

[server name].[database name].[schema name]
不是一个大的模式名称,而是三个单独名称的组合。但是,在翻译过程中,dbplyr 将整个参数包装在分隔符中,以便将其视为单个模式名称。


解决方案

幸运的是,有一种方法可以防止 dbplyr 将整个参数视为单个模式名称:

sql()
函数告诉 dbplyr 将其内容视为已转换为 SQL。

所以解决办法是:

in_schema(sql("[server name].[database name].[schema name]"), "table name")

使用此方法时需要额外小心。因为 dbplyr 不会应用分隔符,所以最好确保您的输入有自己的分隔符。

© www.soinside.com 2019 - 2024. All rights reserved.