STREAM
Формирование сообщений из плана обмена с удалением обработанных изменений
DECLARE @Изменение object -- запись таблицы регистрации изменений
DECLARE @Заголовки object -- структура заголовков сообщения
DECLARE @Сообщение object -- структура объекта переноса данных
DECLARE @КодЭтогоУзла string
DECLARE @СчётчикСообщений number = 0
DECLARE @ПустаяСсылка uuid = '00000000-0000-0000-0000-000000000000'
USE 'mssql://server/database'
-- Единоразовое получение кода этого узла соответствующего плана обмена
SELECT RTRIM(LTRIM(Код))
INTO @КодЭтогоУзла
FROM ПланОбмена.ПланОбменаРИБ
WHERE Предопределённый <> @ПустаяСсылка
-- Выборка ссылок и узлов получателей из таблицы регистрации изменений плана обмена
STREAM TOP 10
Номенклатура = Изменения.Ссылка
, Получатели = STRING_AGG(RTRIM(LTRIM(ПланОбмена.Код)), ',')
INTO @Изменение
FROM Справочник.Номенклатура.Изменения AS Изменения
INNER JOIN ПланОбмена.ПланОбменаРИБ AS ПланОбмена
ON Изменения.УзелОбмена = ПланОбмена.Ссылка
GROUP BY Изменения.Ссылка
ORDER BY Изменения.Ссылка ASC
-- Формирование заголовков сообщения
SELECT key = UUIDOF(@Изменение.Номенклатура)
, type = TYPEOF(@Изменение.Номенклатура)
, sender = @КодЭтогоУзла
INTO @Заголовки
-- Формирование объекта переноса данных
-- Шапка объекта: { Ссылка, Код, Наименование }
-- Табличная часть "Цены" (последние 3 цены): { Период, Цена }
SELECT Ссылка = UUIDOF(Ссылка)
, Код = RTRIM(LTRIM(Код))
, Наименование = SUBSTRING(Наименование, 1, 30)
INTO @Сообщение
FROM Справочник.Номенклатура
APPEND (SELECT TOP 3 Период, Цена
FROM РегистрСведений.ЦеныНоменклатуры
WHERE Номенклатура = @Изменение.Номенклатура
ORDER BY Период ASC) AS Цены
WHERE Ссылка = @Изменение.Номенклатура
-- Запись сообщения в исходящую очередь
-- Сериализация заголовков и данных в формат JSON
INSERT РегистрСведений.ИсходящиеСообщения
SELECT НомерСообщения = VECTOR('so_my_sequence')
, Получатель = @Изменение.Получатели
, Заголовки = JSON(@Заголовки)
, ТипСообщения = 'Справочник.Номенклатура'
, ТелоСообщения = JSON(@Сообщение)
-- Удаление регистрации изменений из таблицы регистрации изменений плана обмена
DELETE Справочник.Номенклатура.Изменения
WHERE Ссылка = @Изменение.Номенклатура
-- Счётчик успешно сформированных сообщений
SET @СчётчикСообщений = @СчётчикСообщений + 1
END
-- Логируем итоговый результат формирования исходящих сообщений
PRINT '[Номенклатура] сформировано: ' + @СчётчикСообщений + ' сообщений'
Наверх