查询在 SQL 服务器中有效,但在 R 中无效
Query works in SQL Server but not in R
我在 SQL 服务器上写了一个查询,它 运行 没问题。这是出于隐私原因更改名称的查询。
SELECT *
FROM table1 (nolock)
LEFT JOIN table2 (nolock)
ON table1.ID = table2.ID
WHERE table1.Date = '2021-03-05' AND table1.ID = '120';
这很好用,可以提取 30k 行。我已经使用 DBI
和 odbc
包创建了一个 ODBC 连接到 R 中的服务器。我可以 运行 来自 R 的查询就好了。我 运行 很多都没有问题。例如,这个 运行s 没有错误:
DBI::dbGetQuery(conn, believeNRows = FALSE, "
SELECT TOP 10 *
FROM table1 (nolock);
")
但是当我包含 LEFT JOIN
时,R 中的查询失败并且 returns 出现错误。
这是 R 中的相同查询:
DBI::dbGetQuery(conn, believeNRows = FALSE, "
SELECT *
FROM table1 (nolock)
LEFT JOIN table2 (nolock)
ON table1.ID = table2.ID
WHERE table1.Date = '2021-03-05' AND table1.ID = '120';
")
我在 VSCode 工作,所以错误消息的信息不是很丰富:
Error in app$vspace(new_style$margin-top
%||% 0) : attempt to
apply non-function
根据其他一些答案,我在查询中包含了几个额外的选项,但它们没有帮助:
DBI::dbGetQuery(conn, believeNRows = FALSE, "
SET ANSI_WARNINGS OFF;
SET NOCOUNT ON;
SELECT *
FROM table1 (nolock)
LEFT JOIN table2 (nolock)
ON table1.ID = table2.ID
WHERE table1.Date = '2021-03-05' AND table1.ID = '120';
")
有谁知道为什么这个非常好的查询在从 R 内部传递到 SQL 服务器时不起作用?
万一其他人以后遇到这个问题,我有两个障碍。首先,相对于@r2evans 的评论,我的错误消息被屏蔽了。根据 a readr github issue,我重新安装了 cli
软件包并开始收到未屏蔽的错误消息。重新运行我的代码并收到此错误:
Error:
! Column names `ID1` and `Col1` must not be duplicated.
Use .name_repair to specify repair.
Caused by error in `stop_vctrs()`:
! Names must be unique.
x These names are duplicated:
* "ID1" at locations 3 and 72.
* "Col1" at locations 45 and 75.
Run `rlang::last_error()` to see where the error occurred.
事实证明,SQL
调用会带回所有列,SSMS 会自动删除重复的列。另一方面,R 没有。所以我更改了 SELECT
子句以选择我想要的特定列并且代码有效。
我在 SQL 服务器上写了一个查询,它 运行 没问题。这是出于隐私原因更改名称的查询。
SELECT *
FROM table1 (nolock)
LEFT JOIN table2 (nolock)
ON table1.ID = table2.ID
WHERE table1.Date = '2021-03-05' AND table1.ID = '120';
这很好用,可以提取 30k 行。我已经使用 DBI
和 odbc
包创建了一个 ODBC 连接到 R 中的服务器。我可以 运行 来自 R 的查询就好了。我 运行 很多都没有问题。例如,这个 运行s 没有错误:
DBI::dbGetQuery(conn, believeNRows = FALSE, "
SELECT TOP 10 *
FROM table1 (nolock);
")
但是当我包含 LEFT JOIN
时,R 中的查询失败并且 returns 出现错误。
这是 R 中的相同查询:
DBI::dbGetQuery(conn, believeNRows = FALSE, "
SELECT *
FROM table1 (nolock)
LEFT JOIN table2 (nolock)
ON table1.ID = table2.ID
WHERE table1.Date = '2021-03-05' AND table1.ID = '120';
")
我在 VSCode 工作,所以错误消息的信息不是很丰富:
Error in app$vspace(new_style$
margin-top
%||% 0) : attempt to apply non-function
根据其他一些答案,我在查询中包含了几个额外的选项,但它们没有帮助:
DBI::dbGetQuery(conn, believeNRows = FALSE, "
SET ANSI_WARNINGS OFF;
SET NOCOUNT ON;
SELECT *
FROM table1 (nolock)
LEFT JOIN table2 (nolock)
ON table1.ID = table2.ID
WHERE table1.Date = '2021-03-05' AND table1.ID = '120';
")
有谁知道为什么这个非常好的查询在从 R 内部传递到 SQL 服务器时不起作用?
万一其他人以后遇到这个问题,我有两个障碍。首先,相对于@r2evans 的评论,我的错误消息被屏蔽了。根据 a readr github issue,我重新安装了 cli
软件包并开始收到未屏蔽的错误消息。重新运行我的代码并收到此错误:
Error:
! Column names `ID1` and `Col1` must not be duplicated.
Use .name_repair to specify repair.
Caused by error in `stop_vctrs()`:
! Names must be unique.
x These names are duplicated:
* "ID1" at locations 3 and 72.
* "Col1" at locations 45 and 75.
Run `rlang::last_error()` to see where the error occurred.
事实证明,SQL
调用会带回所有列,SSMS 会自动删除重复的列。另一方面,R 没有。所以我更改了 SELECT
子句以选择我想要的特定列并且代码有效。