-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsp_DeleteInBatches.sql
More file actions
53 lines (48 loc) · 1.56 KB
/
Copy pathsp_DeleteInBatches.sql
File metadata and controls
53 lines (48 loc) · 1.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE OR ALTER PROCEDURE dbo.sp_DeleteInBatches
@deleteTableName sysname,
@keysTableName sysname,
@columnName sysname,
@BatchSize int = 1000,
@debug bit = 0
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
DECLARE @rowCount INT = 0
DECLARE @totalDeletedCount INT = 0
DECLARE @Offset INT = 0
DECLARE @keysCount INT = 0
DECLARE @sql NVARCHAR(MAX)
DECLARE @message NVARCHAR(MAX)
SET @message = 'Deleting records from ' + @deleteTableName +'.'
PRINT @message
SET @sql = 'SELECT @KeysCount = COUNT(1) FROM '+ @keysTableName
EXEC sp_executeSQL @sql, N'@KeysCount INT output', @keysCount=@keysCount output
SELECT @rowCount =1, @Offset = 0
WHILE @rowCount > 0 AND @Offset < @keysCount
BEGIN
SET @sql = 'DELETE TOP (' +cast( @BatchSize +1 as NVARCHAR(10) ) + ') FROM ' + @deleteTableName
+ ' WHERE ' + @columnName + ' IN (SELECT ' + @columnName + ' FROM ' + @keysTableName
+ ' ORDER BY 1 OFFSET ' + cast( @Offset as NVARCHAR(10) )
+ ' ROWS FETCH NEXT ' + cast( @BatchSize as NVARCHAR(10) ) + ' ROWS ONLY);'
IF @debug = 1
PRINT @sql
EXEC @rowCount = sp_executeSqlWithRetries @dynamicSQL = @sql
SET @totalDeletedCount = @totalDeletedCount + @rowCount
IF @rowCount <= @BatchSize
SET @Offset = @Offset + @BatchSize
END
SET @message = 'Deleted ' +cast( @totalDeletedCount as NVARCHAR(10) ) + ' records from ' + @deleteTableName +'.'
PRINT @message
END TRY
BEGIN CATCH
THROW;
END CATCH
RETURN @totalDeletedCount
END