“[RODBC] 错误:无法 SQLExecDirect”,因为在过程中插入语句

Posted

技术标签:

【中文标题】“[RODBC] 错误:无法 SQLExecDirect”,因为在过程中插入语句【英文标题】:"[RODBC] ERROR: Could not SQLExecDirect" because insert statement inside procedure 【发布时间】:2017-05-26 18:32:11 【问题描述】:

所有涉及的表都被授权选择、更新、删除、插入。我正在尝试执行一个程序并收到该错误。

我使用了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 语句在数据库上运行正常,用户相同。

【问题讨论】:

Excute 也被授予了吗? 是的,在授予的程序上执行。它在我退出插入时运行。 程序的第一行有“Set nocount on”指令吗?它应该有。 tks,@DennesTorres,它成功了!你想回答,所以我可以投票给你吗? insert into 不起作用的任何原因?也许是行数? 【参考方案1】:

您的过程需要在其第一行中使用指令“Set nocount on”。

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

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

【讨论】:

【参考方案2】:

补充@DennesTorres 的答案,要使用sqlQuery 运行insert into,需要在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)

【讨论】:

以上是关于“[RODBC] 错误:无法 SQLExecDirect”,因为在过程中插入语句的主要内容,如果未能解决你的问题,请参考以下文章