【问题标题】:"[RODBC] ERROR: Could not SQLExecDirect" because insert statement inside procedure“[RODBC] 错误:无法 SQLExecDirect”,因为在过程中插入语句
【发布时间】: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 不起作用的任何原因?也许是行数?

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


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-21
      • 2023-03-27
      • 2019-04-10
      • 2015-07-02
      • 1970-01-01
      • 2018-05-19
      • 2014-05-25
      • 1970-01-01
      相关资源
      最近更新 更多