RODBCext:使用 sqlExecute() 时出现 SQL 42000 402 错误

Posted

技术标签:

【中文标题】RODBCext:使用 sqlExecute() 时出现 SQL 42000 402 错误【英文标题】:RODBCext: SQL 42000 402 Error when using sqlExecute() 【发布时间】:2016-11-28 21:26:12 【问题描述】:

我正在开发一个 Shiny 应用程序,用于更新 SQLServer2008 远程数据库中维护的条目。我一直在使用 RODBC 连接到数据库,并且正在尝试通过 RODBCext 使用参数化查询来支持信息的大规模更新。

我能够让参数化查询在我的 Windows 7、运行 R 3.2.3 的 RStudio 中工作,但由于某些原因,当我尝试从运行相同版本 R 并连接的 linux 机器上运行相同代码时使用相同版本的驱动程序,我收到以下错误:

Error in sqlExecute(Connection, data = dat) :
  42000 402 [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]The data types char and text are incompatible in the equal to operator.
42000 8180 [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Statement(s) could not be prepared.
[RODBCext] Error: SQLExecute failed
In addition: Warning messages:
1: In sqlExecute(Connection, data = dat) :
  42000 402 [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]The data types char and text are incompatible in the equal to operator.
2: In sqlExecute(Connection, data = dat) :
  42000 8180 [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Statement(s) could not be prepared.

这是在我的windows机器上正常工作的简单示例代码,但在linux机器上却不行(我删除了连接字符串信息):

library(RODBCext)

Connection <- odbcDriverConnect(paste('Driver=ODBC Driver 13 for SQL Server', 
'Server=<Server IP>', 'Port=<Port>', 'Database=<Database>', 'UID = <UserID>', 
'PWD=<Password>', sep = ';'))

dat <- data.frame(Node_ID = "999", NodeGUID = "AF213171-201B-489B-B648-F7D289B735B1")

query <- "UPDATE dbo.Nodes SET Node_ID = ? WHERE NodeGUID = ?"

sqlPrepare(Connection, query)

sqlExecute(Connection, data = dat)

在此示例中,数据框是使用列作为因子创建的。我已经尝试首先将列显式转换为字符,因为这似乎适用于日期问题的用户,但这仍然会导致相同的 SQL 错误。我还尝试将 Node_ID 转换为数字以匹配 SQL 表,但我得到了同样的错误。 SQL中Nodes表中的列定义为:

NodeGUID (PK, char(36), not null)
Node_ID (int, null)

我尝试通过为 sqlExecute 提供查询参数来组合 sqlPrepare 和 sqlExecute 调用,据我了解,这是一个微不足道的区别,它会导致相同的错误。

我怀疑驱动程序以及它们如何实现任何 SQL 调用 sqlExecute() 都存在差异。我还怀疑 sqlExecute() 必须处理数据类型,因为无论列类型如何,我的结果都不会改变。

感谢您提供的任何帮助!

【问题讨论】:

尝试不同的驱动程序,因为驱动程序 13 可能太新而无法与 RODBCext 兼容。很好奇,常规的 RODBC 是否适用于驱动程序? 感谢您的回复冻糕。我能够让所有常规 RODBC 函数与当前驱动程序一起使用。 【参考方案1】:

感谢所有关注我问题的人。

我工作的一位 SQL Server 人员能够解决这个问题。他们建议在为 sqlExecute() 编写的 SQL 查询中显式转换参数。这是有效的代码,请注意,我知道 GUID 将始终为 36 个字符,并且我确信我使用此查询的其余参数在转换为字符串时将小于 1000:

my_query <- "UPDATE dbo.Nodes SET Node_ID = CAST(? As varchar(1000)) WHERE NodeGUID = CAST(? As varchar(36))"
sqlExecute(Connection, data = dat, query = my_query)

我猜 Windows 的驱动程序以某种方式处理从文本到 varchar 的转换,但 linux 驱动程序没有。

我希望这可以帮助其他使用 RODBCext 的人。感谢 Mateusz Zoltak 和贡献者团队提供了一个很棒的软件包!

【讨论】:

以上是关于RODBCext:使用 sqlExecute() 时出现 SQL 42000 402 错误的主要内容,如果未能解决你的问题,请参考以下文章

R RODBCext 和参数化 IN 语句?

使用 R 与 RODBCext 和 RODBC 执行 SQL 存储过程

(fast_executemany = True) 错误“[ODBC Driver 17 for SQL Server]强制转换规范 (0) (SQLExecute)'的字符值无效”)

请高手进来帮忙,关于SQL和网络通信链接失败的问题,追加50分。

timesten日常维护

libpq 的 PQexecPrepared 和 SQL EXECUTE 的正确行为