插入后R odbc不return SCOPE_IDENTITY
R odbc does not return SCOPE_IDENTITY after insert
我想使用 R 和 odbc 包向数据库中插入一个新行。
设置如下:
- 我使用SQL服务器来托管数据库
- 我已经在我的机器上安装了一个 ODBC 驱动程序以连接到数据库
我创建了一个新的table
CREATE TABLE [dbName].[dbSchema].[TestTableName]
(
MyID INT IDENTITY(1,1),
MyValue VARCHAR(255),
PRIMARY KEY (MyID)
)
据我了解,table 的创建方式并不重要。
现在我想在此 table 中插入一个新条目并保留 MyID 的新自动增量值。为此我可以运行以下SQL声明:
INSERT INTO [dbName].[dbSchema].[TestTableName] (MyValue)
VALUES ('test');
SELECT SCOPE_IDENTITY() as newID;
当我 运行 在 SQL Server Management Studio 中声明此语句时,它很高兴地 returns 一个包含新 ID 的 1x1 table。
现在我的问题开始了:当我尝试使用以下方法在 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。我也尝试使用 dbSendStatement
和 dbExecute
没有任何进展。我还尝试深入研究 immediate=TRUE
等附加参数,但没有成功。我还尝试切换回旧的 RODBC 包并使用其中的方法。没有任何效果。
我是不是漏掉了什么?
问题仍然存在,我必须以某种方式跟踪分配给数据库条目的新 ID!没有那个ID我不能继续。我可以做一个解决方法并在通过另一个单独的语句完成插入后查询最大 ID,但是如果同时另一个语句将插入另一个条目,这当然可能导致其他更基本的问题...
欢迎提出任何建议!
最佳
基于对 R 的零知识...要使 INSERT
return 成为新创建的 ID,您可以在 INSERT
语句中添加一个 OUTPUT
子句。看来这行得通。
像这样
INSERT INTO [dbName].[dbSchema].[TestTableName] (MyValue )
output inserted.MyID
VALUES
('test');
我想使用 R 和 odbc 包向数据库中插入一个新行。
设置如下:
- 我使用SQL服务器来托管数据库
- 我已经在我的机器上安装了一个 ODBC 驱动程序以连接到数据库
我创建了一个新的table
CREATE TABLE [dbName].[dbSchema].[TestTableName]
(
MyID INT IDENTITY(1,1),
MyValue VARCHAR(255),
PRIMARY KEY (MyID)
)
据我了解,table 的创建方式并不重要。
现在我想在此 table 中插入一个新条目并保留 MyID 的新自动增量值。为此我可以运行以下SQL声明:
INSERT INTO [dbName].[dbSchema].[TestTableName] (MyValue)
VALUES ('test');
SELECT SCOPE_IDENTITY() as newID;
当我 运行 在 SQL Server Management Studio 中声明此语句时,它很高兴地 returns 一个包含新 ID 的 1x1 table。
现在我的问题开始了:当我尝试使用以下方法在 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。我也尝试使用 dbSendStatement
和 dbExecute
没有任何进展。我还尝试深入研究 immediate=TRUE
等附加参数,但没有成功。我还尝试切换回旧的 RODBC 包并使用其中的方法。没有任何效果。
我是不是漏掉了什么?
问题仍然存在,我必须以某种方式跟踪分配给数据库条目的新 ID!没有那个ID我不能继续。我可以做一个解决方法并在通过另一个单独的语句完成插入后查询最大 ID,但是如果同时另一个语句将插入另一个条目,这当然可能导致其他更基本的问题...
欢迎提出任何建议! 最佳
基于对 R 的零知识...要使 INSERT
return 成为新创建的 ID,您可以在 INSERT
语句中添加一个 OUTPUT
子句。看来这行得通。
像这样
INSERT INTO [dbName].[dbSchema].[TestTableName] (MyValue )
output inserted.MyID
VALUES
('test');