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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| CREATE PROCEDURE usp_SAVE_tables_cleanup
AS
BEGIN
SET NOCOUNT ON
DECLARE @error_code int
, @error_message nvarchar(2048)
, @sql nvarchar(max)
DECLARE @SAVE_tables TABLE
(
table_object_id int NOT NULL
, table_name sysname
, table_row_count bigint NOT NULL
)
INSERT INTO @SAVE_tables
(
table_object_id
, table_name
, table_row_count
)
SELECT T.object_id
, T.name
, SUM(PS.row_count) AS total_row_count
FROM sys.tables AS T
INNER JOIN sys.schemas AS S
ON T.schema_id = S.schema_id
INNER JOIN sys.dm_db_partition_stats AS PS
ON PS.object_id = T.object_id
WHERE T.name LIKE 'SAVE%'
AND S.name = 'dbo'
GROUP BY T.object_id
, T.name
SELECT @sql = CASE
WHEN @sql IS NULL THEN 'DROP TABLE ' + S.name + '.' + T.name
ELSE @sql + ', ' + S.name + '.' + T.name
END
FROM sys.tables AS T
INNER JOIN sys.schemas AS S
ON T.schema_id = S.schema_id
WHERE T.name LIKE 'SAVE%'
AND S.name = 'dbo'
BEGIN TRY
BEGIN TRANSACTION
EXEC sp_executesql 'DROP TABLE test, tutu'
COMMIT TRANSACTION
END TRY
BEGIN CATCH
SELECT @error_code = ERROR_NUMBER()
, @error_message = ERROR_MESSAGE()
ROLLBACK TRANSACTION
END CATCH
IF @error_code IS NULL
BEGIN
INSERT INTO dbo.myDroppedTables
(
droppped_date
table_object_id
, table_name
, table_row_count
)
SELECT GETDATE()
, table_object_id
, table_name
, table_row_count
FROM @SAVE_tables
END
ELSE
BEGIN
RAISERROR(@error_message, 16, 1)
RETURN
END
END |
Partager