所涉及的所有表都是选择,更新,删除,插入授权。我正在尝试执行一个程序并获得该错误。
我使用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语句在数据库上运行正常,具有相同的用户。
答案 0 :(得分:3)
您的程序需要第一行中的“设置nocount on”指令。
过程中的insert指令有一个结果,一个行计数,返回给客户端。当插入出现在select指令之前时,我们肯定会期望客户端中的select结果,但是客户端会收到多个结果并且插入行计数首先出现。
通常,当发生这种情况时,我们会收到空的结果集。看来RODBC在多个结果集方面遇到了更大的麻烦。
答案 1 :(得分:0)
补充@DennesTorres回答,要使用insert into
运行sqlQuery
,需要在set nocount on;
语句前加上insert
:
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)