在写CRUD的时候,对于有自动增长列的表(Id自增),我们在insert 以后想要得到自动增长的id,该怎么做?
由于insert的时候,Id是在数据库自动增长的,所以我们没法获得反馈回来的Id,而如果通过insert后,再select一次又浪费时间,这个时候我们应该怎么做呢?
可以使用output inserted.Id
假设表结构如下:create table Stu( id int identity, Varchar name)
//获得新增行的自动增长列的语句
insert into Stu(name) output inserted.id values ('小明‘)
执行该语句后返回insert后的自增Id
output 是sql server2005的新特性,可以从数据修改语句中返回输出,可以看作是“返回结果的DML”2005之后 Insert,Delete,Update语句 均支持Output语句,在Output语句中可以引用inserted和deleted。使用方法同触发器类似。使用该方法最大弊端就是需要指定主键。output Inserted.要返回的值。
另:在遇到该问题的时候,也查阅到@@IDENTITY 和SCOPE_IDENTITY()也可以获取自增的Id字段。
例:
insert intoStu (name) values ('小明‘)select @@IDENTITY
用select @@identity得到上一次插入记录时自动产生的ID
但需要注意的是:@@IDENTITY 它总是获取最后一条变更数据的自增字段的值,而忽略了进行变更操作所在的范围约束。(作用全局范围内)
有什么影响?比如:我在主数据表A上定义一个Insert触发器,但A表Insert一条数据时,同时在记录表B中Insert一条数据,这时我使用select @@identity返回的就是B中的自增Id了。但我要的是A的Id,这时就出现问题了。(因为@@IDENTITY是取全局操作的最后一步操作所产生的自增域的值)
而使用SCOPE_IDENTITY()也是得到最后一条自增域的值,但是它是仅限在一个操作范围之内,即上例获取的就是A表这个范围内的Id。
新闻热点
疑难解答