Dynami c хранимая процедура для архивирования данных в другие таблицы - PullRequest
0 голосов
/ 20 марта 2020
CREATE PROCEDURE dbo.ArchiveData
    (@CutOffDate datetime = NULL)
AS
BEGIN
    SET NOCOUNT ON

    IF @CutOffDate IS NULL 
    BEGIN
        SET @CutOffDate = DATEADD(mm, -6, CURRENT_TIMESTAMP)
    END
    ELSE
    BEGIN
        IF @CutOffDate > DATEADD(mm, -3, CURRENT_TIMESTAMP)
        BEGIN
            RAISERROR ('Cannot delete orders from last three months', 16, 1)
            RETURN -1
        END
    END

    BEGIN TRAN
        INSERT INTO Archive.dbo.Orders
            SELECT * 
            FROM dbo.Orders
            WHERE OrderDate < @CutOffDate

        IF @@ERROR <> 0
        BEGIN
            ROLLBACK TRAN
            RAISERROR ('Error occurred while copying data to Archive.dbo.Orders', 16, 1)
            RETURN -1
        END

        INSERT INTO Archive.dbo.OrderDetails
            SELECT *
            FROM dbo.OrderDetails
            WHERE OrderID IN (SELECT OrderID
                              FROM dbo.Orders
                              WHERE OrderDate < @CutOffDate)

        IF @@ERROR <> 0
        BEGIN
            ROLLBACK TRAN
            RAISERROR ('Error occurred while copying data to  Archive.dbo.OrderDetails', 16, 1)
            RETURN -1
        END

        DELETE dbo.OrderDetails
        WHERE OrderID IN (SELECT OrderID
                          FROM dbo.Orders
                          WHERE OrderDate < @CutOffDate)

        IF @@ERROR <> 0
        BEGIN
            ROLLBACK TRAN
            RAISERROR ('Error occurred while deleting data from dbo.OrderDetails', 16, 1)
            RETURN -1
        END

        DELETE dbo.Orders
        WHERE OrderDate < @CutOffDate

        IF @@ERROR <> 0
        BEGIN
            ROLLBACK TRAN
            RAISERROR ('Error occurred while deleting data from dbo.Orders',  16, 1)
            RETURN -1
        END

       IF @@TRANCOUNT > 0
       BEGIN
           COMMIT TRAN
           RETURN 0
       END
END

Как архивировать все таблицы одновременно в одной хранимой процедуре для архивирования таблиц? Мне нужно хранить последние 30 дней в обычных таблицах, но архивировать все прошлые данные в архив. Нужно ли пользоваться условием If Else? Мне нужно динамически получить все таблицы и динамически архивировать таблицы. Мне нужно использовать Dynami c SQL запросов для этого.

1 Ответ

0 голосов
/ 20 марта 2020

если структура ваших архивных таблиц такая же, как и у обычных таблиц, то вы можете сделать это с помощью всех oop таблиц с порядком их отношений

, с помощью которых вы можете получить таблицы по их порядку отношений ссылка:

Как составить список таблиц в порядке их зависимости (на основе внешних ключей)?

вставить таблицы во временную таблицу и сгенерировать запрос на вставку для каждой таблицы

DECLARE @T AS TABLE(ID INT IDENTITY(1,1), TableName NVARCHAR(100))
-- INSERT INTO @T the tables with relation order
while(exists select * from @T)
BEGIN
    DECLARE @ID = (SELECT TOP 1 ID FROM @T ORDER BY ID)
    DECLARE @TableName = (SELECT TOP 1 TableName FROM @T WHERE ID=@ID)
    EXEC('INSERT INTO Archive.dbo.' + @TableName + ' SELECT * FROM ' + @TableName)
    DELETE FROM @T WHERE ID = @ID
END

Вы можете удалить данные из обычных таблиц после архивации их по тому же l oop, но в обратном порядке: «ВЫБЕРИТЕ ТОП 1 ID ИЗ @T ORDER BY ID DES C»

...