我的问题是:我正在使用R-SQL工具从服务器中影响数据。尽管我的数据库连接很好,并且我可以对每个单独的表运行查询,但我不能使用相同的R-SQL工具运行两个表的内部联接,即dbconnent(来自DBI(和sqlQuery(来自RODCB(
- 以下是运行dbconnent((时的错误消息:"错误:nanodbc/nanodbc.cpp:1655:42000:[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]关键字"Key"附近的语法不正确。无法准备[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]语句">
以下是缩写代码
----
sql1 <- "
SELECT
e.RID, e.Form,
i.ItemName, i.Response
FROM ExamResult AS e
INNER JOIN ItemResult AS i
ON e.RID=i.RID
WHERE e.ExamSeriesCode= 'Exam1'
"
result <- dbGetQuery(conn, sql1)
谢谢!
为了调试,我对每个单独的表运行了查询,结果很好。
我检查了每个表中的链接var(RID(,它们有相同的名称和属性
我尝试了dbconnent(来自DBI(和sqlQuery(来自RODCB(。同样的问题(未运行内部联接(仍然存在。
您的错误消息包括对Key
、的引用
Error: nanodbc/nanodbc.cpp:1655: 42000: [Microsoft][ODBC Driver 17 for SQL
Server][SQL Server]Incorrect syntax near the keyword 'Key'. [Microsoft][ODBC
Driver 17 for SQL Server][SQL Server]Statement(s) could not be prepared.
这表明您的实际查询中有Key
。这是SQL中的保留字,要求对其进行转义。大多数DBMS通过在保留字周围使用括号来清楚地将其标识为SQL标识符(而不是Literal,例如字符串值'hello'
(。
最重要的是,在实际查询中,将Key
替换为[Key]
(或"Key"
(。
要通过编程实现这一点(并确认括号实际上适用于特定的DBMS(,可以使用:
DBI::dbQuoteIdentifier(con, "Key")
# <SQL> "Key"
这似乎没有告诉你多少,但双引号是真实的。
as.character(DBI::dbQuoteIdentifier(con, "Key"))
# [1] ""Key""
许多(包括SQL Server(将毫无歧义地接受[Key]
和"Key"
。