在寫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。
新聞熱點
疑難解答