【问题标题】:How to get last id if any column in SQL Server 2005? [duplicate]如果 SQL Server 2005 中有任何列,如何获取最后一个 ID? [复制]
【发布时间】:2012-05-12 10:25:59
【问题描述】:

可能重复:
How to get last inserted id?

我正在尝试获取最后一个 id(identity 列的最后一个值)以在每次将数据插入表时在控件上显示它。

如何使用 C# 在 SQL Server 2005 的存储过程中获取最后一个 id?

【问题讨论】:

  • 您的意思是“在插入之后”(如果是,SCOPE_IDENTITY()),还是您的意思是“在任何时候”?注意:在第二种情况下没有太多好处,因为你不能保证下次你会得到 +1(其他 spid 等)

标签: c# sql-server-2005


【解决方案1】:

身份列在数据库中递增,而不是在 C# 端。您可以像这样查询最后一个值:

SELECT MAX(id) FROM mytable

【讨论】:

  • 这只是为您提供了当前表中的最大值 - 但如果最后几个插入都被事务回滚,IDENTITY 列的值可能更高。这不是一种可靠的检查方式
  • @marc_s - 这是真的。为您的回答 +1。
  • 谢谢 Jirka Han。你做得很好,但我正在寻找的是我要发布的内容。经过 1 天的棘手练习后,我为我的问题找到了绝对解决方案。请看这里。
【解决方案2】:

要么在插入发生时获取最新的 ID(使用 SCOPE_IDENTITY()),要么稍后需要检查 IDENTITY 列的当前值,使用 SELECT IDENT_CURRENT('table_name') 获取该值。

因此,最简单的方法是在插入值时获取 ID - 如下所示:

string sql = "INSERT INTO dbo.YourTable(Col1, ..., ColN) VALUES(@Val1, ..., @ValN); SELECT SCOPE_IDENTITY()";

using (SqlConnection conn = new SqlConnection(connString))
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
    conn.Open();
    _ID = (Int32)cmd.ExecuteScalar();
    conn.Close();
}

或者,如果您在插入 ID 时无法获取它,您可以稍后随时检查给定表上 IDENTITY 列的当前上次使用值是什么,使用以下内容:

string sql = string.Format("SELECT IDENT_CURRENT('{0}');", yourTableName);

using (SqlConnection conn = new SqlConnection(connString))
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
    conn.Open();
    _ID = (Int32)cmd.ExecuteScalar();
    conn.Close();
}

【讨论】:

    【解决方案3】:

    你可以用这个

    SELECT @@IDENTITY AS 'Identity';
    

    或者这个

    SELECT MAX(SomeID) FROM SomeTable;
    

    编辑

    最佳使用方式

    SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
    

    在 C# 中你可以调用

    Int32 _ID = 0;
    //you could use second variant sql= "SELECT MAX(SomeID) FROM SomeTable";
    string sql =
        "SELECT @@IDENTITY AS 'Identity'";
    using (SqlConnection conn = new SqlConnection(connString))
    {
        SqlCommand cmd = new SqlCommand(sql, conn);
        try
        {
            conn.Open();
            _ID = (Int32)cmd.ExecuteScalar();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    

    编辑

    感觉不同的好链接 Using @@IDENTITY and SCOPE_IDENTITY with triggers

    【讨论】:

    【解决方案4】:
    SELECT TOP 1 Id FROM table_name ORDER BY 1 DESC
    

    或在 LINQ 中:

    context.table.Select(x->x.Id).OrderByDescending(x->x.Id).FirstOrDefault();
    

    【讨论】:

    • .Max(x => x.Id) 似乎更直接......如果担心零行,也许.Max(x => (int?)x.Id)
    • 这只是为您提供当前表中的最大值 - 但如果最后几个插入都被事务回滚,IDENTITY 列可能会处于更高的值。这不是一种可靠的检查方式
    猜你喜欢
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多