使用选择Scope_Identity()和存储过程

时间:2013-12-12 21:42:25

标签: c# sql stored-procedures

我正在编写一些代码,用于使用存储过程(sp_AddNewUser)将用户数据插入数据库。存储过程只是将数据插入到数据库中。我想知道是否可以在没有编辑存储过程的情况下将SCOPE_IDENTITY()函数与存储过程一起使用。

  SqlCommand cmd = new SqlCommand("sp_AddNewUser", conn);
  cmd.CommandType = CommandType.StoredProcedure;
  cmd.Parameters.Add("@firstname", SqlDbType.VarChar).Value =   row.Cells[_dicDef["firstname"]].Value;
  cmd.Parameters.Add("@lastname", SqlDbType.VarChar).Value = row.Cells[_dicDef["lastname"]].Value;
  cmd.ExecuteNonQuery();
  //NOT SURE WHAT TO DO AFTER THIS COMMENT ----
  string sql = "SELECT CAST(scope_identity() AS int)";
  cmd = new SqlCommand(sql, conn);
  newID = (Int 32_cmd.ExecuteScalar(); //<---- will this return the latest id?

}

1 个答案:

答案 0 :(得分:0)

不,你不能这样使用它。正如MSDN所述:

  

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

它不适用于您,因为您的两个语句不在同一范围内且SCOPE_IDENTITY()不返回任何内容。

在这种情况下使用@@IDENTITY将返回您需要的值:

  

@@ IDENTITY将返回在当前会话的任何范围内插入的最后一个标识列值

你必须小心,但要确保它是正确的身份(在上面的例子中应该没问题。)