返回最后插入的ID,而不使用第二查询(Return last inserted ID without

2019-08-06 16:01发布

我工作的一个ASP.NET项目(C#)与SQL Server 2008。

当我插入一行到数据库中的表,我想获得最后插入的ID,这是表的IDENTITY(自动递增)。

我不希望使用另一个查询,并且这样做...

SELECT MAX(ID) FROM USERS;

因为 - 尽管它只是一个查询 - 感觉跛脚...

当我插入的东西我通常使用的ExecuteNonQuery()返回受影响的行数。

int y = Command.ExecuteNonQuery();

是不是有没有办法不使用另一个查询返回最后插入ID?

Answer 1:

对于大多数人来说做到这一点通过以下方式:

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

SELECT NewID = SCOPE_IDENTITY();

(或代替查询,将其赋值给一个变量。)

因此,它不是真正的对表的两个查询...

然而也有以下方式:

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

你不会真的能够与检索此ExecuteNonQuery ,虽然。



Answer 2:

您可以从存储过程,如返回ID作为输出参数@userId int output

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



Answer 3:

  • 尽管这只是一个查询 - 感觉跛脚...

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

这是一件事,我一直fuind有趣 - 人们不读书的文档。

SELECT SCOPE_IDENTITY()

返回在特定的范围内所生成的最后一个标识值和语法正确。 它还被正确记录。

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

是。 请在SAAME SQL批处理的数量。

INSERT (blablab9a); SELECT SCOPE_IDENTITY ();

作为一个字符串。 的ExecuteScalar。

您可以在一个批次有一个以上的SQL语句。



Answer 4:

如果你想从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);


文章来源: Return last inserted ID without using a second query