DELETE (Transact-SQL)DELETE (Transact-SQL)

ESTE TÓPICO APLICA-SE A: simSQL Server (a partir de 2008)simBanco de Dados SQL do Microsoft AzuresimAzure SQL Data Warehouse simParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Remove uma ou mais linhas de uma tabela ou exibição em SQL ServerSQL Server.Removes one or more rows from a table or view in SQL ServerSQL Server.

Ícone de link do tópico Convenções da sintaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

-- Syntax for SQL Server and Azure SQL Database  

[ WITH <common_table_expression> [ ,...n ] ]  
DELETE   
    [ TOP ( expression ) [ PERCENT ] ]   
    [ FROM ]   
    { { table_alias  
      | <object>   
      | rowset_function_limited   
      [ WITH ( table_hint_limited [ ...n ] ) ] }   
      | @table_variable  
    }  
    [ <OUTPUT Clause> ]  
    [ FROM table_source [ ,...n ] ]   
    [ WHERE { <search_condition>   
            | { [ CURRENT OF   
                   { { [ GLOBAL ] cursor_name }   
                       | cursor_variable_name   
                   }   
                ]  
              }  
            }   
    ]   
    [ OPTION ( <Query Hint> [ ,...n ] ) ]   
[; ]  

<object> ::=  
{   
    [ server_name.database_name.schema_name.   
      | database_name. [ schema_name ] .   
      | schema_name.  
    ]  
    table_or_view_name   
}  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

DELETE FROM [database_name . [ schema ] . | schema. ] table_name    
    [ WHERE <search_condition> ]   
    [ OPTION ( <query_options> [ ,...n ]  ) ]  
[; ]  

ArgumentosArguments

COM <common_table_expression >WITH <common_table_expression>
Especifica o conjunto de resultados nomeados temporário, também conhecido como expressão de tabela comum, definido dentro do escopo da instrução DELETE.Specifies the temporary named result set, also known as common table expression, defined within the scope of the DELETE statement. O conjunto de resultados é derivado de uma instrução SELECT.The result set is derived from a SELECT statement.

Também podem ser usadas expressões de tabela comuns com as instruções SELECT, INSERT, UPDATE e CREATE VIEW.Common table expressions can also be used with the SELECT, INSERT, UPDATE, and CREATE VIEW statements. Para obter mais informações, consulte com common_table_expression ( Transact-SQL ) .For more information, see WITH common_table_expression (Transact-SQL).

SUPERIOR (expressão) [%]TOP (expression) [ PERCENT ]
Especifica o número ou a porcentagem de linhas aleatórias que serão excluídas.Specifies the number or percent of random rows that will be deleted. expression pode ser um número ou uma porcentagem das linhas.expression can be either a number or a percent of the rows. As linhas referenciadas na expressão TOP usada com INSERT, UPDATE ou DELETE não são organizadas em qualquer ordem.The rows referenced in the TOP expression used with INSERT, UPDATE, or DELETE are not arranged in any order. Para obter mais informações, consulte TOP ( Transact-SQL ) .For more information, see TOP (Transact-SQL).

FROMFROM
Uma palavra-chave opcional que pode ser usada entre a palavra-chave DELETE e o destino table_or_view_name, ou rowset_function_limited.An optional keyword that can be used between the DELETE keyword and the target table_or_view_name, or rowset_function_limited.

table_aliastable_alias
O alias especificado no campo de table_source cláusula que representa a tabela ou exibição na qual as linhas serão excluídas.The alias specified in the FROM table_source clause representing the table or view from which the rows are to be deleted.

server_nameserver_name
Aplica-se a: do SQL Server 2008SQL Server 2008 ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

O nome do servidor (usando um nome de servidor vinculado ou OPENDATASOURCE funcionar como o nome do servidor) no qual a tabela ou exibição está localizada.The name of the server (using a linked server name or the OPENDATASOURCE function as the server name) on which the table or view is located. Se nome_do_servidor for especificado, database_name e schema_name são necessários.If server_name is specified, database_name and schema_name are required.

database_namedatabase_name
O nome do banco de dados.The name of the database.

schema_nameschema_name
O nome do esquema ao qual a tabela ou exibição pertence.The name of the schema to which the table or view belongs.

view_name table_ortable_or view_name
O nome da tabela ou exibição da qual as linhas serão removidas.The name of the table or view from which the rows are to be removed.

Uma variável de tabela, dentro de seu escopo, também pode ser usada como origem da tabela em uma instrução DELETE.A table variable, within its scope, also can be used as a table source in a DELETE statement.

A exibição referenciada por table_or_view_name deve ser atualizável e fazer referência exatamente uma tabela base na cláusula FROM da definição da exibição.The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view definition. Para obter mais informações sobre exibições atualizáveis, consulte CREATE VIEW ( Transact-SQL ) .For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
Aplica-se a: do SQL Server 2008SQL Server 2008 ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Ambos os OPENQUERY ou OPENROWSET função, sujeita aos recursos do provedor.Either the OPENQUERY or OPENROWSET function, subject to provider capabilities.

COM ( <dica_de_tabela_limitada > [... n] )WITH ( <table_hint_limited> [... n] )
Especifica uma ou mais dicas de tabela permitidas para uma tabela de destino.Specifies one or more table hints that are allowed for a target table. A palavra-chave WITH e parênteses são necessários.The WITH keyword and the parentheses are required. NOLOCK e READUNCOMMITTED não são permitidos.NOLOCK and READUNCOMMITTED are not allowed. Para obter mais informações sobre dicas de tabela, consulte dicas de tabela ( Transact-SQL ) .For more information about table hints, see Table Hints (Transact-SQL).

<OUTPUT_Clause ><OUTPUT_Clause>
Retorna linhas excluídas, ou expressões baseadas nelas, como parte da operação DELETE.Returns deleted rows, or expressions based on them, as part of the DELETE operation. A cláusula OUTPUT não tem suporte em nenhuma instrução DML destinada a exibições ou tabelas remotas.The OUTPUT clause is not supported in any DML statements targeting views or remote tables. Para obter mais informações, consulte cláusula OUTPUT ( Transact-SQL ) .For more information, see OUTPUT Clause (Transact-SQL).

DE table_sourceFROM table_source
Especifica uma cláusula FROM adicional.Specifies an additional FROM clause. Isso Transact-SQLTransact-SQL extensão para DELETE permite especificar dados de <table_source > e excluir as linhas correspondentes da tabela de primeira cláusula.This Transact-SQLTransact-SQL extension to DELETE allows specifying data from <table_source> and deleting the corresponding rows from the table in the first FROM clause.

Essa extensão, especificando uma união, pode ser usada em vez de uma subconsulta na cláusula WHERE para identificar linhas a serem removidas.This extension, specifying a join, can be used instead of a subquery in the WHERE clause to identify rows to be removed.

Para obter mais informações, consulte FROM (Transact-SQL).For more information, see FROM (Transact-SQL).

WHEREWHERE
Especifica as condições usadas para limitar o número de linhas que são excluídas.Specifies the conditions used to limit the number of rows that are deleted. Se uma cláusula WHERE não for fornecida, DELETE removerá todas as linhas da tabela.If a WHERE clause is not supplied, DELETE removes all the rows from the table.

Há duas formas de excluir operações com base no que é especificado na cláusula WHERE:There are two forms of delete operations based on what is specified in the WHERE clause:

  • Exclusões pesquisadas especificam um critério de pesquisa para qualificar as linhas a serem excluídas.Searched deletes specify a search condition to qualify the rows to delete. Por exemplo, onde column_name = valor.For example, WHERE column_name = value.

  • Exclusões posicionadas usam a cláusula CURRENT OF para especificar um cursor.Positioned deletes use the CURRENT OF clause to specify a cursor. A operação de exclusão ocorre na posição atual do cursor.The delete operation occurs at the current position of the cursor. Isso pode ser mais preciso do que uma instrução DELETE pesquisada que usa um WHERE search_condition cláusula para qualificar as linhas a serem excluídos.This can be more accurate than a searched DELETE statement that uses a WHERE search_condition clause to qualify the rows to be deleted. Uma instrução DELETE pesquisada exclui várias linhas se o critério de pesquisa não identificar exclusivamente uma única linha.A searched DELETE statement deletes multiple rows if the search condition does not uniquely identify a single row.

<search_condition ><search_condition>
Especifica os critérios de restrição para as linhas a serem excluídas.Specifies the restricting conditions for the rows to be deleted. Não há nenhum limite para o número de predicados que podem ser incluídos em um critério de pesquisa.There is no limit to the number of predicates that can be included in a search condition. Para obter mais informações, consulte critério de pesquisa ( Transact-SQL ) .For more information, see Search Condition (Transact-SQL).

CURRENT OFCURRENT OF
Especifica que DELETE é executado na posição atual do cursor especificado.Specifies that the DELETE is performed at the current position of the specified cursor.

GLOBALGLOBAL
Especifica que cursor_name refere-se a um cursor global.Specifies that cursor_name refers to a global cursor.

cursor_namecursor_name
É o nome do cursor aberto do qual a busca é feita.Is the name of the open cursor from which the fetch is made. Se uma global e um cursor local com o nome cursor_name existe, esse argumento fará referência ao cursor global se GLOBAL for especificado; caso contrário, ele se refere ao cursor local.If both a global and a local cursor with the name cursor_name exist, this argument refers to the global cursor if GLOBAL is specified; otherwise, it refers to the local cursor. O cursor deve permitir atualizações.The cursor must allow updates.

cursor_variable_namecursor_variable_name
O nome de uma variável de cursor.The name of a cursor variable. A variável de cursor deve fazer referência a um cursor que permite atualizações.The cursor variable must reference a cursor that allows updates.

OPÇÃO ( <query_hint > [ ,... n] )OPTION ( <query_hint> [ ,... n] )
Palavras-chave que indicam as dicas de otimização que são usadas para personalizar a forma como o Mecanismo de Banco de DadosDatabase Engine processa a instrução.Keywords that indicate which optimizer hints are used to customize the way the Mecanismo de Banco de DadosDatabase Engine processes the statement. Para obter mais informações, veja Dicas de consulta (Transact-SQL).For more information, see Query Hints (Transact-SQL).

Práticas recomendadasBest Practices

Para excluir todas as linhas em uma tabela, use TRUNCATE TABLE.To delete all the rows in a table, use TRUNCATE TABLE. TRUNCATE TABLE é mais rápido que DELETE e usa menos recursos do sistema e do log de transações.TRUNCATE TABLE is faster than DELETE and uses fewer system and transaction log resources. TRUNCATE TABLE tem restrições; por exemplo, a tabela não pode participar da replicação.TRUNCATE TABLE has restrictions, for example, the table cannot participate in replication. Para obter mais informações, consulte TRUNCATE TABLE ( Transact-SQL )For more information, see TRUNCATE TABLE (Transact-SQL)

Use o @@ROWCOUNT excluído de função para retornar o número de linhas para o aplicativo cliente.Use the @@ROWCOUNT function to return the number of deleted rows to the client application. Para obter mais informações, consulte @@ROWCOUNT ( Transact-SQL ) .For more information, see @@ROWCOUNT (Transact-SQL).

Tratamento de errosError Handling

Você pode implementar o tratamento de erros para a instrução DELETE especificando a instrução em uma construção TRY…CATCH.You can implement error handling for the DELETE statement by specifying the statement in a TRY…CATCH construct.

A instrução DELETE pode falhar se violar um gatilho ou tentar remover uma linha referenciada por dados em outra tabela com uma restrição FOREIGN KEY.The DELETE statement may fail if it violates a trigger or tries to remove a row referenced by data in another table with a FOREIGN KEY constraint. Se DELETE remover várias linhas e qualquer uma das linhas removidas violar um gatilho ou uma restrição, a instrução será cancelada, um erro será retornado e nenhuma linha será removida.If the DELETE removes multiple rows, and any one of the removed rows violates a trigger or constraint, the statement is canceled, an error is returned, and no rows are removed.

Quando uma instrução DELETE encontra um erro aritmético (estouro, divisão por zero ou um erro de domínio) que ocorre durante a avaliação de expressão, o Mecanismo de Banco de DadosDatabase Engine trata esses erros como se SET ARITHABORT estivesse definido como ON.When a DELETE statement encounters an arithmetic error (overflow, divide by zero, or a domain error) occurring during expression evaluation, the Mecanismo de Banco de DadosDatabase Engine handles these errors as if SET ARITHABORT is set ON. O restante do lote é cancelado e uma mensagem de erro é retornada.The rest of the batch is canceled, and an error message is returned.

InteroperabilidadeInteroperability

DELETE poderá ser usado no corpo de uma função definida pelo usuário se o objeto modificado for uma variável de tabela.DELETE can be used in the body of a user-defined function if the object modified is a table variable.

Ao excluir uma linha que contém uma coluna FILESTREAM, você também excluirá os arquivos subjacentes do sistema de arquivos.When you delete a row that contains a FILESTREAM column, you also delete its underlying file system files. Os arquivos subjacentes são removidos pelo coletor de lixo do FILESTREAM.The underlying files are removed by the FILESTREAM garbage collector. Para obter mais informações, consulte acessar dados FILESTREAM com Transact-SQL.For more information, see Access FILESTREAM Data with Transact-SQL.

A cláusula FROM não pode ser especificada em uma instrução DELETE que faça referência, direta ou indiretamente, a uma exibição com um gatilho INSTEAD OF definido.The FROM clause cannot be specified in a DELETE statement that references, either directly or indirectly, a view with an INSTEAD OF trigger defined on it. Para obter mais informações sobre gatilhos INSTEAD of, consulte CREATE TRIGGER ( Transact-SQL ) .For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

Limitações e restriçõesLimitations and Restrictions

Quando TOP é usado com DELETE, as linhas referenciadas não são organizadas em ordem alguma e a cláusula ORDER BY não pode ser especificada diretamente nessa instrução.When TOP is used with DELETE, the referenced rows are not arranged in any order and the ORDER BY clause can not be directly specified in this statement. Se você precisar usar TOP para excluir linhas em uma ordem cronológica significativa, será preciso usar TOP junto com uma cláusula ORDER BY em uma instrução de subseleção.If you need to use TOP to delete rows in a meaningful chronological order, you must use TOP together with an ORDER BY clause in a subselect statement. Consulte a seção Exemplos a seguir neste tópico.See the Examples section that follows in this topic.

TOP não pode ser usado em uma DELETE instrução para exibições particionadas.TOP cannot be used in a DELETE statement against partitioned views.

Comportamento de bloqueioLocking Behavior

Por padrão, uma instrução DELETE sempre adquire um bloqueio exclusivo (X) na tabela que modifica e mantém esse bloqueio até que a transação seja concluída.By default, a DELETE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes. Com um bloqueio exclusivo (X), nenhuma outra transação pode modificar os dados; operações de leitura podem ser realizadas apenas com o uso da dica NOLOCK ou nível de isolamento de leitura não confirmada.With an exclusive (X) lock, no other transactions can modify data; read operations can take place only with the use of the NOLOCK hint or read uncommitted isolation level. Você pode especificar dicas de tabela para substituir esse comportamento padrão durante a instrução DELETE especificando outro método de bloqueio; entretanto, é recomendável que as dicas só sejam usadas como último recurso por desenvolvedores experientes e administradores de bancos de dados.You can specify table hints to override this default behavior for the duration of the DELETE statement by specifying another locking method, however, we recommend that hints be used only as a last resort by experienced developers and database administrators. Para obter mais informações, consulte Dicas de tabela (Transact-SQL).For more information, see Table Hints (Transact-SQL).

Quando linhas são excluídas de um heap, o Mecanismo de Banco de DadosDatabase Engine pode usar bloqueio de linha ou página para a operação.When rows are deleted from a heap the Mecanismo de Banco de DadosDatabase Engine may use row or page locking for the operation. Como resultado, as páginas que ficaram vazias pela operação de exclusão permanecem alocadas no heap.As a result, the pages made empty by the delete operation remain allocated to the 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.When empty pages are not deallocated, the associated space cannot be reused by other objects in the database.

Para excluir linhas em um heap e desalocar páginas, use um dos seguintes métodos.To delete rows in a heap and deallocate pages, use one of the following methods.

  • Especifique a dica TABLOCK na instrução DELETE.Specify the TABLOCK hint in the DELETE statement. Usar a dica TABLOCK faz com que a operação de exclusão use um bloqueio exclusivo na tabela em vez de um bloqueio de linha ou página.Using the TABLOCK hint causes the delete operation to take an exclusive lock on the table instead of a row or page lock. Isso permite que as páginas sejam desalocadas.This allows the pages to be deallocated. Para obter mais informações sobre a dica TABLOCK, consulte dicas de tabela ( Transact-SQL ) .For more information about the TABLOCK hint, see Table Hints (Transact-SQL).

  • Use TRUNCATE TABLE se todas as linhas forem excluídas da tabela.Use TRUNCATE TABLE if all rows are to be deleted from the table.

  • Crie um índice clusterizado no heap antes de excluir as linhas.Create a clustered index on the heap before deleting the rows. Você pode cancelar o índice clusterizado depois que as linhas forem excluídas.You can drop the clustered index after the rows are deleted. Esse método consome mais tempo do que os métodos anteriores e usa mais recursos temporários.This method is more time consuming than the previous methods and uses more temporary resources.

Observação

Páginas vazias podem ser removidas de um heap a qualquer momento usando o ALTER TABLE <table_name> REBUILD instrução.Empty pages can be removed from a heap at any time by using the ALTER TABLE <table_name> REBUILD statement.

Comportamento de logLogging Behavior

A DELETE instrução sempre é registrada em log completamente.The DELETE statement is always fully logged.

SegurançaSecurity

PermissõesPermissions

São necessárias permissões DELETE na tabela de destino.DELETE permissions are required on the target table. Também serão necessárias permissões SELECT se a instrução tiver uma cláusula WHERE.SELECT permissions are also required if the statement contains a WHERE clause.

Excluir permissões padrão a membros do sysadmin função de servidor fixa, o db_owner e db_datawriter fixo de funções de banco de dados e o proprietário da tabela.DELETE permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. Membros de sysadmin, db_ownere o db_securityadmin funções e o proprietário da tabela podem transferir permissões a outros usuários.Members of the sysadmin, db_owner, and the db_securityadmin roles, and the table owner can transfer permissions to other users.

ExemplosExamples

CategoriaCategory Elementos de sintaxe em destaqueFeatured syntax elements
Sintaxe básicaBasic syntax DELETEDELETE
Limitando as linhas excluídasLimiting the rows deleted WHERE • FROM • cursor •WHERE • FROM • cursor •
Excluindo linhas de uma tabela remotaDeleting rows from a remote table Servidor vinculado • Função de conjunto de linhas OPENQUERY • Função de conjunto de linhas OPENDATASOURCELinked server • OPENQUERY rowset function • OPENDATASOURCE rowset function
Capturando os resultados da instrução DELETECapturing the results of the DELETE statement cláusula OUTPUTOUTPUT clause

Sintaxe básicaBasic Syntax

Os exemplos nesta seção demonstram a funcionalidade básica da instrução DELETE usando a sintaxe mínima necessária.Examples in this section demonstrate the basic functionality of the DELETE statement using the minimum required syntax.

A.A. Usando DELETE sem a cláusula WHEREUsing DELETE with no WHERE clause

O exemplo a seguir exclui todas as linhas de uma tabela SalesPersonQuotaHistory no banco de dados AdventureWorks2012AdventureWorks2012 porque uma cláusula WHERE não é usada para limitar o número de linhas excluídas.The following example deletes all rows from the SalesPersonQuotaHistory table in the AdventureWorks2012AdventureWorks2012 database because a WHERE clause is not used to limit the number of rows deleted.

DELETE FROM Sales.SalesPersonQuotaHistory;  
GO  

Limitando as linhas excluídasLimiting the Rows Deleted

Exemplos nesta seção demonstram como limitar o número de linhas que serão excluídas.Examples in this section demonstrate how to limit the number of rows that will be deleted.

B.B. Usando a cláusula WHERE para excluir um conjunto de linhasUsing the WHERE clause to delete a set of rows

O exemplo a seguir exclui todas as linhas do ProductCostHistory tabela o AdventureWorks2012AdventureWorks2012 banco de dados no qual o valor o StandardCost coluna é mais de 1000.00.The following example deletes all rows from the ProductCostHistory table in the AdventureWorks2012AdventureWorks2012 database in which the value in the StandardCost column is more than 1000.00.

DELETE FROM Production.ProductCostHistory  
WHERE StandardCost > 1000.00;  
GO  

O exemplo a seguir mostra uma cláusula WHERE mais complexa.The following example shows a more complex WHERE clause. A cláusula WHERE define duas condições que devem ser atendidas para determinar as linhas a serem excluídas.The WHERE clause defines two conditions that must be met to determine the rows to delete. O valor na coluna StandardCost deve ser entre 12.00 e 14.00 , e o valor na coluna SellEndDate deve ser nulo.The value in the StandardCost column must be between 12.00 and 14.00 and the value in the column SellEndDate must be null. O exemplo também imprime o valor do @@ROWCOUNT função para retornar o número das linhas excluídas.The example also prints the value from the @@ROWCOUNT function to return the number of deleted rows.

DELETE Production.ProductCostHistory  
WHERE StandardCost BETWEEN 12.00 AND 14.00  
      AND EndDate IS NULL;  
PRINT 'Number of rows deleted is ' + CAST(@@ROWCOUNT as char(3));  

C.C. Usando um cursor para determinar a linha a ser excluídaUsing a cursor to determine the row to delete

O exemplo a seguir exclui uma única linha do EmployeePayHistory tabela o AdventureWorks2012AdventureWorks2012 banco de dados usando um cursor nomeado my_cursor.The following example deletes a single row from the EmployeePayHistory table in the AdventureWorks2012AdventureWorks2012 database using a cursor named my_cursor. O operação de exclusão afeta somente a única linha buscada atualmente pelo cursor.The delete operation affects only the single row currently fetched from the cursor.

DECLARE complex_cursor CURSOR FOR  
    SELECT a.BusinessEntityID  
    FROM HumanResources.EmployeePayHistory AS a  
    WHERE RateChangeDate <>   
         (SELECT MAX(RateChangeDate)  
          FROM HumanResources.EmployeePayHistory AS b  
          WHERE a.BusinessEntityID = b.BusinessEntityID) ;  
OPEN complex_cursor;  
FETCH FROM complex_cursor;  
DELETE FROM HumanResources.EmployeePayHistory  
WHERE CURRENT OF complex_cursor;  
CLOSE complex_cursor;  
DEALLOCATE complex_cursor;  
GO  

D.D. Usando junções e subconsultas para dados em uma tabela para excluir linhas em outra tabelaUsing joins and subqueries to data in one table to delete rows in another table

Os exemplos a seguir mostram dois modos de excluir linhas em uma tabela com base em dados de outra tabela.The following examples show two ways to delete rows in one table based on data in another table. Nos dois exemplos, as linhas do SalesPersonQuotaHistory tabela o AdventureWorks2012AdventureWorks2012 banco de dados são excluídos com base nas vendas acumuladas no ano armazenadas no SalesPerson tabela.In both examples, rows from the SalesPersonQuotaHistory table in the AdventureWorks2012AdventureWorks2012 database are deleted based on the year-to-date sales stored in the SalesPerson table. A primeira DELETE instrução mostra a solução de subconsulta compatível com ISO e a segunda DELETE instrução mostra o Transact-SQLTransact-SQL de extensão para unir as duas tabelas.The first DELETE statement shows the ISO-compatible subquery solution, and the second DELETE statement shows the Transact-SQLTransact-SQL FROM extension to join the two tables.

-- SQL-2003 Standard subquery  

DELETE FROM Sales.SalesPersonQuotaHistory   
WHERE BusinessEntityID IN   
    (SELECT BusinessEntityID   
     FROM Sales.SalesPerson   
     WHERE SalesYTD > 2500000.00);  
GO  
-- Transact-SQL extension  

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  
-- No need to mention target table more than once.  

DELETE spqh  
  FROM  
        Sales.SalesPersonQuotaHistory AS spqh  
    INNER JOIN Sales.SalesPerson AS sp  
        ON spqh.BusinessEntityID = sp.BusinessEntityID  
  WHERE  sp.SalesYTD > 2500000.00;  

E.E. Usando TOP para limitar o número de linhas excluídasUsing TOP to limit the number of rows deleted

Quando um superior (n) cláusula é usada com DELETE, a operação de exclusão é executada em uma seleção aleatória de n número de linhas.When a TOP (n) clause is used with DELETE, the delete operation is performed on a random selection of n number of rows. O exemplo a seguir exclui 20 linhas aleatórias do PurchaseOrderDetail tabela o AdventureWorks2012AdventureWorks2012 banco de dados devido a datas anteriores a 1º de julho de 2006.The following example deletes 20 random rows from the PurchaseOrderDetail table in the AdventureWorks2012AdventureWorks2012 database that have due dates that are earlier than July 1, 2006.

DELETE TOP (20)   
FROM Purchasing.PurchaseOrderDetail  
WHERE DueDate < '20020701';  
GO  

Se você precisar usar TOP para excluir linhas em uma ordem cronológica significativa, será preciso usar TOP junto com ORDER BY em uma instrução de subseleção.If you have to use TOP to delete rows in a meaningful chronological order, you must use TOP together with ORDER BY in a subselect statement. A consulta a seguir exclui as 10 linhas da tabela PurchaseOrderDetail que têm as primeiras datas de vencimento.The following query deletes the 10 rows of the PurchaseOrderDetail table that have the earliest due dates. Para garantir que apenas 10 linhas sejam excluídas, a coluna especificada na instrução de subseleção (PurchaseOrderID) é a chave primária da tabela.To ensure that only 10 rows are deleted, the column specified in the subselect statement (PurchaseOrderID) is the primary key of the table. O uso de uma coluna não chave na instrução de subseleção pode resultar na exclusão de mais de 10 linhas se a coluna especificada contiver valores duplicados.Using a nonkey column in the subselect statement may result in the deletion of more than 10 rows if the specified column contains duplicate values.

DELETE FROM Purchasing.PurchaseOrderDetail  
WHERE PurchaseOrderDetailID IN  
   (SELECT TOP 10 PurchaseOrderDetailID   
    FROM Purchasing.PurchaseOrderDetail   
    ORDER BY DueDate ASC);  
GO  

Excluindo linhas de uma tabela remotaDeleting Rows From a Remote Table

Os exemplos nesta seção demonstram como excluir linhas de uma tabela remota usando um servidor vinculado ou um função de conjunto de linhas para referenciar a tabela remota.Examples in this section demonstrate how to delete rows from a remote table by using a linked server or a rowset function to reference the remote table. Uma tabela remota existe em um servidor diferente ou em uma instância do SQL Server.A remote table exists on a different server or instance of SQL Server.

Aplica-se a: do SQL Server 2008SQL Server 2008 ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

F.F. Excluindo dados de uma tabela remota por meio de um servidor vinculadoDeleting data from a remote table by using a linked server

O exemplo a seguir exclui uma linhas de uma tabela remota.The following example deletes rows from a remote table. O exemplo começa criando um link para a fonte de dados remota usando sp_addlinkedserver.The example begins by creating a link to the remote data source by using sp_addlinkedserver. O nome do servidor vinculado, MyLinkServer, é especificado como parte do nome do objeto de quatro partes no formulário Object.The linked server name, MyLinkServer, is then specified as part of the four-part object name in the form server.catalog.schema.object.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' or 'server_name\instance_name'.  

EXEC sp_addlinkedserver @server = N'MyLinkServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI',   
    @datasrc = N'server_name',  
    @catalog = N'AdventureWorks2012';  
GO  
-- Specify the remote data source using a four-part name   
-- in the form linked_server.catalog.schema.object.  

DELETE MyLinkServer.AdventureWorks2012.HumanResources.Department 
WHERE DepartmentID > 16;  
GO  

G.G. Excluindo dados de uma tabela remota por meio da função OPENQUERYDeleting data from a remote table by using the OPENQUERY function

O exemplo a seguir exclui linhas de uma tabela remota especificando a OPENQUERY função de conjunto de linhas.The following example deletes rows from a remote table by specifying the OPENQUERY rowset function. O nome de servidor vinculado criado no exemplo anterior é usado neste exemplo.The linked server name created in the previous example is used in this example.

DELETE OPENQUERY (MyLinkServer, 'SELECT Name, GroupName 
FROM AdventureWorks2012.HumanResources.Department  
WHERE DepartmentID = 18');  
GO  

H.H. Excluindo dados de uma tabela remota por meio da função OPENDATASOURCEDeleting data from a remote table by using the OPENDATASOURCE function

O exemplo a seguir exclui linhas de uma tabela remota especificando a OPENDATASOURCE função de conjunto de linhas.The following example deletes rows from a remote table by specifying the OPENDATASOURCE rowset function. Especifique um nome de servidor válido para a fonte de dados usando o formato nome_do_servidor ou server_name\instance_name.Specify a valid server name for the data source by using the format server_name or server_name\instance_name.

DELETE FROM OPENDATASOURCE('SQLNCLI',  
    'Data Source= <server_name>; Integrated Security=SSPI')  
    .AdventureWorks2012.HumanResources.Department   
WHERE DepartmentID = 17;'  

Capturando os resultados da instrução DELETECapturing the results of the DELETE statement

I.I. Usando DELETE com a cláusula OUTPUTUsing DELETE with the OUTPUT clause

O exemplo a seguir mostra como salvar os resultados de uma DELETE instrução em uma variável de tabela no AdventureWorks2012AdventureWorks2012 banco de dados.The following example shows how to save the results of a DELETE statement to a table variable in the AdventureWorks2012AdventureWorks2012 database.

DELETE Sales.ShoppingCartItem  
OUTPUT DELETED.*   
WHERE ShoppingCartID = 20621;  

--Verify the rows in the table matching the WHERE clause have been deleted.  
SELECT COUNT(*) AS [Rows in Table] 
FROM Sales.ShoppingCartItem 
WHERE ShoppingCartID = 20621;  
GO  

J.J. Usando OUTPUT com <do_nome_da_tabela> em uma instrução DELETEUsing OUTPUT with <from_table_name> in a DELETE statement

O exemplo a seguir exclui linhas do ProductProductPhoto tabela o AdventureWorks2012AdventureWorks2012 banco de dados com base em critérios de pesquisa definidos no FROM cláusula do DELETE instrução.The following example deletes rows in the ProductProductPhoto table in the AdventureWorks2012AdventureWorks2012 database based on search criteria defined in the FROM clause of the DELETE statement. A cláusula OUTPUT retorna colunas da tabela que está sendo excluída, DELETED.ProductID, DELETED.ProductPhotoID, e colunas da tabela Product .The OUTPUT clause returns columns from the table being deleted, DELETED.ProductID, DELETED.ProductPhotoID, and columns from the Product table. É usada na cláusula FROM para especificar as linhas a serem excluídas.This is used in the FROM clause to specify the rows to delete.

DECLARE @MyTableVar table (  
    ProductID int NOT NULL,   
    ProductName nvarchar(50)NOT NULL,  
    ProductModelID int NOT NULL,   
    PhotoID int NOT NULL);  

DELETE Production.ProductProductPhoto  
OUTPUT DELETED.ProductID,  
       p.Name,  
       p.ProductModelID,  
       DELETED.ProductPhotoID  
    INTO @MyTableVar  
FROM Production.ProductProductPhoto AS ph  
JOIN Production.Product as p   
    ON ph.ProductID = p.ProductID   
    WHERE p.ProductModelID BETWEEN 120 and 130;  

--Display the results of the table variable.  
SELECT ProductID, ProductName, ProductModelID, PhotoID   
FROM @MyTableVar  
ORDER BY ProductModelID;  
GO  

Exemplos: Azure SQL Data WarehouseAzure SQL Data Warehouse e Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

K.K. Excluir todas as linhas de uma tabelaDelete all rows from a table

O exemplo a seguir exclui todas as linhas de uma tabela Table1 porque uma cláusula WHERE não é usada para limitar o número de linhas excluídas.The following example deletes all rows from the Table1 table because a WHERE clause is not used to limit the number of rows deleted.

DELETE FROM Table1;  

L.L. Excluir um conjunto de linhas de uma tabelaDELETE a set of rows from a table

O exemplo a seguir exclui todas as linhas do Table1 tabela que tem um valor maior que 1.000,00 no StandardCost coluna.The following example deletes all rows from the Table1 table that have a value greater than 1000.00 in the StandardCost column.

DELETE FROM Table1  
WHERE StandardCost > 1000.00;  

M.M. Usando um rótulo com uma instrução DELETEUsing LABEL with a DELETE statement

O exemplo a seguir usa um rótulo com a instrução DELETE.The following example uses a label with the DELETE statement.

DELETE FROM Table1  
OPTION ( LABEL = N'label1' );  

N.N. Usando um rótulo e dica de consulta com a instrução DELETEUsing a label and a query hint with the DELETE statement

Esta consulta mostra a sintaxe básica para usar uma dica de consulta de junção com a instrução DELETE.This query shows the basic syntax for using a query join hint with the DELETE statement. Para obter mais informações sobre dicas de junção e como usar a cláusula OPTION, consulte opção (SQL Server PDW).For more information on join hints and how to use the OPTION clause, see OPTION (SQL Server PDW).

-- Uses AdventureWorks  

DELETE FROM dbo.FactInternetSales  
WHERE ProductKey IN (   
    SELECT T1.ProductKey FROM dbo.DimProduct T1   
    JOIN dbo.DimProductSubcategory T2  
    ON T1.ProductSubcategoryKey = T2.ProductSubcategoryKey  
    WHERE T2.EnglishProductSubcategoryName = 'Road Bikes' )  
OPTION ( LABEL = N'CustomJoin', HASH JOIN ) ;  

Consulte tambémSee Also

CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
TRUNCATE TABLE ( Transact-SQL ) TRUNCATE TABLE (Transact-SQL)
UPDATE (Transact-SQL) UPDATE (Transact-SQL)
COM common_table_expression ( Transact-SQL ) WITH common_table_expression (Transact-SQL)
@@ROWCOUNT (Transact-SQL)@@ROWCOUNT (Transact-SQL)