2012-04-19 43 views
2

我注意到SQL跟蹤最新的標識(字段在每次創建新記錄時會自動增加)。我想使用C#從表中檢索最新的標識。不幸的是,大部分時間表都是空的(一段時間後記錄被寫入並刪除,所以表格常常是空的)。 這是可能在C#SQL API的範圍內做到這一點,或者我必須創建一個存儲過程來檢索這個嗎?從空表獲取最新標識(如ID)SQL

enter image description here

爲了更好地解釋。如果上面的行被刪除,下一個記錄的下一個ID號將是32.我想在寫入記錄之前檢索32,在表空的情況下。

+0

'SELECT LAST_INSERT_ID()+ 1'? – RobertPitt 2012-04-19 14:40:36

+0

如果有兩個對下一個ID的調用會發生什麼情況,那麼分配的下一個ID可能不是您在編寫記錄時所期望的。 – Zachary 2012-04-19 14:41:00

+0

很多在這篇文章中的好信息:http://stackoverflow.com/questions/567171/scope-identity-vs-ident-current – mgnoonan 2012-04-19 14:43:40

回答

4
SELECT IDENT_CURRENT('table_name')+1; 

IDENT_CURRENT返回爲任何會話和範圍的具體 表生成的最後一個標識值。

http://msdn.microsoft.com/en-us/library/ms175098.aspx


然而,儘管這顯示下一個ID將是什麼,這並不意味着它會自己進入下一個ID。其他人可以在你之前創造新的記錄。

總之,沒有辦法返回你將要插入的東西的價值。

+0

+1因爲它回答了這個問題,但你可能想要注意它返回的數字可能不是您要插入的下一行的ID(因爲其他人在您之前插入)。 – dasblinkenlight 2012-04-19 14:42:52

+0

@dasblinkenlight好的,更新的答案 – Curt 2012-04-19 14:46:04

+0

這對我需要的東西完美地工作。非常感謝你! – 2012-04-19 14:49:11

0

這將是下面的查詢

DBCC CHECKIDENT( '[表名]',NORESEED)

+0

您應該包含NORESEED參數;否則這也將潛在地改變身份值(在當前身份和最大身份值不同的情況下)。 – MartW 2012-04-19 14:47:43

0

萬一增量不是常規的 「1」:

SELECT IDENT_CURRENT('mytable') + IDENT_INCR('mytable') 

當然,所有這些都依賴於一致填充的身份列,即不會搞亂手動插入或重新播種。如果您要直接使用此ID進行插入,Curt已經提到了可能出現的併發問題。