Генерация разметки HTML по шаблону с параметрами в JSON
Полностью собирать разметку HTML прямо в SQL процедуре - плохой вариант.
Такую разметку гораздо сложнее поддерживать и редактировать. Также подобную разметку можно генерировать и редактировать через AI.
Можно использовать следующий шаблонизатор:
declare @s nvarchar(max) = '{{name}} {{like}}' -- берем разметку из HTML блока
-- параметры в формате JSON в формате '{"name": "xxx", "like": ""}'
declare @json nvarchar(max) = (select 'Компания "Металл"' name, 'good' [like]
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) --
-- получаем разметку с внедренными параметрами
select [dbo].[as_renderHtmlTemplate] (@s ,@json)
Разметка может хранится в HTML блоке.
Параметры извлекаются через SQL запрос с множеством подзапросов.
Примечание:
- Если значение будет NULL, то это не сломает разметку.
- Если параметра нет среди JSON, то он заменится на пустую строку.
CREATE FUNCTION [dbo].[as_renderHtmlTemplate]
(
@HtmlTemplate NVARCHAR(MAX),
@JsonParams NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
-- Переменные для цикла
DECLARE @StartPos INT, @EndPos INT;
DECLARE @Key NVARCHAR(100);
DECLARE @Value NVARCHAR(MAX);
DECLARE @MarkerStart NVARCHAR(2) = '{{';
DECLARE @MarkerEnd NVARCHAR(2) = '}}';
DECLARE @MarkerLen INT = LEN(@MarkerStart);
-- Защита от бесконечного цикла (на случай битого шаблона)
DECLARE @SafetyCounter INT = 0;
-- Начинаем поиск
SET @StartPos = CHARINDEX(@MarkerStart, @HtmlTemplate);
WHILE @StartPos > 0 AND @SafetyCounter < 1000
BEGIN
SET @EndPos = CHARINDEX(@MarkerEnd, @HtmlTemplate, @StartPos + @MarkerLen);
-- Если найдена полная пара {{...}}
IF @EndPos > 0
BEGIN
-- 1. Извлекаем имя ключа
SET @Key = SUBSTRING(@HtmlTemplate, @StartPos + @MarkerLen, @EndPos - @StartPos - @MarkerLen);
-- 2. Ищем значение в JSON
SET @Value = JSON_VALUE(@JsonParams, '$.' + @Key);
-- 3. Замена
IF @Value IS NOT NULL
BEGIN
-- Подставляем значение
SET @HtmlTemplate = STUFF(@HtmlTemplate, @StartPos, (@EndPos - @StartPos + 2), @Value);
-- Сдвигаем поиск вперед на длину вставленного значения
SET @StartPos = CHARINDEX(@MarkerStart, @HtmlTemplate, @StartPos + LEN(@Value));
END
ELSE
BEGIN
-- Значение не найдено -> УДАЛЯЕМ маркеры и ключ (заменяем на пустоту)
SET @HtmlTemplate = STUFF(@HtmlTemplate, @StartPos, (@EndPos - @StartPos + 2), '');
-- Сдвигаем поиск на 1 символ вперед (так как мы удалили фрагмент)
SET @StartPos = CHARINDEX(@MarkerStart, @HtmlTemplate, @StartPos + 1);
END
END
ELSE
BEGIN
-- Закрывающий маркер не найден, прерываем
BREAK;
END
SET @SafetyCounter = @SafetyCounter + 1;
END
RETURN @HtmlTemplate;
END
Что еще посмотреть по SQL Server
Как сгенерировать различные ФИО в SQL Server
Как сделать поиск по всем таблицам базы данных SQL Server
Поиск строки во всех хранимых процедурах SQL Server
Скрипт бекапа базы и восстановления из бекапа
SQL запрос для получения всех текущих выполняющихся запросов на базе
Запрос для поиска проблемных SQL по процессору
Как писать запросы с колонкой по временным интервалам (неделя, месяц, квартал, год)
Получить части пути к файлу (расширение, путь, название файла)
Из строки в Base64 и обратно в SQL Server (с учетом кирилицы)
Дополнительный заработок для разработчиков на T-SQL
- Шаг 1. Создать концепт проекта
- Шаг 2. Получить оценку бюджета (КП)
- Шаг 3. Заключить договор
- Шаг 4. Создать совместно техническое задание
- Шаг 5. Поэтапная реализация проекта