TRUNCATE TABLE (Transact-SQL)TRUNCATE TABLE (Transact-SQL)
Se aplica a:Applies to: SQL ServerSQL Server (todas las versiones admitidas)
SQL ServerSQL Server (all supported versions)
Azure SQL DatabaseAzure SQL Database
Azure SQL DatabaseAzure SQL Database
Instancia administrada de Azure SQLAzure SQL Managed Instance
Instancia administrada de Azure SQLAzure SQL Managed Instance
Azure Synapse AnalyticsAzure Synapse Analytics
Azure Synapse AnalyticsAzure Synapse Analytics
Almacenamiento de datos paralelosParallel Data Warehouse
Almacenamiento de datos paralelosParallel Data Warehouse
SQL ServerSQL Server (todas las versiones admitidas)
SQL ServerSQL Server (all supported versions)
Azure SQL DatabaseAzure SQL Database
Azure SQL DatabaseAzure SQL Database
Instancia administrada de Azure SQLAzure SQL Managed Instance
Instancia administrada de Azure SQLAzure SQL Managed Instance
Azure Synapse AnalyticsAzure Synapse Analytics
Azure Synapse AnalyticsAzure Synapse Analytics
Almacenamiento de datos paralelosParallel Data Warehouse
Almacenamiento de datos paralelosParallel Data Warehouse
Quita todas las filas de una tabla o las particiones especificadas de una tabla, sin registrar las eliminaciones individuales de filas.Removes all rows from a table or specified partitions of a table, without logging the individual row deletions. TRUNCATE TABLE es similar a la instrucción DELETE sin una cláusula WHERE; no obstante, TRUNCATE TABLE es más rápida y utiliza menos recursos de registros de transacciones y de sistema.TRUNCATE TABLE is similar to the DELETE statement with no WHERE clause; however, TRUNCATE TABLE is faster and uses fewer system and transaction log resources.
Convenciones de sintaxis de Transact-SQL
Transact-SQL Syntax Conventions
SintaxisSyntax
-- Syntax for SQL Server and Azure SQL Database
TRUNCATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
[ WITH ( PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ) ]
[ ; ]
<range> ::=
<partition_number_expression> TO <partition_number_expression>
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse
TRUNCATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
[;]
Nota
Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte Versiones anteriores de la documentación.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.
ArgumentosArguments
database_namedatabase_name
Es el nombre de la base de datos.Is the name of the database.
schema_nameschema_name
Es el nombre del esquema al que pertenece la tabla.Is the name of the schema to which the table belongs.
table_nametable_name
Es el nombre de la tabla que se va a truncar o de la que se van a quitar todas las filas.Is the name of the table to truncate or from which all rows are removed. table_name debe ser un valor literal.table_name must be a literal. table_name no puede ser la variable o la función de OBJECT_ID() .table_name cannot be the OBJECT_ID() function or a variable.
WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) )WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) )
Se aplica a: SQL ServerSQL Server (desde SQL Server 2016 (13.x)SQL Server 2016 (13.x) hasta la versión actual)Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version)
Especifica las particiones para truncar o desde las que se quitan todas las filas.Specifies the partitions to truncate or from which all rows are removed. Si la tabla no se particiona, el argumento WITH PARTITIONS
generará un error.If the table is not partitioned, the WITH PARTITIONS
argument will generate an error. Si no se especifica la cláusula WITH PARTITIONS
, se truncará toda la tabla.If the WITH PARTITIONS
clause is not provided, the entire table will be truncated.
<partition_number_expression> se puede especificar de estas maneras:<partition_number_expression> can be specified in the following ways:
Proporcionando el número de una partición, como por ejemplo:
WITH (PARTITIONS (2))
Provide the number of a partition, for example:WITH (PARTITIONS (2))
Proporcionando los números de partición para varias particiones individuales separadas por comas, como por ejemplo:
WITH (PARTITIONS (1, 5))
Provide the partition numbers for several individual partitions separated by commas, for example:WITH (PARTITIONS (1, 5))
Proporcionando ambos intervalos y particiones individuales, como por ejemplo:
WITH (PARTITIONS (2, 4, 6 TO 8))
Provide both ranges and individual partitions, for example:WITH (PARTITIONS (2, 4, 6 TO 8))
<range> se puede especificar como números de partición separados por la palabra TO, como por ejemplo:
WITH (PARTITIONS (6 TO 8))
<range> can be specified as partition numbers separated by the word TO, for example:WITH (PARTITIONS (6 TO 8))
Para truncar una tabla con particiones, la tabla y los índices deben estar alineados (con particiones en la misma función de partición).To truncate a partitioned table, the table and indexes must be aligned (partitioned on the same partition function).
ObservacionesRemarks
En comparación con la instrucción DELETE, TRUNCATE TABLE
ofrece las siguientes ventajas:Compared to the DELETE statement, TRUNCATE TABLE
has the following advantages:
Se utiliza menos espacio del registro de transacciones.Less transaction log space is used.
La instrucción DELETE quita una a una las filas y graba una entrada en el registro de transacciones por cada fila eliminada.The DELETE statement removes rows one at a time and records an entry in the transaction log for each deleted row.
TRUNCATE TABLE
quita los datos al cancelar la asignación de las páginas de datos utilizadas para almacenar los datos de la tabla y solo graba en el registro de transacciones las cancelaciones de asignación de páginas.TRUNCATE TABLE
removes the data by deallocating the data pages used to store the table data and records only the page deallocations in the transaction log.Por regla general, se utilizan menos bloqueos.Fewer locks are typically used.
Si se ejecuta la instrucción DELETE con un bloqueo de fila, se bloquea cada fila de la tabla para su eliminación.When the DELETE statement is executed using a row lock, each row in the table is locked for deletion.
TRUNCATE TABLE
siempre bloquea la tabla (incluido un bloqueo de esquema (SCH-M)) y la página, pero no cada fila.TRUNCATE TABLE
always locks the table (including a schema (SCH-M) lock) and page but not each row.Las páginas cero se conservan en la tabla sin excepciones.Without exception, zero pages are left in the table.
Después de ejecutar una instrucción DELETE, la tabla puede seguir conteniendo páginas vacías.After a DELETE statement is executed, the table can still contain empty pages. Por ejemplo, no se puede cancelar la asignación de las páginas vacías de un montón sin un bloqueo de tabla exclusivo (LCK_M_X) como mínimo.For example, empty pages in a heap cannot be deallocated without at least an exclusive (LCK_M_X) table lock. Si en la operación de eliminación no se utiliza un bloqueo de tabla, la tabla (montón) contiene muchas páginas vacías.If the delete operation does not use a table lock, the table (heap) will contain many empty pages. En el caso de los índices, la operación de eliminación puede dejar páginas vacías, aunque la asignación de estas páginas se puede cancelar rápidamente mediante un proceso de limpieza en segundo plano.For indexes, the delete operation can leave empty pages behind, although these pages will be deallocated quickly by a background cleanup process.
TRUNCATE TABLE
quita todas las filas de una tabla, pero permanecen la estructura y sus columnas, las restricciones, los índices, etc.TRUNCATE TABLE
removes all rows from a table, but the table structure and its columns, constraints, indexes, and so on remain. Para quitar la definición de tabla además de los datos, utilice la instrucción DROP TABLE
.To remove the table definition in addition to its data, use the DROP TABLE
statement.
Si la tabla contiene una columna de identidad, el contador para dicha columna se restablece al valor de inicialización definido para ella.If the table contains an identity column, the counter for that column is reset to the seed value defined for the column. Si no se define ningún valor de inicialización, se utiliza el valor predeterminado 1.If no seed was defined, the default value 1 is used. Para conservar el contador de identidad, utilice DELETE.To retain the identity counter, use DELETE instead.
Nota
Se puede revertir una operación TRUNCATE TABLE
.A TRUNCATE TABLE
operation can be rolled back.
RestriccionesRestrictions
No se puede usar TRUNCATE TABLE
en los siguientes casos:You cannot use TRUNCATE TABLE
on tables that:
Tablas a las que se hace referencia mediante una restricción FOREIGN KEY.Are referenced by a FOREIGN KEY constraint. (Puede truncar una tabla que tenga una clave externa que haga referencia a sí misma).You can truncate a table that has a foreign key that references itself.
Tablas que participan en una vista indizada.Participate in an indexed view.
Tablas que se publican mediante replicación transaccional o replicación de mezcla.Are published by using transactional replication or merge replication.
Tablas temporales con versiones del sistema.Are system-versioned temporal.
Tablas a las que se hace referencia con una restricción EDGE.Are referenced by an EDGE constraint.
En el caso de las tablas con una o más de estas características, utilice la instrucción DELETE.For tables with one or more of these characteristics, use the DELETE statement instead.
TRUNCATE TABLE no puede activar un desencadenador porque la operación no registra eliminaciones de filas individuales.TRUNCATE TABLE cannot activate a trigger because the operation does not log individual row deletions. Para obtener más información, vea CREATE TRIGGER (Transact-SQL).For more information, see CREATE TRIGGER (Transact-SQL).
En Azure Synapse AnalyticsAzure Synapse Analytics y Almacenamiento de datos paralelosParallel Data Warehouse:In Azure Synapse AnalyticsAzure Synapse Analytics and Almacenamiento de datos paralelosParallel Data Warehouse:
TRUNCATE TABLE
no se permite dentro de la instrucción EXPLAIN.TRUNCATE TABLE
is not allowed within the EXPLAIN statement.TRUNCATE TABLE
no se puede ejecutar dentro de una transacción.TRUNCATE TABLE
cannot be ran inside of a transaction.
Truncar tablas de gran tamañoTruncating Large Tables
MicrosoftMicrosoft SQL ServerSQL Server ofrece la posibilidad de quitar o truncar las tablas con más de 128 extensiones sin mantener bloqueos simultáneos en todas las extensiones necesarias para la eliminación.SQL ServerSQL Server has the ability to drop or truncate tables that have more than 128 extents without holding simultaneous locks on all the extents required for the drop.
PermisosPermissions
El permiso mínimo necesario es ALTER
en table_name.The minimum permission required is ALTER
on table_name. Los permisos TRUNCATE TABLE
se adjudican de manera predeterminada al propietario de la tabla, a los miembros del rol fijo de servidor sysadmin
y a los roles fijos de base de datos db_owner
y db_ddladmin
, y no se pueden transferir.TRUNCATE TABLE
permissions default to the table owner, members of the sysadmin
fixed server role, and the db_owner
and db_ddladmin
fixed database roles, and are not transferable. No obstante, puede incorporar la instrucción TRUNCATE TABLE
en un módulo, por ejemplo un procedimiento almacenado, y conceder los permisos correspondientes al módulo mediante la cláusula EXECUTE AS
.However, you can incorporate the TRUNCATE TABLE
statement within a module, such as a stored procedure, and grant appropriate permissions to the module using the EXECUTE AS
clause.
EjemplosExamples
A.A. Truncar una tablaTruncate a Table
En el siguiente ejemplo se quitan todos los datos de la tabla JobCandidate
.The following example removes all data from the JobCandidate
table. Se incluyen instrucciones SELECT
antes y después de la instrucción TRUNCATE TABLE
para comparar los resultados.SELECT
statements are included before and after the TRUNCATE TABLE
statement to compare results.
USE AdventureWorks2012;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;
GO
B.B. Truncar la tabla de particionesTruncate Table Partitions
Se aplica a: SQL ServerSQL Server (desde SQL Server 2016 (13.x)SQL Server 2016 (13.x) hasta la versión actual)Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version)
En el ejemplo siguiente se trunca las particiones especificadas de una tabla con particiones.The following example truncates specified partitions of a partitioned table. La sintaxis de WITH (PARTITIONS (2, 4, 6 TO 8))
provoca que los números de partición 2, 4, 6, 7 y 8 se trunquen.The WITH (PARTITIONS (2, 4, 6 TO 8))
syntax causes partition numbers 2, 4, 6, 7, and 8 to be truncated.
TRUNCATE TABLE PartitionTable1
WITH (PARTITIONS (2, 4, 6 TO 8));
GO
Consulte tambiénSee Also
DELETE (Transact-SQL) DELETE (Transact-SQL)
DROP TABLE (Transact-SQL) DROP TABLE (Transact-SQL)
IDENTITY (propiedad de Transact-SQL)IDENTITY (Property) (Transact-SQL)