【问题标题】:R odbc does not return SCOPE_IDENTITY after insert插入后 R odbc 不返回 SCOPE_IDENTITY
【发布时间】:2021-02-03 04:14:57
【问题描述】:

我想使用 R 和 odbc 包在数据库中插入一个新行。

设置如下:

  • 我使用 SQL Server 来托管数据库
  • 我已经在我的机器上设置了一个 ODBC 驱动程序以连接到数据库

我创建了一个新表

CREATE TABLE [dbName].[dbSchema].[TestTableName] 
(
    MyID INT IDENTITY(1,1), 
    MyValue VARCHAR(255), 
    PRIMARY KEY (MyID) 
)

据我了解,该表的创建方式无关紧要。

现在我想在此表中插入一个新条目并保留 MyID 的新自动递增值。为此我可以运行以下 SQL 语句:

INSERT INTO [dbName].[dbSchema].[TestTableName] (MyValue)
VALUES ('test'); 

SELECT SCOPE_IDENTITY() as newID;

当我在 SQL Server Management Studio 中运行此语句时,它会愉快地返回一个包含新 ID 的 1x1 表。

现在我的问题开始了:当我尝试在 R 中使用相同的表单时:

con <- odbc::dbConnect(
          odbc::odbc(),
          dsn = ...,
          database = "dbName",
          UID = ...,
          PWD = ...
        ) # the connection is tested and works
createQuery <- "INSERT INTO [dbName].[dbSchema].[TestTableName] (MyValue ) VALUES ('test'); SELECT SCOPE_IDENTITY() as newID;"
dbSendRes <- odbc::dbSendQuery(conn = con, statement = createQuery)

dbSendRes 中的结果是:

<OdbcResult>
  SQL  INSERT INTO [dbName].[dbSchema].[TestTableName] (MyValue ) VALUES ('test'); SELECT SCOPE_IDENTITY() as newID;;
  ROWS Fetched: 0 [complete]
       Changed: 1

因此,插入语句在服务器上成功执行,但是我没有得到新分配的 ID。 dbFetch 的内容是一个空的data.frame。我也尝试使用dbSendStatementdbExecute 没有任何进展。我还尝试深入研究immediate=TRUE 等附加参数,但没有成功。我还尝试切换回旧的 RODBC 包并使用其中的方法。没有任何效果。

我错过了什么吗?

问题仍然存在,我必须以某种方式跟踪分配给 db 条目的新 ID!没有那个ID,我无法继续。我可以做一个解决方法并在通过另一个单独的语句完全插入后查询最大 ID,但是如果同时另一个语句插入另一个条目,这当然可能会导致其他更基本的问题......

很高兴有任何建议! 最好的

【问题讨论】:

    标签: r sql-server odbc


    【解决方案1】:

    基于对 R 的零知识...要让 INSERT 返回新创建的 id,您可以在 INSERT 语句中添加 OUTPUT 子句。看来这会奏效。 像这样的

    INSERT INTO [dbName].[dbSchema].[TestTableName] (MyValue ) 
    output inserted.MyID
    VALUES 
    ('test');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多