3

有没有办法选择插入的行?我正在尝试使用SqlCommand(它用于在数据库中保留给定的 id)运行以下查询:

INSERT INTO tbl (id)
SELECT COUNT(*) + 1 AS id from tbl

有没有办法返回插入的 id 列,以便我可以在我的应用程序中使用它?或者也许有更简单的方法可以实现这一目标?我必须绝对确定我保留了免费 ID,即使多个用户将同时使用该应用程序。

另外,有没有办法可以更改查询以选择第一个空闲 id,这样我就可以避免空白?

4

2 回答 2

10

您可以轻松地使用该OUTPUT子句来输出例如新创建的 ID 作为结果集,并且您可以使用标准从 C# 应用程序中读取它们SqlDataReader

INSERT INTO tbl (id)
OUTPUT Inserted.Id
   SELECT COUNT(*) + 1 AS id from tbl

更新:子句返回的数据OUTPUT可以从 C# 端捕获,就好像它是一个常规SELECT语句一样:

string insertStmt = "INSERT INTO tbl (id) " + 
                    " OUTPUT Inserted.Id " + 
                    " SELECT COUNT(*) + 1 AS id from tbl";

using (SqlConnection conn = new SqlConnection(-your-connection-string-here-))
using (SqlCommand cmd = new SqlCommand(insertStmt, conn))
{
    conn.Open();

    // execute your INSERT statement into a SqlDataReader
    using(SqlDataReader reader = cmd.ExecuteReader())
    {
        // read the values returned from the OUTPUT clause
        while(reader.Read())
        {
            int insertedID = reader.GetInt32(0);
            // do something with those values....                
        }
    }

    conn.Close();
}
于 2013-05-19T20:00:44.610 回答
0

如果id是一个标识列,您可以使用SCOPE_IDENTITY()orMAX(id)来获取最新的记录 id,但这不会解决任何问题。在您获取该记录时,可能会插入另一条记录。此外,如果您想获取插入的行,一种方法是通过Triggers或通过inserted关键字。但是尝试保留 id 是没有用的,因为标识列每次都返回一个唯一的 id。

于 2013-05-19T20:00:25.997 回答