"[RODBC] ERROR: Could not SQLExecDirect" because insert statement inside procedure

"[RODBC] ERROR: Could not SQLExecDirect" because insert statement inside procedure

涉及的所有表都是select,update,delete,insert granted。我正在尝试执行一个过程并收到该错误。

我使用了 odbcDriverConnect,因为我想任何连接参数都可以解决我的问题(我尝试了 trusted_connectionautocommit)。

cc = odbcDriverConnect(connection = paste0('DRIVER={SQL Server};SERVER=localhost;DATABASE=XX;UID=user;PWD=pass;autocommit=True;trusted_connection=true'))
rst = sqlQuery(cc, 'exec dbo.usp_mm_xx')
print(rst)
[1] "[RODBC] ERROR: Could not SQLExecDirect 'exec dbo.usp_mm_xx'"

如果我从程序中退出 insert,它 运行 没问题。
当我尝试 运行 insert 时,我遇到了同样的错误。

query=paste0('insert INTO dbo.X select * FROM dbo.Y a ',
             'where not exists (select 1 from dbo.X b where a.c1=b.c1 and a.c2=b.c2)')
rst=sqlQuery(cc, query)
print(rst)
[1] "[RODBC] ERROR: Could not SQLExecDirect 'insert INTO dbo.X SELECT *  FROM dbo.Y a where not exists (select 1 from dbo.X b where a.c1=b.c2 and a.c2=b.c2)'"

SQL 语句 运行 在数据库上正常,用户相同。

您的程序的第一行需要指令 "Set nocount on"。

过程中的插入指令有一个结果,一个行计数,返回给客户端。当插入出现在 select 指令之前时,我们当然希望在客户端中得到 select 结果,但是客户端收到多个结果并且插入行数排在第一位。

通常,发生这种情况时,我们会收到空结果集。看来 RODBC 在处理多个结果集时遇到了更大的麻烦。

补充@DennesTorres 的回答,运行 一个 insert intosqlQuery,需要在 insert 语句前添加 set nocount on;

query=paste0('set nocount on; insert INTO dbo.X select * FROM dbo.Y a ',
         'where not exists (select 1 from dbo.X b where a.c1=b.c1 and a.c2=b.c2)')
rst=sqlQuery(cc, query)
print(rst)
character(0)