TRUNCATE TABLE (Transact-SQL)

Entfernt alle Zeilen aus einer Tabelle, ohne die einzelnen Löschungen zu protokollieren. TRUNCATE TABLE entspricht DELETE ohne WHERE-Klausel. TRUNCATE TABLE ist jedoch schneller und verwendet weniger Systemressourcen und Ressourcen für die Transaktionsprotokollierung.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

TRUNCATE TABLE 
    [ { database_name.[ schema_name ]. | schema_name . } ]
    table_name
[ ; ]

Argumente

  • database_name
    Der Name der Datenbank.

  • schema_name
    Der Name des Schemas, zu dem die Tabelle gehört.

  • table_name
    Der Name der Tabelle, die gekürzt werden soll oder aus der alle Zeilen entfernt werden.

Hinweise

TRUNCATE TABLE bietet im Vergleich zur DELETE-Anweisung die folgenden Vorteile:

  • Es wird weniger Speicherplatz für die Transaktionsprotokolle verwendet.

    Die DELETE-Anweisung entfernt jede Zeile einzeln und protokolliert jede Löschung einzeln im Transaktionsprotokoll. Beim Entfernen der Daten mit TRUNCATE TABLE wird die Zuordnung der zur Speicherung der Tabellendaten verwendeten Datenseiten aufgehoben, und nur die Zuordnungsaufhebungen der Datenseiten werden im Transaktionsprotokoll aufgezeichnet.

  • In der Regel werden weniger Sperren verwendet.

    Wenn die DELETE-Anweisung mithilfe einer Zeilensperre ausgeführt wird, wird jede Zeile in der Tabelle zum Löschen gesperrt. TRUNCATE TABLE sperrt immer die Tabelle und die Seite, nicht aber einzelne Zeilen.

  • Nullseiten verbleiben ausnahmslos in der Tabelle.

    Nach dem Ausführen einer DELETE-Anweisung kann die Tabelle weiterhin leere Seiten enthalten. Die Zuordnung von leeren Seiten in einem Heap kann z. B. nur aufgehoben werden, wenn mindestens eine exklusive (LCK_M_X) Tabellensperre vorhanden ist. Wenn der Löschvorgang keine Tabellensperre verwendet, enthält die Tabelle (der Heap) viele leere Seiten. In Bezug auf Indizes können durch den Löschvorgang leere Seiten verbleiben, obwohl die Zuordnung dieser Seiten durch einen Cleanupprozess im Hintergrund schnell aufgehoben wird.

TRUNCATE TABLE entfernt alle Zeilen aus einer Tabelle, die Tabellenstruktur (Spalten, Einschränkungen, Indizes usw.) dagegen bleibt erhalten. Verwenden Sie die DROP TABLE-Anweisung, um neben den dazugehörigen Daten auch die Tabellendefinition zu entfernen.

Wenn die Tabelle eine Identitätsspalte enthält, wird der Zähler für diese Spalte auf den Ausgangswert zurückgesetzt, der für die Spalte definiert ist. Wenn kein Ausgangswert definiert wurde, wird der Standardwert 1 verwendet. Falls Sie den Wert des Identitätszählers erhalten möchten, verwenden Sie stattdessen DELETE.

Einschränkungen

Sie können TRUNCATE TABLE nicht für Tabellen verwenden, für die Folgendes gilt:

  • Auf die Tabelle wird mit einer FOREIGN KEY-Einschränkung verwiesen. (Sie können eine Tabelle abschneiden, die einen Fremdschlüssel mit einem Verweis auf sich aufweist.)

  • Die Tabelle ist an einer indizierten Sicht beteiligt.

  • Die Veröffentlichung wird mithilfe einer Transaktionsreplikation oder Mergereplikation vorgenommen.

Verwenden Sie für Tabellen, die ein oder mehrere dieser Eigenschaften aufweisen, stattdessen die DELETE-Anweisung.

TRUNCATE TABLE kann keinen Trigger aktivieren, da der Vorgang keine einzelnen Zeilenlöschungen protokolliert. Weitere Informationen finden Sie unter CREATE TRIGGER (Transact-SQL).

Abschneiden von großen Tabellen

MicrosoftSQL Server weist die Funktionalität auf, Tabellen zu löschen oder abzuschneiden, die mehr als 128 Blöcke haben, ohne simultane Sperren für alle Blöcke aufrechtzuerhalten, die für den Löschvorgang erforderlich sind. Weitere Informationen finden Sie unter Löschen und Neuerstellen großer Objekte.

Berechtigungen

Die mindestens erforderliche Berechtigung ist ALTER für table_name. Die Berechtigungen für TRUNCATE TABLE liegen standardmäßig beim Tabellenbesitzer, bei Mitgliedern der festen Serverrolle sysadmin und der festen Datenbankrollen db_owner und db_ddladmin. Die Berechtigungen sind nicht übertragbar. Sie können jedoch die TRUNCATE TABLE-Anweisung innerhalb eines Moduls einbinden, z. B. eine gespeicherte Prozedur, und mit der EXECUTE AS-Klausel für das Modul die passenden Berechtigungen erteilen. Weitere Informationen finden Sie unter Verwenden von EXECUTE AS zum Erstellen benutzerdefinierter Berechtigungssätze.

Beispiele

Mit dem folgenden Beispiel werden alle Daten aus der JobCandidate-Tabelle entfernt. SELECT-Anweisungen werden vor und nach der TRUNCATE TABLE-Anweisung eingeschossen, um die Ergebnisse zu vergleichen.

USE AdventureWorks;
GO
SELECT COUNT(*) AS BeforeTruncateCount 
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount 
FROM HumanResources.JobCandidate;
GO