Mover datos antiguos en SQL Server

Cuando trabajamos con bases de datos muy grandes las tablas puede que vayan almacenando datos antiguos que queremos guardar pero que realmente no son necesarios para el día a día de la aplicación, lo correcto sería mover todos estos datos antiguos a otra tabla para agilizar las consultas sobre la tabla original (se puede considerar moverlos a otra base de datos pero esto realmente no es necesario)

En SQL Server 2008 R2 este proceso resulta bastante sencillo de implementar y lo único que necesitamos es una tabla idéntica en campos a la original con otro nombre y sin claves foráneas ni primarias (los índices únicos se pueden mantener pero realmente esto no es necesario).

Pongamos como ejemplo que tenemos una tabla llamada clientes y que queremos mover los clientes que ya no se encuentran activos a la tabla archivo_clientes.

Para crear la nueva tabla en el editor del SQL Managment Studio hacemos click derecho sobre la tabla siguientes y seguimos este orden en los menús: Incluir tabla como > CREATE TO > Nueva ventana del editor de consultas (ver imagen siguiente)

Sin-título-1

Con esto nos saldría toda la estructura de la tabla en el editor de consultar y solo nos quedaría eliminar la clave primaria, las foreign keys y cambiar el nombre de la tabla en el editor por archivo_clientes.

Una vez creada la nueva tabla sin claves externas ni primaria y con otro nombre lo único que nos queda es mover los datos antiguos de una tabla a otra y esto lo podemos hacer con una simple consulta.

Consulta SQL para mover los datos antiguos de una tabla a otra en SQL Server

DELETE FROM clientes
OUTPUT DELETED.* INTO archivo_cliente
WHERE Fecha < DATEADD(D,-30,GETDATE())

Yo particularmente prefiero sustituir en la consulta anterior (tomada del blog de Francisco Javier Areas Ríos) la función GETDATE() por la constante CURRENT_TIMESTAMP, pero esto es cuestión de gustos.

La consulta anterior solo mueve los clientes con 30 días de antigüedad para más opciones de la función DATEADD de SQL Server consultar el manual de MSDN.

Con estos sencillos pasos podemos tener optimizadas nuestras tablas grandes solo con los datos que realmente necesitamos, su aplicación puede ir desde tablas de clientes hasta tablas con datos de facturación de años pasados.

Importante: no eliminar la clave principal de la tabla que va a almacenar los datos antiguos nos puede traer errores del tipo: An explicit value for the identity column in table ‘table_name’ can only be specified when a column list is used and IDENTITY_INSERT is ON.

Si bien el error anterior se debería solucionar con esta secuencia de instrucciones siguiente a mi particularmente no me funcionó:

-- Enable IDENTITY_INSERT.
SET IDENTITY_INSERT tblTest ON
GO
-- Insert the specified identity row using a column list.
INSERT INTO tblTest (iID, strData) values (2, 'Davolio')
GO
-- Disable IDENTITY_INSERT.
SET IDENTITY_INSERT tblTest OFF
GO

Esta solución al problema de IDENTITY_INSERT está tomada de la página codeguru.

Comentarios