it-swarm.com.de

Wie extrahiere ich die zuletzt eingefügte Zeile in SQL Server?

Gibt es eine Möglichkeit, die zuletzt eingefügte Zeile in SQL Server zu extrahieren, wenn eine Einfügeanweisung ausgeführt wird und eine oder mehrere Zeilen in die Tabelle eingefügt werden?

7
user2493976

Per Definition ist eine Tabelle eine ungeordnete Reihe von Zeilen ( siehe # 3 hier ). Es gibt keine Möglichkeit, SQL Server zu fragen, welche Zeile zuletzt eingefügt wurde es sei denn Sie tun dies im selben Stapel wie die Einfügung. Wenn Ihre Tabelle beispielsweise eine IDENTITY -Spalte enthält, können Sie SCOPE_IDENTITY() verwenden (verwenden Sie niemals @@IDENTITY, Da dies bei Ihnen unzuverlässig sein kann Trigger zur Quelltabelle hinzugefügt haben oder jemals hinzufügen werden):

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

Im Allgemeinen können Sie die OUTPUT -Klausel verwenden, die nicht auf einer IDENTITY -Spalte basiert (es jedoch schwierig macht, zu identifizieren, welche Zeile (n) die Klausel identifiziert, wenn keine vorhanden ist PK):

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

Wenn Sie nicht über denselben Stapel sprechen, können Sie die zuletzt eingefügte Zeile nur mithilfe einer Datums-/Zeitspalte identifizieren, in der der Zeitstempel des Einfügens aufgezeichnet wird. Ansonsten ist es so, als hätten Sie eine Tüte Murmeln auf dem Boden geleert und dann jemanden gebeten, den Raum zu betreten und herauszufinden, welcher zuletzt auf den Boden gefallen ist.

Sie könnten versucht oder sogar geraten sein, die Funktion IDENT_CURRENT() zu verwenden, aber Ich erkläre hier warum dies auch unzuverlässig ist.

Sie können eine Spalte hinzufügen, um dies in Zukunft zu verfolgen:

ALTER TABLE dbo.table ADD DateInserted DEFAULT CURRENT_TIMESTAMP;

Jetzt können Sie die zuletzt eingefügten Zeilen finden, indem Sie einfach:

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

(Wenn Sie keine Krawatten möchten, können Sie dem ORDER BY Eine Spalte zum Brechen von Krawatten hinzufügen oder einfach RANK() in ROW_NUMBER() ändern, wenn Sie dies nicht tun. Es ist mir egal, welche der gebundenen Reihen du bekommst.)

Sie können davon ausgehen, dass die zuletzt eingefügte Zeile der höchste Identitätswert ist, dies ist jedoch nicht unbedingt der Fall. Die Identität kann neu gesetzt und mit SET IDENTITY_INSERT ON; Überschrieben werden.

16
Aaron Bertrand