1

我通常在插入记录时使用存储过程,以确保获得正确的 scope_identity() 值。我现在使用 SqlClient 时需要获取插入记录的 id 字段。

我的理解是,如果我将 scope_identity() 命令与 insert 一起批处理,那么它仍然与 insert 命令在同一范围内吗?像下面的东西。虽然很难验证...我会 100% 获得正确的 id 值吗..?

(id 字段是一个自动递增的 bigint - Sql Server)

long newid = 0;

using (SqlConnection conn = new SqlConnection(....))
{
    conn.Open();
    using (SqlCommand comm = new SqlCommand ("insert into .... ; select SCOPE_IDENTITY();", conn))
    {
        SqlDataReader reader = comm.ExecuteReader();
        if (reader.HasRows)
        {
            reader.Read();
            newid = Convert.ToInt64(reader[0]);
        }
    }
}
4

1 回答 1

3

SCOPE_IDENTITY(强调我的)的文档中:

返回插入到同一范围内的标识列中的最后一个标识值。范围是一个模块:存储过程、触发器、函数或批处理因此,如果两条语句在同一个存储过程、函数或批处理中,则它们属于同一范围。

在这种情况下,您的命令:

"insert into .... ; select SCOPE_IDENTITY();"

是一个批处理,因此,您将获得该批处理中最后插入的标识值,在本例中是插入中的标识值,因为它是批处理中唯一的其他语句。

于 2012-03-12T21:58:33.837 回答