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

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

我的理解是,如果我使用insert批处理scope_identity()命令,那么它仍然与insert命令在同一范围内? 像下面的东西。 虽然很难validation……我会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]); } } } 

SCOPE_IDENTITY的文档 (强调我的):

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

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

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

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