我通常在插入记录时使用存储过程以确保获得正确的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]);
}
}
}
答案 0 :(得分:3)
From the documentation for SCOPE_IDENTITY
(强调我的):
返回插入标识列的最后一个标识值 相同的范围。范围是一个模块:存储过程,触发器, 功能,或批次。因此,两个陈述是相同的 范围,如果它们在同一存储过程,函数,或 批次强>
在这种情况下,您的命令:
"insert into .... ; select SCOPE_IDENTITY();"
是批处理,因此,您将获得该批处理中最后插入的标识值,在这种情况下是插入中的标识值,因为它是批处理中唯一的其他语句。