Estoy intentando archivar registros de una tabla en una base de datos en una tabla idéntica en una base de datos de archivo. Necesito poder hacer una inserción para todos los registros con una fecha de más de tres años atrás, y luego eliminar esas filas. Sin embargo, esta tabla tiene millones de registros en vivo, por lo que quiero ejecutar esto en un bucle de aproximadamente 100 a 1000 fragmentos a la vez. Hasta ahora, mi procedimiento almacenado hace la instrucción de inserción completa, luego una declaración de eliminación (en una transacción) con esencialmente la misma cláusula WHERE que la instrucción de inserción. Mi ciclo WHILE busca la fecha más antigua de la tabla para determinar cuándo se completa el ciclo. Algo de esto parece bastante ineficiente. ¿Hay alguna manera de hacer una inserción y eliminar en el fragmento de registros sin tener que buscarlos dos veces en la misma ejecución de bucle? ¿Hay una mejor manera de determinar cuándo se completa la instrucción WHILE? Con MS SQL Server 2000.SQL Archive Script
Ésta es mi procedimiento actual (ISAdminDB es la principal base de datos, IsArchive es la base de datos de archivo):
WHILE ((SELECT MIN([MyTable].[DateTime]) FROM [ISAdminDB].[dbo].[MyTable]) < DATEADD(d, -(3 * 365), GetDate()))
BEGIN
INSERT INTO [ISArchive].[dbo].[MyTable]
(<Fields>)
SELECT TOP 1000 (<Fields>)
FROM [ISAdminDB].[dbo].[MyTable]
WHERE
[MyTable].[DateTime] < DATEADD(d, -(3 * 365), GetDate())
AND UniqueID in (SELECT TOP 1000 UniqueID FROM [ISAdminDB].[dbo].[MyTable] ORDER BY [MyTable].[DateTime] ASC)
BEGIN TRAN
DELETE FROM [ISAdminDB].[dbo].[MyTable]
WHERE [MyTable].[DateTime] < DATEADD(d, -(3 * 365), GetDate())
AND (UniqueID in (SELECT TOP 1000 UniqueID FROM [ISAdminDB].[dbo].[MyTable] ORDER BY [MyTable].[DateTime] ASC))
COMMIT
END
Qué RDBMS? SQL Server, MySQL, ¿algo más? – MartW
Disculpas, MS SQL Server 2000. – Kevin
Supongo que SQL Server – MartW