"[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_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 语句 运行 在数据库上正常,用户相同。
您的程序的第一行需要指令 "Set nocount on"。
过程中的插入指令有一个结果,一个行计数,返回给客户端。当插入出现在 select 指令之前时,我们当然希望在客户端中得到 select 结果,但是客户端收到多个结果并且插入行数排在第一位。
通常,发生这种情况时,我们会收到空结果集。看来 RODBC 在处理多个结果集时遇到了更大的麻烦。
补充@DennesTorres 的回答,运行 一个 insert into
和 sqlQuery
,需要在 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)
涉及的所有表都是select,update,delete,insert granted。我正在尝试执行一个过程并收到该错误。
我使用了 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 语句 运行 在数据库上正常,用户相同。
您的程序的第一行需要指令 "Set nocount on"。
过程中的插入指令有一个结果,一个行计数,返回给客户端。当插入出现在 select 指令之前时,我们当然希望在客户端中得到 select 结果,但是客户端收到多个结果并且插入行数排在第一位。
通常,发生这种情况时,我们会收到空结果集。看来 RODBC 在处理多个结果集时遇到了更大的麻烦。
补充@DennesTorres 的回答,运行 一个 insert into
和 sqlQuery
,需要在 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)