TRUNCATE TABLE (Transact-SQL)

Remove todas as linhas de uma tabela sem registrar as exclusões de linhas individuais. TRUNCATE TABLE é semelhante à instrução DELETE sem nenhuma cláusula WHERE; entretanto, TRUNCATE TABLE é mais rápida e utiliza menos recursos de sistema e log de transações.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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

Argumentos

  • database_name
    É o nome do banco de dados.

  • schema_name
    É o nome do esquema ao qual a tabela pertence.

  • table_name
    É o nome da tabela a ser truncada ou da qual todas as linhas são removidas.

Comentários

Em comparação com a instrução DELETE, TRUNCATE TABLE possui as seguintes vantagens:

  • O espaço utilizado para log de transações é menor.

    A instrução DELETE remove as linhas uma de cada vez e registra uma entrada no log de transações para cada linha excluída. TRUNCATE TABLE remove os dados desalocando as páginas de dados usadas para armazenar os dados da tabela e registra somente as desalocações de página no log de transações.

  • Normalmente são utilizados menos bloqueios.

    Quando a instrução DELETE é executada com o uso de um bloqueio de linha, cada linha na tabela é bloqueada para exclusão. TRUNCATE TABLE sempre bloqueia a tabela e a página, mas não cada linha.

  • Sem exceção, são deixadas na tabela páginas zero.

    Após a execução de uma instrução DELETE, a tabela ainda pode conter páginas vazias. Por exemplo, páginas vazias em um heap não podem ser desalocadas sem pelo menos um bloqueio de tabela exclusivo (LCK_M_X). Se a operação de exclusão não usar um bloqueio de tabela, a tabela (heap) conterá muitas páginas vazias. Para índices, a operação de exclusão pode deixar páginas vazias, embora essas páginas sejam desalocadas rapidamente por um processo de limpeza em segundo plano.

TRUNCATE TABLE remove todas as linhas de uma tabela, mas permanecem a estrutura da tabela e suas colunas, restrições, índices, etc. Para remover a definição de tabela junto com seus dados, use a instrução DROP TABLE.

Se a tabela contiver uma coluna de identidade, o contador daquela coluna será redefinido no valor de semente definido para a coluna. Se não for definida nenhuma semente, o valor padrão utilizado será 1. Para manter o contador de identidade, use DELETE.

Restrições

Você não pode usar TRUNCATE TABLE em tabelas que:

  • São referenciadas por uma restrição FOREIGN KEY. (É possível truncar uma tabela que tenha uma chave estrangeira que referencie a ela mesma.)

  • Participam de uma exibição indexada.

  • São publicadas com replicação transacional ou replicação de mesclagem.

Para tabelas com uma ou mais dessas características, use a instrução DELETE.

TRUNCATE TABLE não pode ativar um gatilho porque a operação não registra exclusões de linhas individuais. Para obter mais informações, consulte CREATE TRIGGER (Transact-SQL).

Truncando tabelas grandes

O MicrosoftSQL Server tem a capacidade de descartar ou truncar tabelas com mais de 128 extensões sem manter bloqueios simultâneos em todas as extensões necessárias para o descarte. Para obter mais informações, consulte Descartando e recriando objetos grandes.

Permissões

A permissão mínima necessária é ALTER em table_name. As permissões TRUNCATE TABLE assumem como padrão o proprietário da tabela, membros da função de servidor fixa sysadmin, e das funções de banco de dados fixas db_owner e db_ddladmin, e não são transferíveis. Entretanto, você pode incorporar a instrução TRUNCATE TABLE dentro de um módulo, como um procedimento armazenado, e conceder permissões adequadas ao módulo usando a cláusula EXECUTE AS. Para obter mais informações, consulte Usando EXECUTE AS para criar conjuntos de permissão personalizados.

Exemplos

O exemplo a seguir remove todos os dados da tabela JobCandidate. As instruções SELECT são incluídas antes e após a instrução TRUNCATE TABLE para comparar resultados.

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