So how do you DELETE thousands/millions of rows from a table without blocking anyone for long periods of time?
Well, here is an example:
DECLARE @Count INT
DECLARE @Error INT
SELECT @Count = COUNT(*)
FROM SomeTable MLE
WHERE SomeDateColumn < (GETDATE() - 182) -- anything older than 6 months
SET ROWCOUNT 10000
WHILE @Count > 0
BEGIN
BEGIN TRAN
DELETE FROM SomeTable
WHERE SomeDateColumn < (GETDATE() - 182)
SELECT @Error = @@ERROR
IF @@ERROR = 0
COMMIT TRAN
ELSE
ROLLBACK TRAN
CHECKPOINT
SELECT @Count = COUNT(*)
FROM SomeTable
WHERE SomeDateColumn < (GETDATE() - 182)
END
SET ROWCOUNT 0
SET NOCOUNT OFF