返回最后插入的ID,而不使用第二个查询

本文关键字:第二个 查询 最后 插入 ID 返回 | 更新日期: 2023-09-27 17:52:15

我正在做一个ASP。. NET项目(c#)与SQL Server 2008.

当我插入一行到数据库中的表时,我想获得最后插入的ID,这是表的IDENTITY (Auto incresed)。

我不希望使用另一个查询,并做一些像…

SELECT MAX(ID) FROM USERS;

因为-即使它只是一个查询-它感觉很蹩脚…

当我插入一些东西时,我通常使用ExecuteNonQuery(),它返回受影响行的数量。

int y = Command.ExecuteNonQuery();

是否有一种方法可以返回最后插入的ID而不使用另一个查询?

返回最后插入的ID,而不使用第二个查询

大多数人都是这样做的:

INSERT dbo.Users(Username)
VALUES('my new name');
SELECT NewID = SCOPE_IDENTITY();

(或者不使用查询,将其赋值给变量)

所以这不是两个查询对表

但是也有以下方法:

INSERT dbo.Users(Username)
OUTPUT inserted.ID
VALUES('my new name');

您将无法真正地检索ExecuteNonQuery,但是

您可以将id作为存储过程的输出参数返回,例如@userId int output

然后,插入之后,SET @userId = scope_identity()

  • 即使它只是一个查询-它感觉很蹩脚…

这实际上也是错误的,因为你可以有多个重叠的iserts。

这是我一直觉得有趣的一件事——人们不阅读文档。

SELECT SCOPE_IDENTITY()

返回在特定范围内生成的最后一个标识值,并且语法正确。它也有适当的文档。

有没有一种方法来返回最后插入的ID不使用另一个查询?

是的。查询同一个SQL批处理中的数字

INSERT (blablab9a); SELECT SCOPE_IDENTITY ();

作为一个字符串。ExecuteScalar .

一个批处理中可以有多条SQL语句

如果你想从c#代码中执行查询&想要得到最后插入的id,那么你必须找到下面的代码。

SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
        connection.Open();
        string sql = "Insert into [Order] (customer_id) values (" + Session["Customer_id"] + "); SELECT SCOPE_IDENTITY()";
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = connection;
        cmd.CommandText = sql;
        cmd.CommandType = CommandType.Text;
        var order_id =  cmd.ExecuteScalar();
        connection.Close();
        Console.Write(order_id);