Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Bestimmen Sie die letzte hinzugefügte Zeile, wenn kein Index vorhanden ist

Nein, es gibt keine vordefinierte Funktion in SQL Server, die die "letzte Zeile" einer Tabelle zurückgibt.

Per Definition ist eine Tabelle eine ungeordnete Menge von Zeilen. Stellen Sie sich vor, Sie werfen ein Bündel Murmeln in eine Tüte. Öffnen Sie nun die Tüte und fragen Sie jemand anderen, welche Murmel zuerst oder zuletzt hineingekommen ist. Werfen Sie sie jetzt alle auf den Boden, und wenn jemand anderes in den Raum kommt, fragen Sie sie, welche zuerst oder zuletzt auf den Boden gefallen sind. Sie können es nicht tun, weil es keine zusätzlichen Informationen gibt, die etwas über die Reihenfolge aussagen, in die sie gefallen sind.

Dasselbe gilt für eine Tabelle in SQL Server. Sofern Sie keine IDENTITY-Spalte, eine datetime-Spalte oder einen Trigger hinzufügen oder externe Funktionen wie Änderungsnachverfolgung, CDC, Auditing usw. verwenden, kann SQL Server Ihnen nicht mitteilen, welche Zeile zuletzt eingefügt wurde. Sie können denken dass nur eine Auswahl aus der Tabelle ohne eine order by-Klausel sieht wie es Daten in der richtigen Reihenfolge zurückgibt, ist dies reiner Zufall. Hier ist ein Beispiel:

CREATE TABLE dbo.floobat
(
  ID INT PRIMARY KEY, 
  n VARCHAR(16), 
  x CHAR(4000) NOT NULL DEFAULT ''
);

INSERT dbo.floobat(ID,n) VALUES(1,'Sparky');
INSERT dbo.floobat(ID,n) VALUES(2,'Aaron');
INSERT dbo.floobat(ID,n) VALUES(3,'Norbert'); -- <-- inserted last

SELECT ID, n FROM dbo.floobat;

Ok, standardmäßig scheint dies in Ordnung zu sein. Ergebnisse:

ID    n
--    -------
1     Sparky
2     Aaron
3     Norbert -- < yes, this is right

Nehmen wir jedoch eine Änderung an der Tabelle vor, von der Ihre Anwendung oder was auch immer auf die obige Reihenfolge angewiesen ist, keine Ahnung hat:

CREATE NONCLUSTERED INDEX x ON dbo.floobat(n);

SELECT ID, n FROM dbo.floobat;

Oh oh! Ergebnisse:

ID    n
--    -------
2     Aaron
3     Norbert
1     Sparky -- < oops, this is no longer right

Sie müssen sich daran erinnern:Wenn Sie keine ORDER BY-Klausel einfügen, erzählen Sie SQL Server, bei dem Sie sich nicht um die Reihenfolge kümmern. Es wird also der effizienteste Weg gefunden, um die Daten zurückzugeben, und das könnte zu einer unterschiedlichen beobachteten Reihenfolge führen. Durch das Hinzufügen des obigen Index erhielt SQL Server einen besseren Zugriffspfad zum Abrufen der Daten. Es wurde immer noch ein Scan verwendet, aber dieser Index war viel dünner als der gruppierte Index (der nur zwei Zeilen auf einer Seite aufnehmen konnte).

Selbst ohne den Index würden Sie wahrscheinlich nicht die erwarteten Ergebnisse erhalten, da er durch die Tatsache, dass Ihre Cust_ID Spalte wird nicht in aufsteigender Reihenfolge eingefügt. Wenn Sie also 5 einfügen und als 2 , führt die Auswahl ohne ORDER BY tatsächlich zu 2 dann 5 (vorausgesetzt, es gibt keinen besseren Index).

Andere Dinge als das Erstellen (oder Löschen, Ändern oder Neuerstellen) eines Index können die gleiche Art von Änderung im Sortierverhalten bewirken. Wenden Sie ein Service Pack, CU oder Hotfix an; Leeren des Prozedurcaches; Verwendung verschiedener RECOMPILE-Optionen; Aktualisierung von Statistiken; Neustart des Servers; Hinzufügen oder Deaktivieren eines Trace-Flags; Ändern von Serveroptionsoptionen; Verschieben der Datenbank auf einen anderen Server; usw. usw.

Wenn Sie diese Informationen also nachverfolgen möchten, müssen Sie sie auf irgendeine Weise selbst hinzufügen, wie in mehreren der anderen Antworten angesprochen wurde.