" [RODBC]错误:无法SQLExecDirect"因为在程序中插入语句

时间:2017-05-26 18:32:11

标签: sql-server r stored-procedures insert rodbc

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

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

2 个答案:

答案 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)