string commandText = "insert into Posts(Category,Title,Detail)values(1,'11','22') select @@IDENTITY"; int id = (int)SqlHelper.ExecuteScalar(CommandType.Text, commandText);
insert into Posts(Category,Title,Detail)values(1,'11','22'); select @@IDENTITY
insert 语句
加入之后再
select Max(id)
string commandText = "insert into Posts(Category,Title,Detail)values(1,'11','22') select @@IDENTITY";
int id = (int)SqlHelper.ExecuteScalar(CommandType.Text, commandText);
-----------------------------------------
癸巳〖蛇〗 丁巳月 壬寅日
二〇一三年 四月 廿七|芒种
双子座 庚申时
MSSQL这个IDENTITY相当的讨厌。最恨在系统中遇到这种类型的主键。
有3个方法
1、select @@identity :返回当前会话的所有作用域中的任何表最后生成的标识值(全局的,如果你插入表a,又插入表b,此时返回b表的id)
2、select SCOPE_IDENTITY() :返回当前会话和当前作用域中的任何表最后生成的标识值 (是当前会话的,如果你插入表a,又插入表b,此时返回b表的id)
3、select ident_current(‘表名'):返回特定表最后生成的标识值 (不受作用域和会话的限制)
在实际应用中,使用第3种方式在并发比较大的时候,可能会造成问题,例如下面的代码:
insert into table1(xxx) values(xxx); select ident_current('table1');
上面这句sql,在并发用户很多的时候,很有可能返回的并不是刚刚插入的那个id,而有可能是其它线程插入的id(因为ident_current是跨所有会话的)
参考:http://beinet.cn/Blog/BlogShow.aspx?id=0ff6e08a-176e-48dc-9baf-f3c6daa4fa91