C# TSQL-选择插入的行

C# TSQL-选择插入的行,c#,sql-server,tsql,C#,Sql Server,Tsql,有没有办法选择插入的行?我正在尝试使用SqlCommand运行以下查询,该查询用于在数据库中保留给定id: INSERT INTO tbl (id) SELECT COUNT(*) + 1 AS id from tbl 是否有方法返回插入的id列,以便我可以在我的应用程序中使用它?或者有没有更简单的方法可以实现这一点?我必须绝对确保我保留了免费id,即使多个用户将同时使用该应用程序 另外,是否有一种方法可以将查询更改为拾取第一个空闲id,以避免出现空白?如果id是一个标识列,则可以使用SCOP

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

INSERT INTO tbl (id)
SELECT COUNT(*) + 1 AS id from tbl
是否有方法返回插入的id列,以便我可以在我的应用程序中使用它?或者有没有更简单的方法可以实现这一点?我必须绝对确保我保留了免费id,即使多个用户将同时使用该应用程序

另外,是否有一种方法可以将查询更改为拾取第一个空闲id,以避免出现空白?

如果id是一个标识列,则可以使用SCOPE\u identity或MAXid来获取最新的记录id,但这并不能解决任何问题。获取该记录时,可能会插入另一条记录。另外,如果要获取插入的行,一种方法是通过触发器或插入的关键字。但是尝试保留id是没有用的,因为identity列每次都返回一个唯一的id。

您可以轻松地使用OUTPUT子句将新创建的id作为结果集输出,并且您可以使用标准的SqlDataReader从C应用程序读取这些id:

Update:可以从C端捕获OUTPUT子句返回的数据,就像它是常规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?听起来你真正想解决的问题是你为什么要这么做。数据库已经有自动id列,当您进行插入时,这些列将生成一个新的唯一id。否则,当我将执行一系列与新行相关的更新时,我如何确保我将对一行进行操作,并且唯一的关键列是id列?可能对插入数据后如何获取标识感兴趣。这样,一旦你插入数据,数据库就可以生成一个id,然后你可以为下一步要做的任何事情检索它。你能详细说明我如何捕获输出吗?据我所知,SqlCommand可以返回数据,也可以操作数据,但不能两者兼而有之。在SSM内部使用也非常方便!插入的输出。*显示刚刚插入的所有内容。很好的提示,谢谢!SCOPE_标识不是全局的,因此如果只插入一条记录,可以在SCOPE中使用它来获取id值。您不必担心同时插入其他作用域。在这里看到更多
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();
}