insert后获得自动插入的id

    在写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 into Stu (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。