TRUNCATE TABLE (Transact-SQL)TRUNCATE TABLE (Transact-SQL)

Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database JaVerwaltete Azure SQL-InstanzAzure SQL Managed InstanceYesVerwaltete Azure SQL-InstanzAzure SQL Managed Instance JaAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics JaParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data WarehouseAnwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database JaVerwaltete Azure SQL-InstanzAzure SQL Managed InstanceYesVerwaltete Azure SQL-InstanzAzure SQL Managed Instance JaAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics JaParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse

Entfernt alle Zeilen oder angegebenen Partitionen einer Tabelle, ohne die einzelnen Löschungen zu protokollieren.Removes all rows from a table or specified partitions of a table, without logging the individual row deletions. TRUNCATE TABLE entspricht DELETE ohne WHERE-Klausel. TRUNCATE TABLE ist jedoch schneller und verwendet weniger Systemressourcen und Ressourcen für die Transaktionsprotokollierung.TRUNCATE TABLE is similar to the DELETE statement with no WHERE clause; however, TRUNCATE TABLE is faster and uses fewer system and transaction log resources.

Symbol für Themenlink Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

-- Syntax for SQL Server and Azure SQL Database  
  
TRUNCATE TABLE   
    { database_name.schema_name.table_name | schema_name.table_name | table_name }  
    [ WITH ( PARTITIONS ( { <partition_number_expression> | <range> }   
    [ , ...n ] ) ) ]  
[ ; ]  
  
<range> ::=  
<partition_number_expression> TO <partition_number_expression>  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
TRUNCATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }  
[;]  

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 oder früher finden Sie unter Dokumentation zu früheren Versionen.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

ArgumenteArguments

database_namedatabase_name
Der Name der Datenbank.Is the name of the database.

schema_nameschema_name
Der Name des Schemas, zu dem die Tabelle gehört.Is the name of the schema to which the table belongs.

table_nametable_name
Der Name der Tabelle, die gekürzt werden soll oder aus der alle Zeilen entfernt werden.Is the name of the table to truncate or from which all rows are removed. table_name muss ein Literal sein.table_name must be a literal. table_name kann nicht die OBJECT_ID() -Funktion oder eine Variable sein.table_name cannot be the OBJECT_ID() function or a variable.

WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) )WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) )
Gilt für: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis zur aktuellen Version)Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version)

Gibt die Partitionen an, die abgeschnitten oder aus denen alle Zeilen entfernt werden sollen.Specifies the partitions to truncate or from which all rows are removed. Wenn die Tabelle nicht partitioniert ist, erzeugt das Argument WITH PARTITIONS einen Fehler.If the table is not partitioned, the WITH PARTITIONS argument will generate an error. Wenn die WITH PARTITIONS-Klausel nicht bereitgestellt wird, wird die gesamte Tabelle abgeschnitten.If the WITH PARTITIONS clause is not provided, the entire table will be truncated.

<partition_number_expression> kann wie folgt angegeben werden:<partition_number_expression> can be specified in the following ways:

  • Geben Sie die Nummer einer Partition an, beispielsweise: WITH (PARTITIONS (2))Provide the number of a partition, for example: WITH (PARTITIONS (2))

  • Geben Sie die Partitionsnummern mehrerer einzelner Partitionen durch Kommas getrennt an, beispielsweise: WITH (PARTITIONS (1, 5))Provide the partition numbers for several individual partitions separated by commas, for example: WITH (PARTITIONS (1, 5))

  • Geben Sie sowohl Bereiche als auch einzelne Partitionen an, beispielsweise: WITH (PARTITIONS (2, 4, 6 TO 8))Provide both ranges and individual partitions, for example: WITH (PARTITIONS (2, 4, 6 TO 8))

  • Für <range> können durch das Wort TO getrennte Partitionsnummern angegeben werden, z. B. WITH (PARTITIONS (6 TO 8)).<range> can be specified as partition numbers separated by the word TO, for example: WITH (PARTITIONS (6 TO 8))

Um eine partitionierte Tabelle abzuschneiden, müssen die Tabelle und Indizes ausgerichtet werden (partitioniert auf dieselbe Partitionsfunktion).To truncate a partitioned table, the table and indexes must be aligned (partitioned on the same partition function).

BemerkungenRemarks

TRUNCATE TABLE bietet im Vergleich zur DELETE-Anweisung die folgenden Vorteile:Compared to the DELETE statement, TRUNCATE TABLE has the following advantages:

  • Es wird weniger Speicherplatz für die Transaktionsprotokolle verwendet.Less transaction log space is used.

    Die DELETE-Anweisung entfernt jede Zeile einzeln und protokolliert jede Löschung einzeln im Transaktionsprotokoll.The DELETE statement removes rows one at a time and records an entry in the transaction log for each deleted row. Beim Entfernen der Daten mit TRUNCATE TABLE werden die zur Speicherung der Tabellendaten verwendeten Datenseiten freigegeben, und nur die Freigaben der Datenseiten werden im Transaktionsprotokoll aufgezeichnet.TRUNCATE TABLE removes the data by deallocating the data pages used to store the table data and records only the page deallocations in the transaction log.

  • In der Regel werden weniger Sperren verwendet.Fewer locks are typically used.

    Wenn die DELETE-Anweisung mithilfe einer Zeilensperre ausgeführt wird, wird jede Zeile in der Tabelle zum Löschen gesperrt.When the DELETE statement is executed using a row lock, each row in the table is locked for deletion. Durch TRUNCATE TABLE werden immer die Tabelle (einschließlich einer Schemasperre (SCH-M)) und die Seite, aber nicht die einzelnen Zeilen gesperrt.TRUNCATE TABLE always locks the table (including a schema (SCH-M) lock) and page but not each row.

  • Nullseiten verbleiben ausnahmslos in der Tabelle.Without exception, zero pages are left in the table.

    Nach dem Ausführen einer DELETE-Anweisung kann die Tabelle weiterhin leere Seiten enthalten.After a DELETE statement is executed, the table can still contain empty pages. Die Zuordnung von leeren Seiten in einem Heap kann z. B. nur aufgehoben werden, wenn mindestens eine exklusive (LCK_M_X) Tabellensperre vorhanden ist.For example, empty pages in a heap cannot be deallocated without at least an exclusive (LCK_M_X) table lock. Wenn der Löschvorgang keine Tabellensperre verwendet, enthält die Tabelle (der Heap) viele leere Seiten.If the delete operation does not use a table lock, the table (heap) will contain many empty pages. 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.For indexes, the delete operation can leave empty pages behind, although these pages will be deallocated quickly by a background cleanup process.

TRUNCATE TABLE entfernt alle Zeilen aus einer Tabelle, die Tabellenstruktur (Spalten, Einschränkungen, Indizes usw.) dagegen bleibt erhalten.TRUNCATE TABLE removes all rows from a table, but the table structure and its columns, constraints, indexes, and so on remain. Verwenden Sie die DROP TABLE-Anweisung, um neben den dazugehörigen Daten auch die Tabellendefinition zu entfernen.To remove the table definition in addition to its data, use the DROP TABLE statement.

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.If the table contains an identity column, the counter for that column is reset to the seed value defined for the column. Wenn kein Ausgangswert definiert wurde, wird der Standardwert 1 verwendet.If no seed was defined, the default value 1 is used. Falls Sie den Wert des Identitätszählers erhalten möchten, verwenden Sie stattdessen DELETE.To retain the identity counter, use DELETE instead.

Hinweis

Für einen TRUNCATE TABLE-Vorgang kann ein Rollback ausgeführt werden.A TRUNCATE TABLE operation can be rolled back.

BeschränkungenRestrictions

TRUNCATE TABLE kann nicht in Tabellen verwendet werden, für die Folgendes gilt:You cannot use TRUNCATE TABLE on tables that:

  • Auf die Tabelle wird mit einer FOREIGN KEY-Einschränkung verwiesen.Are referenced by a FOREIGN KEY constraint. Sie können eine Tabelle abschneiden, die über einen Fremdschlüssel verfügt, der auf sich selbst verweist.You can truncate a table that has a foreign key that references itself.

  • Die Tabelle ist an einer indizierten Sicht beteiligt.Participate in an indexed view.

  • Die Veröffentlichung wird mithilfe einer Transaktionsreplikation oder Mergereplikation vorgenommen.Are published by using transactional replication or merge replication.

  • Es handelt sich um eine temporale Tabelle.Are system-versioned temporal.

  • Auf die Tabelle wird durch eine EDGE-Einschränkung verwiesen.Are referenced by an EDGE constraint.

Verwenden Sie für Tabellen, die ein oder mehrere dieser Eigenschaften aufweisen, stattdessen die DELETE-Anweisung.For tables with one or more of these characteristics, use the DELETE statement instead.

TRUNCATE TABLE kann keinen Trigger aktivieren, da der Vorgang keine einzelnen Zeilenlöschungen protokolliert.TRUNCATE TABLE cannot activate a trigger because the operation does not log individual row deletions. Weitere Informationen finden Sie unter CREATE TRIGGER (Transact-SQL).For more information, see CREATE TRIGGER (Transact-SQL).

In Azure Synapse Analytics (SQL Data Warehouse)Azure Synapse Analytics (SQL Data Warehouse) und Parallel Data WarehouseParallel Data Warehouse:In Azure Synapse Analytics (SQL Data Warehouse)Azure Synapse Analytics (SQL Data Warehouse) and Parallel Data WarehouseParallel Data Warehouse:

  • TRUNCATE TABLE ist in der EXPLAIN-Anweisung nicht zulässig.TRUNCATE TABLE is not allowed within the EXPLAIN statement.

  • TRUNCATE TABLE kann nicht innerhalb einer Transaktion ausgeführt werden.TRUNCATE TABLE cannot be ran inside of a transaction.

Abschneiden von großen TabellenTruncating Large Tables

In MicrosoftMicrosoft SQL ServerSQL Server können Tabellen gelöscht oder abgeschnitten werden, die mehr als 128 Blöcke enthalten, ohne simultane Sperren für alle Blöcke aufrechtzuerhalten, die für den Löschvorgang erforderlich sind.MicrosoftMicrosoft SQL ServerSQL Server has the ability to drop or truncate tables that have more than 128 extents without holding simultaneous locks on all the extents required for the drop.

BerechtigungenPermissions

Die mindestens erforderliche Berechtigung ist ALTER für table_name.The minimum permission required is ALTER on table_name. TRUNCATE TABLE-Berechtigungen werden standardmäßig dem Tabellenbesitzer, den Mitgliedern der festen Serverrolle sysadmin sowie den Mitgliedern der festen Datenbankrollen db_owner und db_ddladmin erteilt. Diese Berechtigungen sind nicht übertragbar.TRUNCATE TABLE permissions default to the table owner, members of the sysadmin fixed server role, and the db_owner and db_ddladmin fixed database roles, and are not transferable. 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.However, you can incorporate the TRUNCATE TABLE statement within a module, such as a stored procedure, and grant appropriate permissions to the module using the EXECUTE AS clause.

BeispieleExamples

A.A. Abschneiden einer TabelleTruncate a Table

Im folgenden Beispiel werden alle Daten aus der JobCandidate-Tabelle entfernt.The following example removes all data from the JobCandidate table. SELECT-Anweisungen werden vor und nach der TRUNCATE TABLE-Anweisung eingeschlossen, um die Ergebnisse zu vergleichen.SELECT statements are included before and after the TRUNCATE TABLE statement to compare results.

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

B.B. Tabellenpartition abschneidenTruncate Table Partitions

Gilt für: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis zur aktuellen Version)Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version)

Im folgende Beispiel werden die angegebenen Partitionen einer partitionierten Tabelle abgeschnitten.The following example truncates specified partitions of a partitioned table. Mit der Syntax WITH (PARTITIONS (2, 4, 6 TO 8)) werden die Partitionen 2, 4, 6, 7 und 8 abgeschnitten.The WITH (PARTITIONS (2, 4, 6 TO 8)) syntax causes partition numbers 2, 4, 6, 7, and 8 to be truncated.

TRUNCATE TABLE PartitionTable1   
WITH (PARTITIONS (2, 4, 6 TO 8));  
GO  

Weitere InformationenSee Also

DELETE (Transact-SQL) DELETE (Transact-SQL)
DROP TABLE (Transact-SQL) DROP TABLE (Transact-SQL)
IDENTITY (Property) (Transact-SQL)IDENTITY (Property) (Transact-SQL)