Sql-Server

如何提取 SQL Server 中最後插入的行?

  • May 7, 2020

執行插入語句時,向表中插入一行或多行,有沒有辦法提取 SQL Server 中最後插入的行?

根據定義,表是一個無序的行包(請參見此處的#3)。除非您在與插入相同的批處理中這樣做,否則無法詢問 SQL Server 最後插入了哪一行。例如,如果您的表有一個IDENTITY列,您可以使用SCOPE_IDENTITY()(永遠不要使用@@IDENTITY,因為如果您已經或將要向源表添加觸發器,這可能是不可靠的):

INSERT dbo.table(column) SELECT 1;
SELECT SCOPE_IDENTITY();

更一般地說,您可以使用OUTPUT不依賴於IDENTITY列的子句(但如果沒有 PK,仍然難以辨識子句標識的行):

INSERT dbo.table(column) OUTPUT inserted.* SELECT 1;

如果您不是在談論同一批次,那麼辨識插入的最後一行的唯一真正方法是使用記錄插入時間戳的日期/時間列。否則就像你在地板上倒了一袋彈珠,然後讓某人進入房間並確定哪個彈珠最後撞到地板上。

您可能會受到誘惑甚至建議使用該IDENT_CURRENT()功能,但我在這裡解釋了為什麼這也不可靠。

您可以添加一列來跟踪這一點:

ALTER TABLE dbo.table ADD DateInserted DEFAULT CURRENT_TIMESTAMP;

現在您可以通過以下方式找到插入的最後一行:

;WITH x AS (SELECT *, r = RANK() OVER (ORDER BY DateInserted DESC)
  FROM dbo.table)
SELECT * FROM x WHERE r = 1;

(如果您不想要平局,您可以在 中添加一個打破平局的列ORDER BY,或者您可以簡單地更改RANK()為,ROW_NUMBER()如果您不關心您獲得哪些平局行。)

您可能會假設插入的最後一行是最高標識值,但情況不一定如此。身份可以重新播種,也可以使用 覆蓋SET IDENTITY_INSERT ON;

引用自:https://dba.stackexchange.com/questions/53071