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 table.
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. 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.
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 Database Engine (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.
La configuración de la opción SET ROWCOUNT se ignora en las instrucciones DELETE con tablas remotas y vistas divididas remotas y locales.
Si desea eliminar todas las filas de una tabla, use la instrucción DELETE sin especificar una cláusula WHERE o use TRUNCATE TABLE. TRUNCATE TABLE es más rápido que DELETE y utiliza menos recursos de los registros de transacciones y de sistema.
Eliminar filas de un montón
Cuando se eliminan filas de un montón, Database Engine (Motor de base de datos) puede usar bloqueo de filas o páginas para la operación. Como consecuencia, las páginas que han quedado vacías por la operación de eliminación permanecen asignadas al montón. 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.
Para eliminar las filas de un montón y cancelar la asignación de las páginas, use uno de los métodos siguientes.
-
Especifique la sugerencia TABLOCK en la instrucción DELETE. Si se utiliza la sugerencia TABLOCK, la operación de eliminación aplica un bloqueo compartido a la tabla, en lugar de un bloqueo de fila o de página. Esto permite cancelar la asignación de las páginas. Para obtener más información 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 agrupado en el montón antes de eliminar las filas. Puede quitar el índice agrupado tras eliminar las filas. Este método requiere más tiempo que los métodos anteriores y utiliza más recursos temporales.
Para obtener más información acerca de los bloqueos, vea Bloquear el motor de base de datos.
Utilizar un desencadenador INSTEAD OF en acciones DELETE
Cuando se define un desencadenador INSTEAD OF en las acciones DELETE en una tabla o vista, se ejecuta el desencadenador en lugar de la instrucción DELETE. Las versiones anteriores de SQL Server sólo admitían desencadenadores AFTER en DELETE y otras instrucciones de modificación de datos. 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. Para obtener más información acerca de los desencadenadores INSTEAD OF, vea CREATE TRIGGER (Transact-SQL).