Excluindo linhas usando DELETE

A instrução DELETE remove uma ou mais linhas em uma tabela ou exibição.

Uma forma simplificada da sintaxe de DELETE é:

DELETE table_or_view

FROM table_sources

WHERE search_condition

O parâmetro table_or_view nomeia uma tabela ou exibição da qual as linhas serão excluídas. São excluídas todas as linhas em table_or_view que satisfazem as qualificações do critério de pesquisa WHERE. Se uma cláusula WHERE não for especificada, todas as linhas em table_or_view serão excluídas. A cláusula FROM especifica tabelas ou exibições adicionais e condições de junção que podem ser usadas pelos predicados no critério de pesquisa da cláusula WHERE para qualificar as linhas a serem excluídas de Linhas table_or_view. não são excluídas de tabelas nomeadas na cláusula FROM, só da tabela nomeada em table_or_view.

Qualquer tabela que tenha todas as linhas removidas permanece no banco de dados. A instrução DELETE só exclui linhas da tabela; a tabela deve ser removida do banco de dados usando a instrução DROP TABLE.

Excluindo linhas de um heap

Quando são excluídas linhas de um heap o Mecanismo de Banco de Dados pode usar bloqueio de linha ou página para a operação. Como resultado, as páginas que ficaram vazias pela operação de exclusão permanecem alocadas no heap. Quando páginas vazias não são desalocadas, o espaço associado não pode ser usado novamente por outros objetos do banco de dados.

Para excluir linhas em um heap e desalocar páginas, use um dos seguintes métodos.

  • Especifique a dica TABLOCK na instrução DELETE. Usando a dica TABLOCK faz com que a operação de exclusão faça um bloqueio compartilhado na tabela em vez de um bloqueio de linha ou página. Isso permite que as páginas sejam desalocadas. Para obter mais informações sobre a dica TABLOCK, consulte Dicas de tabela (Transact-SQL).

  • Use TRUNCATE TABLE se todas as linhas forem excluídas da tabela.

  • Crie um índice clusterizado no heap antes de excluir as linhas. Você pode cancelar o índice clusterizado depois que as linhas forem excluídas. Esse método consome mais tempo do que os métodos anteriores e usa mais recursos temporários.

Para obter mais informações sobre bloqueios, consulte Bloqueios no mecanismo de banco de dados.

Exemplos

O exemplo a seguir exclui todas as linhas de uma tabela SalesPersonQuotaHistory porque uma cláusula WHERE não é usada para limitar o número de linhas excluídas.

USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory;
GO

O exemplo a seguir exclui todas as linhas de uma tabela ProductCostHistory na qual o valor da coluna StandardCost é maior que 1000.00.

USE AdventureWorks;
GO
DELETE FROM Production.ProductCostHistory
WHERE StandardCost > 1000.00;
GO

O exemplo a seguir mostra a extensão Transact-SQL usada para excluir registros de uma tabela base que se baseia em uma junção ou subconsulta correlacionada. A primeira instrução DELETE mostra a solução ISO de subconsulta compatível e a segunda instrução DELETE mostra a extensão Transact-SQL. Ambas as consultas removem linhas de uma tabela SalesPersonQuotaHistory com base nas vendas acumuladas no ano armazenadas na tabela SalesPerson.

-- SQL-2003 Standard subquery

USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
WHERE SalesPersonID IN 
    (SELECT SalesPersonID 
     FROM Sales.SalesPerson 
     WHERE SalesYTD > 2500000.00);
GO
-- Transact-SQL extension
USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
FROM Sales.SalesPersonQuotaHistory AS spqh
    INNER JOIN Sales.SalesPerson AS sp
    ON spqh.SalesPersonID = sp.SalesPersonID
WHERE sp.SalesYTD > 2500000.00;
GO