2013-11-02 71 views
0

我試圖讓最後一個ID插入到表中。 我用Sql服務器 - 如何獲取最後一個ID插入到表

SELECT IDENT_CURRENT('TABLE') 

但問題是,它不返回最後插入的ID,它返回的最大插入ID。

例如,如果我這樣做:

INSERT INTO 'TABLA' (ID) VALUES (100) 

SELECT IDENT_CURRENT('TABLE') returns 100 

但當時如果我做

INSERT INTO 'TABLA' (ID) VALUES (50) 

SELECT IDENT_CURRENT('TABLE') returns 100 

,我希望得到50

我需要一個特定的表的ID,並我生成的ID是dinamically,所以它不是身份證 我該怎麼辦?

+1

'IDENT_CURRENT'預計會自動增加一列。如果您可以手動插入ID,則您未使用自動增量編號,或者您的自動增量已關閉(使用'SET IDENTITY_INSERT')。 – SchmitzIT

+0

是的,我需要將IDENTITY_INSERT設置爲Off,因爲我需要在插入ID之前生成ID。 –

+3

- 這總是一個壞主意。自動生成的ID應該完全相同。如果您需要手動生成身份證號碼,長遠來看,這會導致行政頭痛。無論如何,這意味着你根本無法依靠IDENT_CURRENT來檢索最後插入的ID。我建議您查看需要您覆蓋自動識別的業務流程。否則請與Phil Sandlers的解決方案一起。 – SchmitzIT

回答

1
SELECT SCOPE_IDENTITY() 

將返回當前會話中插入的最後一個值。
編輯
那麼你正在做的是去只是確保了ID列是標識列,IDENT_CURRENT(「TABLE_NAME」)的最佳方式,@@ IDENTITY和SCOPE_IDENTITY()返回由生成的最後一個值標識列。
如果ID列不是一個標識列,所有這些函數將返回NULL。

+0

我需要特定表格的最後一個插入的ID –

+0

@mar_sanbas我已經更新了我的回答,請看一下。 –

5

從您的代碼看來,ID不是一個標識(自動增量)列,因此IDENT_CURRENT不會執行您期望的操作。

如果你想找到最後插入行,您將需要一個代表插入時間日期時間列,然後你可以這樣做:

SELECT TOP 1 [ID] FROM TABLEA ORDER BY [InsertedDate] DESC 

編輯:一些額外的注意事項:

  • 你InsertedDate列應該有一個默認設置爲GETDATE(),除非你的應用程序,存儲的特效或者任何你用它來執行插入將負責設定值
  • 我之所以說你的ID不身份/自動增量是因爲您正在向其中插入一個值。這隻有在您關閉標識插入時纔有可能。
+0

是的,我關閉身份插入,因爲我需要在發送插入之前生成ID。這是一個好主意,但我有限制,並且我無法保存插入的日期 –

+1

如果表中沒有任何內容表示插入的日期或順序,則無法可靠地找到插入的第一行或最後一行,很簡單。 –

+1

@mar_sanbas如果你從客戶端產生的價值,爲什麼它是一個標識列呢?如果你通過價值,你爲什麼需要查看它?難道你不知道嗎,因爲你剛剛通過了它? –

1

SQL Server不會跟蹤插入到IDENTITY列的最後一個值,特別是當您使用SET IDENTITY_INSERT ON;時。但是,如果您手動指定要插入的值,則不需要SQL Server來告訴您它是什麼。您已經知道它是什麼,因爲您只是在INSERT聲明中明確指定了它。

如果你不能讓你的代碼,以保持它剛插入價值的軌道,並且不能更改表格與CURRENT_TIMESTAMP默認值的DateInserted列(這將讓你看到哪一行最後插入),也許你可以添加一個觸發器到記錄所有插入的表。

相關問題