IDENT_CURRENT 獲取主表當前自增的ID值

 項目中要用到一個功能:主表主鍵爲自增長,要求在插入主表數據前先獲得主表要插入數據的主鍵ID值,用在插入子表時獲取主鍵ID。在網上搜了一下,發現SELECT IDENT_CURRENT(TableName)這個語句可以實現。可是後來發現這個語句存在一個致命問題。

 

問題如下:(表中數據都爲空)

(情況一)

當新建表數據爲空時, IDENT_CURRENT(TableName)返回值爲1.這時主表數據插入成功後,主表自增長列會自動賦值 1 

(情況二)

   當新增一條數據並刪除後, IDENT_CURRENT(TableName)返回值還是1,可是現在主表插入成功後,主表自增長列會自動賦值2,而插入子表的主表ID還是1,這樣就會導致主表和子表的關聯字段不一致。

 

  在網上找了幾個解決方案:

1.     DBCC CHECKIDENT (tableName, RESEED, 1)

重置表的標示種子爲1,可是在‘情況二’下,數據庫還是會以 2 賦給主表ID字段,而不是1

2.     DBCC CHECKIDENT (tableName)

情況一下輸出爲:

檢查標識信息當前標識值'null',當前列值'null'

情況二下輸出爲:

檢查標識信息當前標識值'1',當前列值'1'

雖然根據輸出信息不同,當數據表空時可以判斷是‘情況一’還是‘情況二’,可是在C#中無論用ExecuteNonQuery, ExecuteScalar還是datatable返回的都是空數據

 

    鬱悶了一個下午始終沒有找到答案,最後發現用下面的方法可以實現在子表中插入主表最新記錄的ID值。 直接將CONVERT(INT,IDENT_CURRENT('SalesInfo'))作爲主鍵ID的值添加到子表sql語句即可

INSERT INTO PayInfo(SID) VALUES(CONVERT(INT,IDENT_CURRENT('STable')))


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章