項目中要用到一個功能:主表主鍵爲自增長,要求在插入主表數據前先獲得主表要插入數據的主鍵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')))