“[RODBC] 错误:无法 SQLExecDirect”,因为在过程中插入语句
Posted
技术标签:
【中文标题】“[RODBC] 错误:无法 SQLExecDirect”,因为在过程中插入语句【英文标题】:"[RODBC] ERROR: Could not SQLExecDirect" because insert statement inside procedure 【发布时间】:2017-05-26 18:32:11 【问题描述】:所有涉及的表都被授权选择、更新、删除、插入。我正在尝试执行一个程序并收到该错误。
我使用了odbcDriverConnect
,因为我猜任何连接参数都可以解决我的问题(我尝试了trusted_connection
和autocommit
)。
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”,因为在过程中插入语句的主要内容,如果未能解决你的问题,请参考以下文章