TRUNCATE TABLE (Transact-SQL)

Rimuove tutte le righe da una tabella senza registrare le eliminazioni delle singole righe. TRUNCATE TABLE è simile all'istruzione DELETE senza clausola WHERE. L'istruzione TRUNCATE TABLE è tuttavia più rapida e utilizza un numero minore di risorse di sistema e del log delle transazioni.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

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

Argomenti

  • database_name
    Nome del database.

  • schema_name
    Nome dello schema a cui appartiene la tabella.

  • table_name
    Nome della tabella da troncare o dalla quale vengono rimosse tutte le righe.

Osservazioni

Rispetto all'istruzione DELETE, TRUNCATE TABLE presenta i vantaggi seguenti:

  • Richiede una minore quantità di spazio del log delle transazioni.

    L'istruzione DELETE rimuove una riga alla volta e registra una voce nel log delle transazioni per ogni riga eliminata. L'istruzione TRUNCATE TABLE rimuove i dati tramite la deallocazione delle pagine di dati utilizzate per archiviare i dati della tabella. Solo le deallocazioni di pagina vengono registrate nel log delle transazioni.

  • In genere utilizza meno blocchi.

    Quando l'istruzione DELETE viene eseguita tramite un blocco di riga, ogni riga nella tabella viene bloccata per l'eliminazione. TRUNCATE TABLE blocca sempre la tabella e la pagina, ma non ogni riga.

  • Senza eccezione, le pagine di zeri vengono mantenute nella tabella.

    Dopo l'esecuzione di una istruzione DELETE, la tabella può ancora contenere pagine vuote. Ad esempio, le pagine vuote in un heap non possono essere deallocate senza almeno un blocco di tabella esclusivo (LCK_M_X). Se l'operazione di eliminazione non utilizza un blocco di tabella, la tabella (heap) conterrà molte pagine vuote. Per gli indici, l'operazione di eliminazione può tralasciare le pagine vuote, anche se queste pagine verranno deallocate velocemente da un processo di rimozione dei dati eseguito in background.

TRUNCATE TABLE rimuove tutte le righe da una tabella, ma non rimuove la struttura della tabella e le relative colonne, i vincoli, gli indici e così via. Per rimuovere la definizione della tabella in aggiunta ai relativi dati, utilizzare l'istruzione DROP TABLE.

Se la tabella include una colonna Identity, il contattore per quella colonna viene reimpostato sul valore di inizializzazione definito per la colonna. Se non è stato definito alcun valore di inizializzazione, viene utilizzato il valore predefinito. Per mantenere il contatore della tabella Identity, utilizzare l'istruzione DELETE.

Restrizioni

Non è possibile utilizzare TRUNCATE TABLE sulle tabelle:

  • a cui fa riferimento un vincolo FOREIGN KEY È possibile troncare una tabella con una chiave esterna che fa riferimento alla tabella stessa.

  • che partecipano in una vista indicizzata

  • che sono pubblicate tramite una replica transazionale o una replica di tipo merge.

Per le tabelle con una o più di queste caratteristiche, utilizzare l'istruzione DELETE come alternativa.

TRUNCATE TABLE non può attivare un trigger perché l'operazione non registra le eliminazioni delle singole righe. Per ulteriori informazioni, vedere CREATE TRIGGER (Transact-SQL).

Troncamento delle tabelle di grandi dimensioni

In MicrosoftSQL Server è possibile eliminare o troncare le tabelle che includono più di 128 extent senza mantenere attivi blocchi simultanei in tutti gli extent necessari per l'eliminazione. Per ulteriori informazioni, vedere Eliminazione e ricostruzione di oggetti di grandi dimensioni.

Autorizzazioni

L'autorizzazione minima necessaria è ALTER su table_name. Le autorizzazioni per l'istruzione TRUNCATE TABLE vengono assegnate per impostazione predefinita ai membri del ruolo predefinito del server sysadmin, dei ruoli predefiniti del database db_owner e db_ddladmin e al proprietario della tabella e non sono trasferibili. È tuttavia possibile incorporare l'istruzione TRUNCATE TABLE all'interno di un modulo, ad esempio una stored procedure, e concedere le autorizzazioni necessarie al modulo tramite la clausola EXECUTE AS. Per ulteriori informazioni, vedere Utilizzo di EXECUTE AS per la creazione di set di autorizzazioni personalizzati.

Esempi

Nell'esempio seguente vengono rimossi tutti i dati dalla tabella JobCandidate. Prima e dopo l'istruzione TRUNCATE TABLE vengono inserite istruzioni SELECT per confrontare i risultati.

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