批处理的sqlclient命令中的Scope_identity()

时间:2012-03-12 21:54:37

标签: c# sql sqlclient scope-identity

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

我的理解是,如果我使用insert批处理scope_identity()命令,那么它仍然与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]);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

From the documentation for SCOPE_IDENTITY(强调我的):

  

返回插入标识列的最后一个标识值   相同的范围。范围是一个模块:存储过程,触发器,   功能,或批次。因此,两个陈述是相同的   范围,如果它们在同一存储过程,函数,或   批次

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

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

是批处理,因此,您将获得该批处理中最后插入的标识值,在这种情况下是插入中的标识值,因为它是批处理中唯一的其他语句。