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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory
WHERE BusinessEntityID IN
(SELECT BusinessEntityID
FROM Sales.SalesPerson
WHERE SalesYTD > 2500000.00);
GO
-- Transact-SQL extension
USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory
FROM Sales.SalesPersonQuotaHistory AS spqh
INNER JOIN Sales.SalesPerson AS sp
ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;
GO
Consulte também