Quelque chose comme ce:
DECLARE @stillgoing bit;
SET @stillgoing = 1;
WHILE @stillgoing = 1
BEGIN
DELETE TOP (100) YourTableName
WHERE IsObsolete = 1;
IF @@ROWCOUNT = 0
SET @stillgoing = 0;
CHECKPOINT /* Will encourage the log to clear if it's in Simple recovery model */
END
Modifier: Cela ne fonctionnera que dans SQL 2005 et sur. Comme nous venons d'apprendre qu'il est SQL 2000, ce code à la place:
DECLARE @stillgoing bit
SET @stillgoing = 1
SET ROWCOUNT 100
WHILE @stillgoing = 1
BEGIN
DELETE YourTableName
WHERE IsObsolete = 1
IF @@ROWCOUNT = 0
SET @stillgoing = 0
CHECKPOINT /* Will encourage the log to clear if it's in Simple recovery model */
END
Et ... Modèle de récupération simple signifie que le journal tronque sur les points de contrôle, plutôt que lorsque le journal est sauvegardé.
Si la quantité de données que vous souhaitez conserver est petit et vous n'avez pas besoin des suppressions dans le journal des transactions, vous pourriez être mieux copier les données que vous souhaitez conserver une table temporaire, tronquer original tableau, puis en recopiant les données. – lins314159
Thx la belle suggestion, mais c'est dangereux car il est en ligne et ne peut pas prédire quand les utilisateurs vont interroger cette table. BTW: la table a grandi à 4 Go. – Ricky