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


SET NOCOUNT ON;

-- Пустая дата именно в ваших представлениях.
-- Если представления возвращают даты без смещения +2000,
-- замени на '00010101'.
DECLARE @EmptyDate date = '20010101';

DECLARE
    @RemoteSql nvarchar(max),
    @Sql       nvarchar(max),
    @Found     bigint;

-- Пересоздаём обе временные таблицы.
IF OBJECT_ID('tempdb..#RemoteTareIDs') IS NOT NULL
    DROP TABLE #RemoteTareIDs;

IF OBJECT_ID('tempdb..#TareToReview') IS NOT NULL
    DROP TABLE #TareToReview;

SELECT TOP (0) t.[ID]
INTO #RemoteTareIDs
FROM [dbo].[Справочник.Тары] AS t;

SELECT TOP (0) t.[ID]
INTO #TareToReview
FROM [dbo].[Справочник.Тары] AS t;

CREATE UNIQUE CLUSTERED INDEX IX_RemoteTareIDs
    ON #RemoteTareIDs ([ID]);

BEGIN TRY

    -- 1. Загружаем удалённые ID с пустой датой создания.
    -- По группе и актуальности удалённую выборку не ограничиваем.
    SET @RemoteSql =
        N'SELECT [ID]
          FROM [V8Views].[dbo].[Справочник.Тары]
          WHERE [ДатаСоздания] = '''
        + CONVERT(nvarchar(8), @EmptyDate, 112)
        + N''' OR [ДатаСоздания] IS NULL';

    SET @Sql =
        N'INSERT INTO #RemoteTareIDs ([ID])
          SELECT [ID]
          FROM OPENQUERY([sql], '''
        + REPLACE(@RemoteSql, N'''', N'''''')
        + N''');';

    EXEC sys.sp_executesql @Sql;

    -- 2. Сохраняем локальные ID, подходящие для пометки.
    INSERT INTO #TareToReview ([ID])
    SELECT t.[ID]
    FROM [dbo].[Справочник.Тары] AS t
    WHERE t.[ЭтоГруппа] = 0x01
      AND t.[НеАктуальна] = 0x00
      AND
      (
          t.[ДатаСоздания] = @EmptyDate
          OR t.[ДатаСоздания] IS NULL
      )
      AND NOT EXISTS
      (
          SELECT 1
          FROM #RemoteTareIDs AS r
          WHERE r.[ID] = t.[ID]
      )
      AND NOT EXISTS
      (
          SELECT 1
          FROM [dbo].[РегистрСведений.СостоянияГрузов] AS СГ
          WHERE СГ.[Тара] = t.[ID]
            AND СГ.[Период] >= '20260901'
      )
    OPTION (RECOMPILE, MAXDOP 2);

    SET @Found = ROWCOUNT_BIG();

    SELECT @Found AS НайденоДляПроверки;

END TRY
BEGIN CATCH
    -- Если загрузка удалённых ID завершилась ошибкой,
    -- локальную сверку не выполняем.
    THROW;
END CATCH;

-- 3. Просмотр результата.
SELECT TOP (100)
    t.[ID],
    t.[Код],
    t.[Наименование],
    t.[ДатаСоздания],
    t.[Родитель]
FROM #TareToReview AS r
INNER JOIN [dbo].[Справочник.Тары] AS t
    ON t.[ID] = r.[ID];

-- #TareToReview остаётся для дальнейшего исключения по родителю.
-- Данные справочника не обновляются.