Загрузка данных


USE [myNewVasya];
SET NOCOUNT ON;
SET XACT_ABORT ON;

DECLARE @Apply bit = 0; -- 0: просмотр; 1: резервная копия и удаление

DECLARE @Questions TABLE (
    labelF nvarchar(4000) NOT NULL
);

INSERT INTO @Questions (labelF)
VALUES
    (N'Вид организации'),
    (N'Интерактивные задания'),
    (N'Польза знаний'),
    (N'Работа ведущего'),
    (N'Поле для комментариев и предложений');

-- 1. Показываем объём удаления.
SELECT
    N'sb_answerData' AS sourceTable,
    a.kodMerop,
    a.labelF,
    COUNT_BIG(*) AS rowsToDelete,
    COUNT(DISTINCT a.kodMember) AS membersAffected
FROM dbo.sb_answerData a
JOIN @Questions q ON q.labelF = a.labelF
WHERE a.pollId = N'post_form'
GROUP BY a.kodMerop, a.labelF

UNION ALL

SELECT
    N'sb_answer',
    a.kodMerop,
    a.labelF,
    COUNT_BIG(*),
    COUNT(DISTINCT a.kodMember)
FROM dbo.sb_answer a
JOIN @Questions q ON q.labelF = a.labelF
WHERE a.pollId = N'post_form'
GROUP BY a.kodMerop, a.labelF
ORDER BY kodMerop, sourceTable, labelF;

IF @Apply = 0 RETURN;

-- 2. Копирование и удаление выполняются одной транзакцией.
BEGIN TRY
    BEGIN TRANSACTION;

    -- Фиксированные имена защищают резервную копию от перезаписи.
    IF OBJECT_ID(N'dbo.bak_mts_answers_20260925_archive', N'U') IS NOT NULL
       OR OBJECT_ID(N'dbo.bak_mts_answers_20260925_pending', N'U') IS NOT NULL
    BEGIN
        THROW 51010,
            'Backup tables already exist. Keep them; use new backup names for another cleanup.',
            1;
    END;

    SELECT a.*
    INTO dbo.bak_mts_answers_20260925_archive
    FROM dbo.sb_answerData a WITH (UPDLOCK, HOLDLOCK)
    JOIN @Questions q ON q.labelF = a.labelF
    WHERE a.pollId = N'post_form';

    SELECT a.*
    INTO dbo.bak_mts_answers_20260925_pending
    FROM dbo.sb_answer a WITH (UPDLOCK, HOLDLOCK)
    JOIN @Questions q ON q.labelF = a.labelF
    WHERE a.pollId = N'post_form';

    -- Удаляем именно скопированные строки.
    DELETE a
    FROM dbo.sb_answer a
    JOIN dbo.bak_mts_answers_20260925_pending b ON b.kod = a.kod;

    DECLARE @pendingDeleted int = @@ROWCOUNT;

    DELETE a
    FROM dbo.sb_answerData a
    JOIN dbo.bak_mts_answers_20260925_archive b ON b.kod = a.kod;

    DECLARE @archiveDeleted int = @@ROWCOUNT;

    COMMIT;

    SELECT
        @archiveDeleted AS deletedFromArchive,
        @pendingDeleted AS deletedFromPending;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK;
    THROW;
END CATCH;