TSQL -选择插入的行

本文关键字:插入 选择 TSQL | 更新日期: 2023-09-27 18:14:23

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

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

是否有一种方法来返回插入的id列,所以我可以在我的应用程序中使用它?或者有没有更简单的方法?我必须绝对确定我保留了免费id,即使多个用户将同时使用该应用程序。

另外,是否有一种方法可以改变查询选择第一个自由id,这样我就可以避免差距?

TSQL -选择插入的行

你可以很容易地使用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();
}

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