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

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síAzure SQL DatabasesíAzure SQL Data Warehouse síAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Quita una o varias filas de una tabla o vista en SQL ServerSQL Server.Removes one or more rows from a table or view in SQL ServerSQL Server.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- 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

CON <common_table_expression >WITH <common_table_expression>
Especifica el conjunto de resultados de nombre temporal, también conocido como expresión de tabla común, definido dentro del ámbito de la instrucción DELETE.Specifies the temporary named result set, also known as common table expression, defined within the scope of the DELETE statement. El conjunto de resultados se deriva de una instrucción SELECT.The result set is derived from a SELECT statement.

Las expresiones de tabla comunes también se pueden utilizar con las instrucciones SELECT, INSERT, UPDATE y CREATE VIEW.Common table expressions can also be used with the SELECT, INSERT, UPDATE, and CREATE VIEW statements. Para obtener más información, consulte con common_table_expression ( Transact-SQL ) .For more information, see WITH common_table_expression (Transact-SQL).

Parte superior (expresión) [%]TOP (expression) [ PERCENT ]
Especifica el número o el porcentaje de filas aleatorias que se van a eliminar.Specifies the number or percent of random rows that will be deleted. expression puede ser un número o un porcentaje de las filas.expression can be either a number or a percent of the rows. Las filas a las que se hace referencia en la expresión TOP utilizada con INSERT, UPDATE o DELETE no se ordenan.The rows referenced in the TOP expression used with INSERT, UPDATE, or DELETE are not arranged in any order. Para obtener más información, vea TOP ( Transact-SQL ) .For more information, see TOP (Transact-SQL).

FROMFROM
Una palabra clave opcional que se puede usar entre la palabra clave DELETE y el destino nombre_tabla_o_vista, o funciónConjuntoFilasLimit.An optional keyword that can be used between the DELETE keyword and the target table_or_view_name, or rowset_function_limited.

aliasTablatable_alias
El alias especificado en el campo de table_source cláusula que representa la tabla o la vista desde la que las filas se va a eliminar.The alias specified in the FROM table_source clause representing the table or view from which the rows are to be deleted.

nombre_servidorserver_name
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

El nombre del servidor (con un nombre de servidor vinculado o OPENDATASOURCE funcionar como el nombre del servidor) en el que se encuentra la tabla o vista.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. Si nombre_servidor se especifica, database_name y schema_name son necesarios.If server_name is specified, database_name and schema_name are required.

database_namedatabase_name
El nombre de la base de datos.The name of the database.

schema_nameschema_name
Nombre del esquema al que pertenece la tabla o la vista.The name of the schema to which the table or view belongs.

view_name table_ortable_or view_name
Nombre de la tabla o vista cuyas filas se van a quitar.The name of the table or view from which the rows are to be removed.

En este ámbito, se puede utilizar una variable de tabla como origen de tabla de una instrucción DELETE.A table variable, within its scope, also can be used as a table source in a DELETE statement.

La vista hace referencia a nombre_tabla_o_vista debe ser actualizable y referencia exactamente a una tabla base en la cláusula FROM de la definición de vista.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 obtener más información acerca de las vistas actualizables, vea CREATE VIEW ( Transact-SQL ) .For more information about updatable views, see CREATE VIEW (Transact-SQL).

funciónConjuntoFilasLimitadorowset_function_limited
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Ya sea la OPENQUERY o OPENROWSET función, dependiendo del proveedor.Either the OPENQUERY or OPENROWSET function, subject to provider capabilities.

CON ( <sugerenciaTablaLimitada > [... n] )WITH ( <table_hint_limited> [... n] )
Especifica una o varias sugerencias de tabla que están permitidas en una tabla de destino.Specifies one or more table hints that are allowed for a target table. La palabra clave WITH y los paréntesis son obligatorios.The WITH keyword and the parentheses are required. No se permiten NOLOCK ni READUNCOMMITTED.NOLOCK and READUNCOMMITTED are not allowed. Para obtener más información acerca de las sugerencias de tabla, vea sugerencias de tabla ( Transact-SQL ) .For more information about table hints, see Table Hints (Transact-SQL).

<OUTPUT_Clause ><OUTPUT_Clause>
Devuelve filas eliminadas, o expresiones basadas en ellas, como parte de la operación DELETE.Returns deleted rows, or expressions based on them, as part of the DELETE operation. La cláusula OUTPUT no se admite en instrucciones DML dirigidas a tablas o vistas remotas.The OUTPUT clause is not supported in any DML statements targeting views or remote tables. Para obtener más información, vea cláusula OUTPUT ( Transact-SQL ) .For more information, see OUTPUT Clause (Transact-SQL).

DE table_sourceFROM table_source
Especifica una cláusula FROM adicional.Specifies an additional FROM clause. Esto Transact-SQLTransact-SQL extensión DELETE permite especificar datos de <table_source > y eliminar las filas correspondientes de la tabla en el primer campo de 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.

Se puede utilizar esta extensión, que especifica una combinación, en lugar de una subconsulta en la cláusula WHERE para identificar las filas que se van a quitar.This extension, specifying a join, can be used instead of a subquery in the WHERE clause to identify rows to be removed.

Para obtener más información, vea FROM (Transact-SQL).For more information, see FROM (Transact-SQL).

WHEREWHERE
Especifica las condiciones utilizadas para limitar el número de filas que se van a eliminar.Specifies the conditions used to limit the number of rows that are deleted. Si no se proporciona una cláusula WHERE, DELETE quita todas las filas de la tabla.If a WHERE clause is not supplied, DELETE removes all the rows from the table.

Hay dos formas de operaciones de eliminación, que se basan en las condiciones que se especifiquen en la cláusula WHERE:There are two forms of delete operations based on what is specified in the WHERE clause:

  • Las eliminaciones por búsqueda especifican una condición de búsqueda que califica las filas que se van a eliminar.Searched deletes specify a search condition to qualify the rows to delete. Por ejemplo, donde column_name = valor.For example, WHERE column_name = value.

  • Las eliminaciones por posición utilizan la cláusula CURRENT OF para especificar un cursor.Positioned deletes use the CURRENT OF clause to specify a cursor. La operación de eliminación se produce en la posición actual del cursor.The delete operation occurs at the current position of the cursor. Esto puede ser más preciso que una instrucción DELETE por búsqueda que utilice un WHERE search_condition cláusula para calificar las filas que se va a eliminar.This can be more accurate than a searched DELETE statement that uses a WHERE search_condition clause to qualify the rows to be deleted. Una instrucción DELETE por búsqueda elimina varias filas si la condición de búsqueda no identifica exclusivamente una única fila.A searched DELETE statement deletes multiple rows if the search condition does not uniquely identify a single row.

<search_condition ><search_condition>
Especifica las condiciones restrictivas de las filas que se van a eliminar.Specifies the restricting conditions for the rows to be deleted. No hay límite en el número de predicados que se pueden incluir en una condición de búsqueda.There is no limit to the number of predicates that can be included in a search condition. Para obtener más información, vea condición de búsqueda ( Transact-SQL ) .For more information, see Search Condition (Transact-SQL).

CURRENT OFCURRENT OF
Especifica que la instrucción DELETE se ejecutará en la posición actual del cursor especificado.Specifies that the DELETE is performed at the current position of the specified cursor.

GLOBALGLOBAL
Especifica que cursor_name hace referencia a un cursor global.Specifies that cursor_name refers to a global cursor.

cursor_namecursor_name
Es el nombre del cursor abierto desde el que se realiza la captura.Is the name of the open cursor from which the fetch is made. Si tanto un cursor global y otro local con el nombre cursor_name existe, este argumento hace referencia al cursor global si se especifica GLOBAL; en caso contrario, hace referencia al 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. El cursor debe permitir actualizaciones.The cursor must allow updates.

cursor_variable_namecursor_variable_name
Nombre de una variable de cursor.The name of a cursor variable. La variable de cursor debe hacer referencia a un cursor que permita realizar actualizaciones.The cursor variable must reference a cursor that allows updates.

OPCIÓN ( <query_hint > [ ,... n] )OPTION ( <query_hint> [ ,... n] )
Palabras clave que indican que se utilizan sugerencias del optimizador para personalizar el procesamiento de la instrucción por parte del Motor de base de datosDatabase Engine.Keywords that indicate which optimizer hints are used to customize the way the Motor de base de datosDatabase Engine processes the statement. Para obtener más información, vea Sugerencias de consulta (Transact-SQL).For more information, see Query Hints (Transact-SQL).

Procedimientos recomendadosBest Practices

Para eliminar todas las filas de una tabla, use TRUNCATE TABLE.To delete all the rows in a table, use TRUNCATE TABLE. TRUNCATE TABLE es más rápido que DELETE y utiliza menos recursos de los registros de transacciones y de sistema.TRUNCATE TABLE is faster than DELETE and uses fewer system and transaction log resources. TRUNCATE TABLE tiene restricciones; por ejemplo, la tabla no puede participar en la replicación.TRUNCATE TABLE has restrictions, for example, the table cannot participate in replication. Para obtener más información, vea TRUNCATE TABLE ( Transact-SQL )For more information, see TRUNCATE TABLE (Transact-SQL)

Use el @@ROWCOUNT eliminado de función para devolver el número de filas a la aplicación cliente.Use the @@ROWCOUNT function to return the number of deleted rows to the client application. Para obtener más información, consulte @@ROWCOUNT ( Transact-SQL ) .For more information, see @@ROWCOUNT (Transact-SQL).

Tratamiento de erroresError Handling

Puede implementar el control de errores de la instrucción DELETE especificando la instrucción en una construcción TRY…CATCH.You can implement error handling for the DELETE statement by specifying the statement in a TRY…CATCH construct.

La instrucción DELETE puede tener un error si infringe un desencadenador o intenta quitar una fila a la que hacen referencia datos de otra tabla con una restricción 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. Si la instrucción DELETE quita varias filas y cualquiera de las filas eliminadas infringe un desencadenador o restricción, se cancela la instrucción, se devuelve un error y no se elimina ninguna fila.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.

Cuando una instrucción DELETE encuentra un error aritmético (desbordamiento, división entre cero o error de dominio) al evaluar una expresión, el Motor de base de datosDatabase Engine trata ese error como si SET ARITHABORT fuese ON.When a DELETE statement encounters an arithmetic error (overflow, divide by zero, or a domain error) occurring during expression evaluation, the Motor de base de datosDatabase Engine handles these errors as if SET ARITHABORT is set ON. Se cancela el resto del proceso por lotes y se devuelve un mensaje de error.The rest of the batch is canceled, and an error message is returned.

InteroperabilidadInteroperability

Es posible utilizar DELETE en el cuerpo de una función definida por el usuario si el objeto que se va a modificar es una variable de tabla.DELETE can be used in the body of a user-defined function if the object modified is a table variable.

Al eliminar una fila que contiene una columna FILESTREAM, también elimina los archivos del sistema de archivos subyacentes.When you delete a row that contains a FILESTREAM column, you also delete its underlying file system files. El recolector de elementos no utilizados de FILESTREAM quita los archivos subyacentes.The underlying files are removed by the FILESTREAM garbage collector. Para obtener más información, consulte acceder a los datos de FILESTREAM con Transact-SQL.For more information, see Access FILESTREAM Data with Transact-SQL.

No se puede especificar la cláusula FROM en una instrucción DELETE que haga referencia, directa o indirectamente, a una vista que tiene definido un desencadenador INSTEAD OF.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 obtener más información acerca de desencadenadores INSTEAD OF, vea CREATE TRIGGER ( Transact-SQL ) .For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

Limitaciones y restriccionesLimitations and Restrictions

Cuando se usa TOP con DELETE, las filas a las que hace referencia no están organizadas de ninguna manera y la cláusula ORDER BY no se puede especificar directamente en esta instrucción.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. Si necesita utilizar TOP para eliminar filas por un orden cronológico significativo, debe usar TOP junto con una cláusula ORDER BY en una instrucción de subselección.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. Vea la sección Ejemplos que aparece más adelante en este tema.See the Examples section that follows in this topic.

TOP no se puede usar en una instrucción DELETE con vistas divididas en particiones.TOP cannot be used in a DELETE statement against partitioned views.

Comportamiento del bloqueoLocking Behavior

De forma predeterminada, una instrucción DELETE siempre adquiere un bloqueo exclusivo (X) en la tabla que modifica y retiene ese bloqueo hasta que se completa la transacción.By default, a DELETE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes. Al utilizar un bloqueo exclusivo (X), el resto de las transacciones no pueden modificar los datos; las operaciones de lectura solo se pueden realizar si se utiliza la sugerencia NOLOCK o el nivel de aislamiento de lectura no 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. Puede especificar sugerencias de tabla para invalidar este comportamiento predeterminado durante la ejecución de la instrucción DELETE especificando otro método de bloqueo, sin embargo se recomienda que solo los desarrolladores y administradores de bases de datos experimentados usen las sugerencias y únicamente como último recurso.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 obtener más información, vea Sugerencias de tabla (Transact-SQL).For more information, see Table Hints (Transact-SQL).

Cuando se eliminan filas de un montón, Motor de base de datosDatabase Engine puede usar bloqueo de filas o páginas para la operación.When rows are deleted from a heap the Motor de base de datosDatabase Engine may use row or page locking for the operation. Como consecuencia, las páginas que han quedado vacías por la operación de eliminación permanecen asignadas al montón.As a result, the pages made empty by the delete operation remain allocated to the heap. Si no se cancela la asignación de las páginas vacías, otros objetos de la base de datos no pueden volver a utilizar el espacio asociado.When empty pages are not deallocated, the associated space cannot be reused by other objects in the database.

Para eliminar las filas de un montón y cancelar la asignación de las páginas, use uno de los métodos siguientes.To delete rows in a heap and deallocate pages, use one of the following methods.

  • Especifique la sugerencia TABLOCK en la instrucción DELETE.Specify the TABLOCK hint in the DELETE statement. Si se utiliza la sugerencia TABLOCK, la operación de eliminación aplica un bloqueo exclusivo a la tabla, en lugar de un bloqueo de fila o de 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. Esto permite cancelar la asignación de las páginas.This allows the pages to be deallocated. Para obtener más información acerca de la sugerencia TABLOCK, vea sugerencias de tabla ( Transact-SQL ) .For more information about the TABLOCK hint, see Table Hints (Transact-SQL).

  • Se debe utilizar TRUNCATE TABLE si se van a eliminar todas las filas de la tabla.Use TRUNCATE TABLE if all rows are to be deleted from the table.

  • Cree un índice clúster en el montón antes de eliminar las filas.Create a clustered index on the heap before deleting the rows. Puede quitar el índice clúster tras eliminar las filas.You can drop the clustered index after the rows are deleted. Este método requiere más tiempo que los métodos anteriores y utiliza más recursos temporales.This method is more time consuming than the previous methods and uses more temporary resources.

Nota

Páginas vacías se pueden quitar de un montón en cualquier momento mediante el uso de la ALTER TABLE <table_name> REBUILD instrucción.Empty pages can be removed from a heap at any time by using the ALTER TABLE <table_name> REBUILD statement.

Comportamiento del registroLogging Behavior

La instrucción DELETE siempre está registrada totalmente.The DELETE statement is always fully logged.

SeguridadSecurity

PermissionsPermissions

Se requieren permisos DELETE en la tabla de destino.DELETE permissions are required on the target table. También se requieren los permisos para utilizar SELECT si la instrucción contiene una cláusula WHERE.SELECT permissions are also required if the statement contains a WHERE clause.

ELIMINAR los permisos predeterminados de los miembros de la sysadmin fija de servidor sysadmin el db_owner y db_datawriter se han corregido los roles de base de datos y el propietario de la tabla.DELETE permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. Los miembros de la sysadmin, db_ownery el db_securityadmin roles y el propietario de la tabla pueden transferir permisos a otros usuarios.Members of the sysadmin, db_owner, and the db_securityadmin roles, and the table owner can transfer permissions to other users.

EjemplosExamples

CategoríaCategory Elementos de sintaxis ofrecidosFeatured syntax elements
Sintaxis básicaBasic syntax DELETEDELETE
Limitar las filas eliminadasLimiting the rows deleted WHERE • FROM • cursor •WHERE • FROM • cursor •
Eliminar filas de una tabla remotaDeleting rows from a remote table Servidor vinculado • función de conjunto de filas OPENQUERY • función de conjunto de filas OPENDATASOURCELinked server • OPENQUERY rowset function • OPENDATASOURCE rowset function
Capturar los resultados de la instrucción DELETECapturing the results of the DELETE statement Cláusula OUTPUTOUTPUT clause

Sintaxis básicaBasic Syntax

En los ejemplos de esta sección se muestra la funcionalidad básica de la instrucción DELETE usando la sintaxis mínima requerida.Examples in this section demonstrate the basic functionality of the DELETE statement using the minimum required syntax.

A.A. Utilizar DELETE sin la cláusula WHEREUsing DELETE with no WHERE clause

En el ejemplo siguiente se eliminan todas las filas de la tabla SalesPersonQuotaHistory de la base de datos AdventureWorks2012AdventureWorks2012 porque no se utiliza una cláusula WHERE para limitar el número de filas eliminadas.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  

Limitar las filas eliminadasLimiting the Rows Deleted

En los ejemplos de esta sección se muestra cómo se limita el número de filas que se van a eliminar.Examples in this section demonstrate how to limit the number of rows that will be deleted.

B.B. Usar la cláusula WHERE para eliminar un conjunto de filasUsing the WHERE clause to delete a set of rows

En el ejemplo siguiente se elimina todas las filas de la ProductCostHistory tabla el AdventureWorks2012AdventureWorks2012 base de datos en el que el valor de la StandardCost columna es más 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  

En el siguiente ejemplo se muestra una cláusula WHERE más compleja.The following example shows a more complex WHERE clause. La cláusula WHERE define dos condiciones que deben cumplirse para determinar las filas que se van a eliminar.The WHERE clause defines two conditions that must be met to determine the rows to delete. El valor de la columna StandardCost debe estar comprendido entre 12.00 y 14.00 y el valor de la columna SellEndDate debe ser NULL.The value in the StandardCost column must be between 12.00 and 14.00 and the value in the column SellEndDate must be null. También se imprime el valor de la @@ROWCOUNT función para devolver el número de filas eliminadas.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. Usar un cursor para determinar la fila que se va a eliminarUsing a cursor to determine the row to delete

En el ejemplo siguiente se elimina una fila única de la EmployeePayHistory tabla el AdventureWorks2012AdventureWorks2012 base de datos mediante un cursor denominado my_cursor.The following example deletes a single row from the EmployeePayHistory table in the AdventureWorks2012AdventureWorks2012 database using a cursor named my_cursor. La operación de eliminación solo afecta a la única fila que se captura actualmente del 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. Usar combinaciones y subconsultas en los datos de una tabla para eliminar filas de otra tablaUsing joins and subqueries to data in one table to delete rows in another table

En los siguientes ejemplos se muestran dos maneras de eliminar filas de una tabla en función de los datos de otra tabla.The following examples show two ways to delete rows in one table based on data in another table. En ambos ejemplos, las filas de la SalesPersonQuotaHistory tabla el AdventureWorks2012AdventureWorks2012 base de datos se eliminan en función de las ventas del año hasta la fecha almacenadas en el SalesPerson tabla.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. La primera DELETE instrucción muestra la solución de subconsulta compatible con ISO y el segundo DELETE instrucción muestra la Transact-SQLTransact-SQL de extensión para combinar las dos tablas.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. Utilizar TOP para limitar el número de filas eliminadasUsing TOP to limit the number of rows deleted

Cuando una parte superior (n) se utiliza la cláusula con la eliminación, la operación de eliminación se realiza en una selección aleatoria de n número de filas.When a TOP (n) clause is used with DELETE, the delete operation is performed on a random selection of n number of rows. En el ejemplo siguiente se eliminan 20 filas aleatorias de la PurchaseOrderDetail tabla el AdventureWorks2012AdventureWorks2012 base de datos que tienen debido a las fechas anteriores al 1 de julio 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  

Si necesita utilizar TOP para eliminar filas por un orden cronológico significativo, debe utilizarla junto con ORDER BY en una instrucción de subselección.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. La siguiente consulta elimina de la tabla PurchaseOrderDetail las 10 filas con las fechas de vencimiento más antiguas.The following query deletes the 10 rows of the PurchaseOrderDetail table that have the earliest due dates. Para garantizar que solo se eliminen 10 filas, la columna especificada en la instrucción de subselección (PurchaseOrderID) es la clave principal de la tabla.To ensure that only 10 rows are deleted, the column specified in the subselect statement (PurchaseOrderID) is the primary key of the table. El uso de una columna sin clave en la instrucción de subselección podría causar la eliminación de más de 10 filas si la columna especificada contiene 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  

Eliminar filas de una tabla remotaDeleting Rows From a Remote Table

Ejemplos de esta sección muestran cómo se eliminan filas de una tabla remota mediante un servidor vinculado o un función rowset para hacer referencia a la tabla 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. Una tabla remota existe en un servidor o instancia diferente de SQL Server.A remote table exists on a different server or instance of SQL Server.

Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

F.F. Eliminar datos de una tabla remota usando un servidor vinculadoDeleting data from a remote table by using a linked server

En el ejemplo siguiente se eliminan filas de una tabla remota.The following example deletes rows from a remote table. El ejemplo comienza creando un vínculo al origen de datos remoto mediante el uso de sp_addlinkedserver.The example begins by creating a link to the remote data source by using sp_addlinkedserver. El nombre del servidor vinculado, MyLinkServer, a continuación, se especifica como parte del nombre de objeto de cuatro partes con el formato servidor.catálogo.esquema.objeto.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. Eliminar datos de una tabla remota con la función OPENQUERYDeleting data from a remote table by using the OPENQUERY function

En el ejemplo siguiente se elimina filas de una tabla remota especificando la OPENQUERY función de conjunto de filas.The following example deletes rows from a remote table by specifying the OPENQUERY rowset function. En este ejemplo se usa el nombre del servidor vinculado creado en el ejemplo anterior.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. Eliminar datos de una tabla remota con una función OPENDATASOURCEDeleting data from a remote table by using the OPENDATASOURCE function

En el ejemplo siguiente se elimina filas de una tabla remota especificando la OPENDATASOURCE función de conjunto de filas.The following example deletes rows from a remote table by specifying the OPENDATASOURCE rowset function. Especifique un nombre de servidor válido para el origen de datos con el formato nombre_servidor o nombre_servidor ombre_instancia.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;'  

Capturar los resultados de la instrucción DELETECapturing the results of the DELETE statement

I.I. Usar DELETE con la cláusula OUTPUTUsing DELETE with the OUTPUT clause

En el ejemplo siguiente se muestra cómo guardar los resultados de un DELETE instrucción a una variable de tabla en la AdventureWorks2012AdventureWorks2012 base de datos.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. Utilizar OUTPUT con <from_table_name> en una instrucción DELETEUsing OUTPUT with <from_table_name> in a DELETE statement

En el ejemplo siguiente se elimina las filas de la ProductProductPhoto tabla el AdventureWorks2012AdventureWorks2012 base de datos en función de criterios de búsqueda definidos en el FROM cláusula de la DELETE instrucción.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. La cláusula OUTPUT devuelve columnas de la tabla que se elimina ( DELETED.ProductID, DELETED.ProductPhotoID) y de la tabla Product .The OUTPUT clause returns columns from the table being deleted, DELETED.ProductID, DELETED.ProductPhotoID, and columns from the Product table. Esta información se utiliza en la cláusula FROM para especificar las filas que se deben eliminar.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  

Ejemplos: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse and Almacenamiento de datos paralelosParallel Data Warehouse

K.K. Eliminar todas las filas de una tablaDelete all rows from a table

En el ejemplo siguiente se eliminan todas las filas de la tabla Table1 porque no se utiliza una cláusula WHERE para limitar el número de filas eliminadas.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. ELIMINAR un conjunto de filas de una tablaDELETE a set of rows from a table

En el ejemplo siguiente se elimina todas las filas de la Table1 tabla que tienen un valor mayor que 1000.00 en la StandardCost columna.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. Uso de etiqueta con una instrucción DELETEUsing LABEL with a DELETE statement

En el ejemplo siguiente se usa una etiqueta con la instrucción DELETE.The following example uses a label with the DELETE statement.

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

N.N. Con una etiqueta y una sugerencia de consulta con la instrucción DELETEUsing a label and a query hint with the DELETE statement

Esta consulta muestra la sintaxis básica para el uso de una sugerencia de combinación de la consulta con la instrucción DELETE.This query shows the basic syntax for using a query join hint with the DELETE statement. Para obtener más información sobre las sugerencias de combinación y cómo usar la cláusula OPTION, consulte opción (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 ) ;  

Vea tambiénSee 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)
CON common_table_expression ( Transact-SQL ) WITH common_table_expression (Transact-SQL)
@@ROWCOUNT (Transact-SQL)@@ROWCOUNT (Transact-SQL)