Sdílet prostřednictvím


TRUNCATE TABLE (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Warehouse v Microsoft Fabricdatabázi SQL v Microsoft Fabric

Odebere všechny řádky z tabulky nebo zadané oddíly tabulky bez protokolování odstranění jednotlivých řádků. TRUNCATE TABLE se podobá příkazu DELETE bez klauzule WHERE; ale TRUNCATE TABLE je rychlejší a používá méně systémových a transakčních protokolů prostředků.

Transact-SQL konvence syntaxe

Syntax

Syntaxe pro SQL Server, Azure SQL Database, Databázi Fabric SQL

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>

Syntaxe pro Microsoft Fabric, Azure Synapse Analytics a Paralelní datový sklad

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

Argumenty

database_name

Název databáze.

schema_name

Název schématu, do kterého tabulka patří.

table_name

Název tabulky, která se má zkrátit nebo ze které se odeberou všechny řádky. table_name musí být literál. table_name nemůže být funkce OBJECT_ID() ani proměnná.

WITH ( PARTITIONS ( { <partition_number_expression> | <rozsah> } [ , ... n ] ) )

platí pro: SQL Server 2016 (13.x) a novější verze.

Určuje oddíly, které se mají zkrátit nebo ze kterých se odeberou všechny řádky. Pokud tabulka není rozdělená na oddíly, WITH PARTITIONS argument vygeneruje chybu. Pokud není zadanou klauzulí WITH PARTITIONS, zkrátí se celá tabulka.

<partition_number_expression> lze zadat následujícími způsoby:

  • Zadejte počet oddílů, například: WITH (PARTITIONS (2))

  • Zadejte čísla oddílů pro několik jednotlivých oddílů oddělených čárkami, například: WITH (PARTITIONS (1, 5))

  • Zadejte rozsahy i jednotlivé oddíly, například: WITH (PARTITIONS (2, 4, 6 TO 8))

  • <range> lze zadat jako čísla oddílů oddělená slovem TO, například: WITH (PARTITIONS (6 TO 8))

Pokud chcete zkrátit dělenou tabulku, musí být tabulky a indexy zarovnané (dělené podle stejné funkce oddílu).

Poznámky

V porovnání s příkazem DELETETRUNCATE TABLE následující výhody:

  • Použije se méně místa transakčního protokolu.

    Příkaz DELETE odebere řádky po jednom a zaznamená položku v transakčním protokolu pro každý odstraněný řádek. TRUNCATE TABLE odebere data uvolněním datových stránek použitých k uložení dat tabulky a zaznamenává pouze přidělení stránek v transakčním protokolu.

  • Obvykle se používá méně zámků.

    Když se příkaz DELETE spustí pomocí zámku řádku, je každý řádek v tabulce uzamčen pro odstranění. TRUNCATE TABLE vždy uzamkne tabulku (včetně zámku schématu (SCH-M) a stránku, ale ne každý řádek.

  • Bez výjimky zůstanou v tabulce nulové stránky.

    Po provedení příkazu DELETE může tabulka stále obsahovat prázdné stránky. Například prázdné stránky v haldě nelze uvolnit bez alespoň výhradního zámku tabulky (LCK_M_X). Pokud operace odstranění nepoužívá zámek tabulky, bude tabulka (halda) obsahovat mnoho prázdných stránek. U indexů může operace odstranění ponechat prázdné stránky za sebou, i když proces čištění na pozadí tyto stránky rychle uvolní.

TRUNCATE TABLE odebere všechny řádky z tabulky, ale struktura tabulky a její sloupce, omezení, indexy atd., zůstanou. Pokud chcete kromě dat odebrat definici tabulky, použijte příkaz DROP TABLE.

Pokud tabulka obsahuje sloupec identity, je čítač pro tento sloupec resetován na počáteční hodnotu definovanou pro sloupec. Pokud nebyla definována žádná počáteční hodnota, použije se výchozí hodnota, 1. Pokud chcete zachovat čítač identity, použijte místo toho DELETE.

Operaci TRUNCATE TABLE lze vrátit zpět v rámci transakce.

Ve službě Fabric SQL Database se zkrácením tabulky odstraní všechna zrcadlená data z Fabric OneLake pro danou tabulku.

Omezení

Nemůžete použít TRUNCATE TABLE u tabulek, které:

  • Odkazuje se na omezení FOREIGN KEY. Můžete zkrátit tabulku, která obsahuje cizí klíč, který odkazuje sám na sebe.

  • Zapojte se do indexovaného zobrazení.

  • Publikují se pomocí transakční replikace nebo slučovací replikace.

  • Jsou časové verze systému.

  • Odkazuje se na omezení EDGE.

Pro tabulky s jednou nebo více z těchto charakteristik použijte místo toho příkaz DELETE.

TRUNCATE TABLE aktivační událost nejde aktivovat, protože operace nezapíše odstranění jednotlivých řádků. Další informace naleznete v tématu CREATE TRIGGER (Transact-SQL).

Ve službě Azure Synapse Analytics a Platform Platform System (PDW):

  • TRUNCATE TABLE není v příkazu EXPLAIN povolený.

  • TRUNCATE TABLE nelze spustit uvnitř transakce.

Zkrácení velkých tabulek

Microsoft SQL Server má možnost vypustit nebo zkrátit tabulky, které mají více než 128 rozsahů bez současného uzamčení ve všech rozsahech potřebných pro pokles.

Dovolení

Minimální požadovaná oprávnění se ALTER na table_name. TRUNCATE TABLE oprávnění výchozí pro vlastníka tabulky, členy pevné role serveru správce systému a db_owner a db_ddladmin pevné databázové role a nejsou přenositelné. Příkaz TRUNCATE TABLE však můžete začlenit do modulu, například uloženou proceduru, a udělit modulu příslušná oprávnění pomocí klauzule EXECUTE AS.

Příklady

A. Zkrácení tabulky

Následující příklad odebere všechna data z tabulky JobCandidate. SELECT příkazy jsou zahrnuty před a za příkazem TRUNCATE TABLE pro porovnání výsledků.

USE AdventureWorks2022;
GO

SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;
GO

TRUNCATE TABLE HumanResources.JobCandidate;
GO

SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;
GO

B. Zkrácení oddílů tabulky

platí pro: SQL Server 2016 (13.x) a novější verze.

Následující příklad zkrátí zadané oddíly dělené tabulky. Syntaxe WITH (PARTITIONS (2, 4, 6 TO 8)) způsobí zkrácení čísel oddílů 2, 4, 6, 7 a 8.

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

C. Vrácení operace zkrácení zpět

Následující příklad ukazuje, že operace TRUNCATE TABLE uvnitř transakce lze vrátit zpět.

  1. Vytvořte testovací tabulku se třemi řádky.

    USE [tempdb];
    GO
    CREATE TABLE TruncateTest (ID INT IDENTITY (1, 1) NOT NULL);
    GO
    INSERT INTO TruncateTest DEFAULT VALUES;
    GO 3
    
  2. Před zkrácením zkontrolujte data.

    SELECT * FROM TruncateTest;
    GO
    
  3. Zkrátte tabulku v rámci transakce a zkontrolujte počet řádků.

    BEGIN TRANSACTION;
    
    TRUNCATE TABLE TruncateTest;
    
    SELECT * FROM TruncateTest;
    

    Vidíte, že tabulka je prázdná.

  4. Vrácení transakce zpět a kontrola dat.

    ROLLBACK TRANSACTION;
    GO
    
    SELECT * FROM TruncateTest;
    GO
    

    Zobrazí se všechny tři řádky.

  5. Vyčistěte tabulku.

    DROP TABLE TruncateTest;
    GO
    
  • DELETE (Transact-SQL)
  • DROP TABLE (Transact-SQL)
  • CREATE TABLE (Transact-SQL) IDENTITY (vlastnost)