代码之家  ›  专栏  ›  技术社区  ›  HolgerBarlt

R odbc在插入后不返回SCOPE_IDENTITY

  •  0
  • HolgerBarlt  · 技术社区  · 5 年前

    我想使用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;
    

    当我在SQLServerManagementStudio中运行此语句时,它会愉快地返回一个包含新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
    

    因此,insert语句在服务器上成功执行,但是我没有得到新分配的ID。内容 dbFetch 是一个空数据。框架我也试过使用 dbSendStatement 和 dbExecute 没有任何进展。我还尝试挖掘其他参数,比如 immediate=TRUE 没有任何成功。我还尝试切换回旧的RODBC包,并使用其中的方法。什么都不管用。

    我错过什么了吗?

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

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

    0 回复  |  直到 5 年前
        1
  •  1
  •   SteveC    5 年前

    基于对R。。。拥有 INSERT 返回您可以添加的新创建的id OUTPUT 条款 插入 陈述看来这是可行的。 像这样的

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