2008-11-19 66 views
4

我以前做像這樣一個簡單的查詢獲得在Access中使用下一個自動編號:如何獲取SQL 2005和ASP中使用的下一個身份號碼?

SELECT RecordNumber, Info FROM myTABLE WHERE 0=1 

這樣我可以創建一個變量來保存currentRecord,它會使用該訪問打算同自動編號使用時,我更新該行

rs.AddNew 
currentRecord = rs("RecordNumber") 

rsInfo = "SomeFormData" & currentRecord 
rs.Update 
rs.Close 

現在這種使用上的MS Access工作,但在SQL 2005,我沒有得到回來的新紀錄產生的身份。 「SomeFormData」被正確插入,SQL中的RecordNumber字段被新的自動編號填充,但我的變量中沒有RecordNumber,我需要它繼續填充相關表單,將數據保存到相關表並且需要保存當前記錄號碼。

問題是,有沒有辦法讓這個獨特的數字回來做一個新的插入?

回答

9

IDENT_CURRENT('tableName')(包括單引號)返回身份對給定表的當前值。該值應該是表中使用的最後分配的標識值。換句話說,除非該行已被刪除,否則您將在表中擁有一個具有此標識值的行。將在下一個INSERT上分配的身份值將是IDENT_CURRENT('tableName') + IDENT_INCR('tableName')

雖然我不建議依賴於此。如果以這種方式預先確定下一個標識值,那麼最終會出現另一個進程使插入實際上在您的ID之前獲得該ID的情況,因此您的進程將使用錯誤的ID值結束。

最好先插入插入(即使您還沒有所有數據),並使用SCOPE_IDENTITY()來獲取分配的實際ID。

您可能想知道爲什麼SCOPE_IDENTITY()IDENT_CURRENT('tableName')更好。顧名思義,前者會給你在當前範圍內分配的最近的身份值(你的批次,你的存儲過程,不管),而後者會給你任何人在桌上分配的最新身份。即使你可能右後'INSERT稱之爲IDENT_CURRENT,它仍然有可能是別人的INSERT之間發生的,和IDENT_CURRENT會給你造成的他們插入,而不是你的,而SCOPE_IDENTITY總會給你你的身份價值。

編輯

另外值得一提的是,SCOPE_IDENTITY()是有利的在類似運作@@IDENTITY。儘管兩者都返回當前批次中分配的最新標識值,但@@IDENTITY受到觸發器內插入的影響; SCOPE_IDENTITY()不是。

+0

謝謝你指出我在正確的方向...... – jesusOmar 2008-11-19 21:32:06

1

SELECT CAST(SCOPE_IDENTITY()AS INT)

相關問題