Sei sulla pagina 1di 10

Delete

Este documento se proporciona "tal cual". La informacin y los puntos de vista expresados en este documento, incluyendo las referencias a sitios web de
Internet y direcciones URL, est sujeta a cambios sin aviso. Este documento no implica ningn derecho legal respecto a ninguna propiedad intelectual de ningn
nombre de producto o producto de Microsoft. Puede copiar y utilizar este documento con fines internos y de referencia. Se permite que modifique este
documento para sus fines internos y de referencia. 2013 Microsoft. Reservados todos los derechos. Trminos de uso
(http://msdn.microsoft.com/cc300389.aspx) | Marcas comerciales (http://www.microsoft.com/library/toolbar/3.0/trademarks/en-us.mspx)
Table Of Contents
Delete
DELETE (Transact-SQL)
Delete
DELETE (Transact-SQL)
Quita una o varias filas de una tabla o vista de SQL Server.
Se aplica a: SQL Server (desde SQL Server 2008 hasta la versin actual, Windows Azure SQL Database desde la versin inicial hasta la versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Argumentos
WITH <common_table_expression>
Especifica el conjunto de resultados de nombre temporal, tambin conocido como expresin de tabla comn, definido dentro del mbito de la instruccin
DELETE. El conjunto de resultados se deriva de una instruccin SELECT.
Las expresiones de tabla comunes tambin se pueden utilizar con las instrucciones SELECT, INSERT, UPDATE y CREATE VIEW. Para obtener ms informacin, vea
WITH common_table_expression (Transact-SQL).
TOP (expression) [ PERCENT ]
Especifica el nmero o el porcentaje de filas aleatorias que se van a eliminar. expression puede ser un nmero o un porcentaje de las filas. Las filas a las que se
hace referencia en la expresin TOP utilizada con INSERT, UPDATE o DELETE no se ordenan. Para obtener ms informacin, vea TOP (Transact-SQL).
FROM
Palabra clave opcional que se puede usar entre la palabra clave DELETE y el destino table_or_view_name o rowset_function_limited.
table_alias
Alias especificado en la clusula FROM table_source que representa la tabla o vista de la que se van a eliminar las filas.
server_name
Se aplica a: SQL Server 2008 a SQL Server 2014.
Nombre del servidor un nombre de servidor vinculado o la funcin OPENDATASOURCE como nombre de servidor) en el que se encuentra la tabla o la vista. Si
se especifica server_name, son obligatorios database_name y schema_name.
database_name
El nombre de la base de datos.
schema_name
Nombre del esquema al que pertenece la tabla o la vista.
table_or view_name
Nombre de la tabla o vista cuyas filas se van a quitar.
SQL Server 2014
[ WI TH <common_t abl e_expr essi on>[ , . . . n ] ]
DELETE
[ TOP ( expr essi on ) [ PERCENT ] ]
[ FROM]
{ { t abl e_al i as
| <obj ect >
| r owset _f unct i on_l i mi t ed
[ WI TH ( t abl e_hi nt _l i mi t ed [ . . . n ] ) ] }
| @t abl e_var i abl e
}
[ <OUTPUT Cl ause>]
[ FROMt abl e_sour ce [ , . . . n ] ]
[ WHERE { <sear ch_condi t i on>
| { [ CURRENT OF
{ { [ GLOBAL ] cur sor _name }
| cur sor _var i abl e_name
}
]
}
}
]
[ OPTI ON ( <Quer y Hi nt >[ , . . . n ] ) ]
[ ; ]
<obj ect >: : =
{
[ ser ver _name. dat abase_name. schema_name.
| dat abase_name. [ schema_name ] .
| schema_name.
]
t abl e_or _vi ew_name
}
En este mbito, se puede utilizar una variable de tabla como origen de tabla de una instruccin DELETE.
La vista a la que hace referencia table_or_view_name debe poderse actualizar y debe hacer referencia exactamente a una tabla base de la clusula FROM de la
definicin de vista. Para obtener ms informacin acerca de las vistas que se pueden actualizar, vea CREATE VIEW (Transact-SQL).
rowset_function_limited
Se aplica a: SQL Server 2008 a SQL Server 2014.
Funcin OPENQUERY u OPENROWSET, dependiendo del proveedor.
WITH ( <table_hint_limited> [... n] )
Especifica una o varias sugerencias de tabla que estn permitidas en una tabla de destino. La palabra clave WITH y los parntesis son obligatorios. No se
permiten NOLOCK ni READUNCOMMITTED. Para obtener ms informacin acerca de las sugerencias de tabla, vea Sugerencias de tabla (Transact-SQL).
<OUTPUT_Clause>
Devuelve filas eliminadas, o expresiones basadas en ellas, como parte de la operacin DELETE. La clusula OUTPUT no se admite en instrucciones DML dirigidas
a tablas o vistas remotas. Para obtener ms informacin, vea OUTPUT clusula de TransactSQL.
FROM table_source
Especifica una clusula FROM adicional. Esta extensin de TransactSQL para DELETE permite especificar datos de <table_source> y eliminar las filas
correspondientes de la tabla en la primera clusula FROM.
Se puede utilizar esta extensin, que especifica una combinacin, en lugar de una subconsulta en la clusula WHERE para identificar las filas que se van a quitar.
Para obtener ms informacin, vea FROM (Transact-SQL).
WHERE
Especifica las condiciones utilizadas para limitar el nmero de filas que se van a eliminar. Si no se proporciona una clusula WHERE, DELETE quita todas las filas
de la tabla.
Hay dos formas de operaciones de eliminacin, que se basan en las condiciones que se especifiquen en la clusula WHERE:
Las eliminaciones por bsqueda especifican una condicin de bsqueda que califica las filas que se van a eliminar. Por ejemplo, WHERE column_name =
value.
Las eliminaciones por posicin utilizan la clusula CURRENT OF para especificar un cursor. La operacin de eliminacin se produce en la posicin actual
del cursor. Este mtodo puede ser ms preciso que una instruccin DELETE por bsqueda que utilice una clusula WHERE search_condition para calificar
las filas que se van a eliminar. Una instruccin DELETE por bsqueda elimina varias filas si la condicin de bsqueda no identifica exclusivamente una nica
fila.
<search_condition>
Especifica las condiciones restrictivas de las filas que se van a eliminar. No hay lmite en el nmero de predicados que se pueden incluir en una condicin de
bsqueda. Para obtener ms informacin, vea Condiciones de bsqueda TransactSQL.
CURRENT OF
Especifica que la instruccin DELETE se ejecutar en la posicin actual del cursor especificado.
GLOBAL
Especifica que cursor_name hace referencia a un cursor global.
cursor_name
Es el nombre del cursor abierto desde el que se realiza la captura. Si hay un cursor global y otro local con el nombre cursor_name, este argumento hace
referencia al cursor global si se especifica GLOBAL; de lo contrario, hace referencia al cursor local. El cursor debe permitir actualizaciones.
cursor_variable_name
Nombre de una variable de cursor. La variable de cursor debe hacer referencia a un cursor que permita realizar actualizaciones.
OPTION ( <query_hint> [ ,... n] )
Palabras clave que indican que se utilizan sugerencias del optimizador para personalizar el procesamiento de la instruccin por parte del Motor de base de
datos. Para obtener ms informacin, vea Sugerencias de consulta (Transact-SQL).
Prcticas recomendadas
Para eliminar todas las filas de una tabla, use TRUNCATE TABLE. TRUNCATE TABLE es ms rpido que DELETE y utiliza menos recursos de los registros de transacciones
y de sistema. TRUNCATE TABLE tiene restricciones; por ejemplo, la tabla no puede participar en la replicacin. Para obtener ms informacin, vea TRUNCATE TABLE
(Transact-SQL).
Use la funcin @@ROWCOUNT para devolver el nmero de filas eliminadas a la aplicacin cliente. Para obtener ms informacin, vea @@ROWCOUNT (Transact-SQL).
Tratamiento de errores
Puede implementar el control de errores de la instruccin DELETE especificando la instruccin en una construccin TRYCATCH.
La instruccin 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 restriccin
FOREIGN KEY. Si la instruccin DELETE quita varias filas y cualquiera de las filas eliminadas infringe un desencadenador o restriccin, se cancela la instruccin, se
devuelve un error y no se elimina ninguna fila.
Cuando una instruccin DELETE encuentra un error aritmtico desbordamiento, divisin entre cero o error de dominio al evaluar una expresin, el Motor de base de
datos trata ese error como si SET ARITHABORT fuese ON. Se cancela el resto del proceso por lotes y se devuelve un mensaje de error.
Interoperabilidad
Es posible utilizar DELETE en el cuerpo de una funcin definida por el usuario si el objeto que se va a modificar es una variable de tabla.
Al eliminar una fila que contiene una columna FILESTREAM, tambin elimina los archivos del sistema de archivos subyacentes. El recolector de elementos no utilizados
de FILESTREAM quita los archivos subyacentes. Para obtener ms informacin, vea Obtener acceso a datos FILESTREAM con Transact-SQL.
No se puede especificar la clusula FROM en una instruccin DELETE que haga referencia, directa o indirectamente, a una vista que tiene definido un desencadenador
INSTEAD OF. Para obtener ms informacin acerca de los desencadenadores INSTEAD OF, vea CREATE TRIGGER (Transact-SQL).
Limitaciones y restricciones
Cuando se usa TOP con DELETE, las filas a las que hace referencia no estn organizadas de ninguna manera y la clusula ORDER BY no se puede especificar
directamente en esta instruccin. Si necesita utilizar TOP para eliminar filas por un orden cronolgico significativo, debe usar TOP junto con una clusula ORDER BY en
una instruccin de subseleccin. Vea la seccin Ejemplos que aparece ms adelante en este tema.
TOP no se puede usar en una instruccin DELETE con vistas divididas en particiones.
Comportamiento del bloqueo
De forma predeterminada, una instruccin DELETE siempre adquiere un bloqueo exclusivo X en la tabla que modifica y retiene ese bloqueo hasta que se completa la
transaccin. 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. Puede especificar sugerencias de tabla para invalidar este comportamiento
predeterminado durante la ejecucin de la instruccin DELETE especificando otro mtodo 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. Para obtener ms informacin, vea Sugerencias de tabla
(Transact-SQL).
Cuando se eliminan filas de un montn, Motor de base de datos puede usar bloqueo de filas o pginas para la operacin. Como consecuencia, las pginas que han
quedado vacas por la operacin de eliminacin permanecen asignadas al montn. Si no se cancela la asignacin de las pginas vacas, otros objetos de la base de
datos no pueden volver a utilizar el espacio asociado.
Para eliminar las filas de un montn y cancelar la asignacin de las pginas, use uno de los mtodos siguientes.
Especifique la sugerencia TABLOCK en la instruccin DELETE. Si se utiliza la sugerencia TABLOCK, la operacin de eliminacin aplica un bloqueo exclusivo a la
tabla, en lugar de un bloqueo de fila o de pgina. Esto permite cancelar la asignacin de las pginas. Para obtener ms informacin acerca de la sugerencia
TABLOCK, vea Sugerencias de tabla (Transact-SQL).
Se debe utilizar TRUNCATE TABLE si se van a eliminar todas las filas de la tabla.
Cree un ndice clster en el montn antes de eliminar las filas. Puede quitar el ndice clster tras eliminar las filas. Este mtodo requiere ms tiempo que los
mtodos anteriores y utiliza ms recursos temporales.
Comportamiento del registro
La instruccin DELETE siempre est registrada totalmente.
Seguridad
Permisos
Se requieren permisos DELETE en la tabla de destino. Tambin se requieren los permisos para utilizar SELECT si la instruccin contiene una clusula WHERE.
Los permisos para utilizar DELETE corresponden de forma predeterminada a los miembros del rol fijo de servidor sysadmin, de los roles fijos de base de datos
db_owner y db_datawriter y al propietario de la tabla. Los miembros de los roles sysadmin, db_owner y db_securityadmin y el propietario de la tabla pueden
transferir permisos a otros usuarios.
Ejemplos
Categora Elementos de sintaxis ofrecidos
Sintaxis bsica DELETE
Limitar las filas eliminadas WHERE FROM cursor
Eliminar filas de una tabla remota Servidor vinculado funcin de conjunto de filas OPENQUERY funcin de conjunto de
filas OPENDATASOURCE
Invalidar el comportamiento predeterminado del optimizador de consultas
mediante sugerencias
Sugerencias de tabla sugerencias de consulta
Capturar los resultados de la instruccin DELETE Clusula OUTPUT
Sintaxis bsica
En los ejemplos de esta seccin se muestra la funcionalidad bsica de la instruccin DELETE usando la sintaxis mnima requerida.
A.Utilizar DELETE sin la clusula WHERE
En el ejemplo siguiente se eliminan todas las filas de la tabla Sal esPer sonQuot aHi st or y de la base de datos AdventureWorks2012 porque no se utiliza una clusula
WHERE para limitar el nmero de filas eliminadas.
Limitar las filas eliminadas
En los ejemplos de esta seccin se muestra cmo se limita el nmero de filas que se van a eliminar.
A.Usar la clusula WHERE para eliminar un conjunto de filas
En el ejemplo siguiente se eliminan todas las filas de la tabla Pr oduct Cost Hi st or y de la base de datos AdventureWorks2012 en las que el valor de la columna
St andar dCost es superior a 1000. 00.
En el siguiente ejemplo se muestra una clusula WHERE ms compleja. La clusula WHERE define dos condiciones que deben cumplirse para determinar las filas que se
van a eliminar. El valor de la columna St andar dCost debe estar comprendido entre 12. 00 y 14. 00 y el valor de la columna Sel l EndDat e debe ser NULL. En el ejemplo
se imprime tambin el valor desde la funcin @@ROWCOUNT para devolver el nmero de filas eliminadas.
B.Usar un cursor para determinar la fila que se va a eliminar
En el ejemplo siguiente se elimina una fila nica de la tabla Empl oyeePayHi st or y de la base de datos AdventureWorks2012 mediante un cursor denominado mycur sor .
La operacin de eliminacin solo afecta a la nica fila que se captura actualmente del cursor.
C.Usar combinaciones y subconsultas en los datos de una tabla para eliminar filas de otra tabla
En los siguientes ejemplos se muestran dos maneras de eliminar filas de una tabla en funcin de los datos de otra tabla. En ambos ejemplos, se eliminan las filas de la
tabla Sal esPer sonQuot aHi st or y de la base de datos AdventureWorks2012 basndose en las ventas del ao hasta la fecha almacenadas en la tabla Sal esPer son. La
primera instruccin DELETE muestra la solucin de subconsulta compatible con ISO y la segunda instruccin DELETE muestra la extensin de FROM de Transact
SQL para unir las dos tablas.
DELETE FROMSal es. Sal esPer sonQuot aHi st or y;
GO
DELETE FROMPr oduct i on. Pr oduct Cost Hi st or y
WHERE St andar dCost >1000. 00;
GO
DELETE Pr oduct i on. Pr oduct Cost Hi st or y
WHERE St andar dCost BETWEEN 12. 00 AND 14. 00
AND EndDat e I S NULL;
PRI NT ' Number of r ows del et ed i s ' +CAST( @@ROWCOUNT as char ( 3) ) ;
DECLARE compl ex_cur sor CURSOR FOR
SELECT a. Busi nessEnt i t yI D
FROMHumanResour ces. Empl oyeePayHi st or y AS a
WHERE Rat eChangeDat e <>
( SELECT MAX( Rat eChangeDat e)
FROMHumanResour ces. Empl oyeePayHi st or y AS b
WHERE a. Busi nessEnt i t yI D =b. Busi nessEnt i t yI D) ;
OPEN compl ex_cur sor ;
FETCH FROMcompl ex_cur sor ;
DELETE FROMHumanResour ces. Empl oyeePayHi st or y
WHERE CURRENT OF compl ex_cur sor ;
CLOSE compl ex_cur sor ;
DEALLOCATE compl ex_cur sor ;
GO
- - SQL- 2003 St andar d subquer y
DELETE FROMSal es. Sal esPer sonQuot aHi st or y
WHERE Busi nessEnt i t yI D I N
( SELECT Busi nessEnt i t yI D
FROMSal es. Sal esPer son
WHERE Sal esYTD >2500000. 00) ;
GO
- - Tr ansact - SQL ext ensi on
A.Utilizar TOP para limitar el nmero de filas eliminadas
Cuando se utiliza una clusula TOP n con DELETE, la operacin de eliminacin se realiza en una seleccin aleatoria de n nmero de filas. En el ejemplo siguiente se
eliminan 20 filas aleatorias de la tabla Pur chaseOr der Det ai l de la base de datos AdventureWorks2012 cuyas fechas de vencimiento sean anteriores al primero de julio
de 2006.
Si necesita utilizar TOP para eliminar filas por un orden cronolgico significativo, debe utilizarla junto con ORDER BY en una instruccin de subseleccin. La siguiente
consulta elimina de la tabla Pur chaseOr der Det ai l las 10 filas con las fechas de vencimiento ms antiguas. Para garantizar que solo se eliminen 10 filas, la columna
especificada en la instruccin de subseleccin Pur chaseOr der I D) es la clave principal de la tabla. El uso de una columna sin clave en la instruccin de subseleccin
podra causar la eliminacin de ms de 10 filas si la columna especificada contiene valores duplicados.
Eliminar filas de una tabla remota
En los ejemplos de esta seccin se muestra cmo se eliminan filas de una tabla remota mediante un servidor vinculado o una funcin de conjunto de filas para hacer
referencia a la tabla remota. Una tabla remota existe en un servidor o instancia diferente de SQL Server.
Se aplica a: SQL Server 2008 a SQL Server 2014.
A.Eliminar datos de una tabla remota usando un servidor vinculado
En el ejemplo siguiente se eliminan filas de una tabla remota. En el ejemplo se comienza creando un vnculo al origen de datos remoto mediante sp_addlinkedserver. El
nombre del servidor vinculado, MyLi nkSer ver , se especifica entonces como parte del nombre de objeto de cuatro partes en el formato server.catalog.schema.object.
B.Eliminar datos de una tabla remota con la funcin OPENQUERY
En el ejemplo siguiente se eliminan filas de una tabla remota especificando la funcin de conjunto de filas OPENQUERY. En este ejemplo se usa el nombre del servidor
vinculado creado en el ejemplo anterior.
C.Eliminar datos de una tabla remota con una funcin OPENDATASOURCE
En el ejemplo siguiente se elimina una fila de una tabla remota especificando la funcin de conjunto de filas OPENDATASOURCE. Especifique un nombre de servidor
vlido para el origen de datos con el formato server_name o server_name\instance_name.
DELETE FROMSal es. Sal esPer sonQuot aHi st or y
FROMSal es. Sal esPer sonQuot aHi st or y AS spqh
I NNER J OI N Sal es. Sal esPer son AS sp
ON spqh. Busi nessEnt i t yI D =sp. Busi nessEnt i t yI D
WHERE sp. Sal esYTD >2500000. 00;
GO
DELETE TOP ( 20)
FROMPur chasi ng. Pur chaseOr der Det ai l
WHERE DueDat e <' 20020701' ;
GO
DELETE FROMPur chasi ng. Pur chaseOr der Det ai l
WHERE Pur chaseOr der Det ai l I D I N
( SELECT TOP 10 Pur chaseOr der Det ai l I D
FROMPur chasi ng. Pur chaseOr der Det ai l
ORDER BY DueDat e ASC) ;
GO
USE mast er ;
GO
- - Cr eat e a l i nk t o t he r emot e dat a sour ce.
- - Speci f y a val i d ser ver name f or @dat asr c as ' ser ver _name' or ' ser ver _name\ i nst ance_name' .
EXEC sp_addl i nkedser ver @ser ver =N' MyLi nkSer ver ' ,
@sr vpr oduct =N' ' ,
@pr ovi der =N' SQLNCLI ' ,
@dat asr c =N' ser ver _name' ,
@cat al og =N' Advent ur eWor ks2012' ;
GO
- - Speci f y t he r emot e dat a sour ce usi ng a f our - par t name
- - i n t he f or ml i nked_ser ver . cat al og. schema. obj ect .
DELETE MyLi nkSer ver . Advent ur eWor ks2012. HumanResour ces. Depar t ment WHERE Depar t ment I D >16;
GO
DELETE OPENQUERY ( MyLi nkSer ver , ' SELECT Name, Gr oupName FROMAdvent ur eWor ks2012. HumanResour ces. Depar t ment
WHERE Depar t ment I D =18' ) ;
GO
Capturar los resultados de la instruccin DELETE
A.Usar DELETE con la clusula OUTPUT
En el ejemplo siguiente se muestra cmo se guardan los resultados de una instruccin DELETE en una variable de tabla en la base de datos AdventureWorks2012.
B.Usar OUTPUT con <from_table_name> en una instruccin DELETE
En el ejemplo siguiente se eliminan las filas de la tabla Pr oduct Pr oduct Phot o de la base de datos AdventureWorks2012 segn los criterios de bsqueda definidos en la
clusula FROMde la instruccin DELETE. La clusula OUTPUT devuelve columnas de la tabla que se elimina (DELETED. Pr oduct I D, DELETED. Pr oduct Phot oI D) y de la tabla
Pr oduct . Esta informacin se utiliza en la clusula FROMpara especificar las filas que se deben eliminar.
Vea tambin
Referencia
CREATE TRIGGER (Transact-SQL)
INSERT (Transact-SQL)
SELECT (Transact-SQL)
TRUNCATE TABLE (Transact-SQL)
UPDATE (Transact-SQL)
WITH common_table_expression (Transact-SQL)
@@ROWCOUNT (Transact-SQL)
2014 Microsoft
DELETE FROMOPENDATASOURCE( ' SQLNCLI ' ,
' Dat a Sour ce=<ser ver _name>; I nt egr at ed Secur i t y=SSPI ' )
. Advent ur eWor ks2012. HumanResour ces. Depar t ment
WHERE Depar t ment I D =17; '
DELETE Sal es. Shoppi ngCar t I t em
OUTPUT DELETED. *
WHERE Shoppi ngCar t I D =20621;
- - Ver i f y t he r ows i n t he t abl e mat chi ng t he WHERE cl ause have been del et ed.
SELECT COUNT( *) AS [ Rows i n Tabl e] FROMSal es. Shoppi ngCar t I t emWHERE Shoppi ngCar t I D =20621;
GO
DECLARE @MyTabl eVar t abl e (
Pr oduct I D i nt NOT NULL,
Pr oduct Name nvar char ( 50) NOT NULL,
Pr oduct Model I D i nt NOT NULL,
Phot oI D i nt NOT NULL) ;
DELETE Pr oduct i on. Pr oduct Pr oduct Phot o
OUTPUT DELETED. Pr oduct I D,
p. Name,
p. Pr oduct Model I D,
DELETED. Pr oduct Phot oI D
I NTO @MyTabl eVar
FROMPr oduct i on. Pr oduct Pr oduct Phot o AS ph
J OI N Pr oduct i on. Pr oduct as p
ON ph. Pr oduct I D =p. Pr oduct I D
WHERE p. Pr oduct Model I D BETWEEN 120 and 130;
- - Di spl ay t he r esul t s of t he t abl e var i abl e.
SELECT Pr oduct I D, Pr oduct Name, Pr oduct Model I D, Phot oI D
FROM@MyTabl eVar
ORDER BY Pr oduct Model I D;
GO

Potrebbero piacerti anche