Получение RSS в SQL запросе

Время чтения - 4 мин.Дата публикации 13.04.2021 (обновлено 21.05.2026)

Генерация RSS в T-SQL: процедура и примеры

На входе — данные для RSS. На выходе — готовая XML-строка. Всё просто.

Ниже — хранимая процедура, которая собирает ленту новостей. Она принимает табличный параметр и параметры канала, а возвращает строку с XML.

Код процедуры

ALTER PROCEDURE [dbo].[xml_getRSS]
    @RSSItemData         RSSItemType READONLY,
    @titleChannel        nvarchar(max)  NULL,
    @linkChannel         nvarchar(1024) NULL,
    @descriptionChannel  nvarchar(max)  NULL,
    @languageChannel     nvarchar(max)  = 'en-us'
AS
BEGIN
    DECLARE @result nvarchar(max) = N'';

    -- Шапка RSS
    SET @result = @result + N'' + CHAR(10)
                 + '' + CHAR(10) + CHAR(10);

    -- Проверяем, есть ли данные
    DECLARE @cnt int = 0;
    SELECT @cnt = COUNT(*) FROM @RSSItemData;
    SELECT @cnt = ISNULL(@cnt, 0);

    IF @cnt = 0
    BEGIN
        RAISERROR(N'Ошибка! Нет данных. Выполнение прервано.', 11, 1);
        RETURN;
    END

    -- Канал
    SET @result = @result + '' + CHAR(10)
                 + ''       + ISNULL(@titleChannel, '')        + '' + CHAR(10)
                 + ''        + ISNULL(@linkChannel, '')         + '' + CHAR(10)
                 + '' + ISNULL(@descriptionChannel, '')  + '' + CHAR(10)
                 + ''    + ISNULL(@languageChannel, '')     + '' + CHAR(10)
                 + CHAR(10);

    -- Статьи
    DECLARE @tmp_titleArticle nvarchar(max),
            @tmp_descriptionArticle nvarchar(max),
            @tmp_authorArticle nvarchar(max),
            @tmp_linkArticle nvarchar(max),
            @tmp_pubDateArticle nvarchar(max);

    DECLARE tmp_CursorArticles CURSOR FORWARD_ONLY FOR
        SELECT titleArticle, descriptionArticle, authorArticle, linkArticle, pubDateArticle
        FROM @RSSItemData Articles
        ORDER BY titleArticle;

    OPEN tmp_CursorArticles;

    FETCH NEXT FROM tmp_CursorArticles INTO
        @tmp_titleArticle, @tmp_descriptionArticle, @tmp_authorArticle, @tmp_linkArticle, @tmp_pubDateArticle;

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @result = @result + '' + CHAR(10)
                     + ''       + ISNULL(@tmp_titleArticle, '')        + '' + CHAR(10)
                     + '' + ISNULL(@tmp_descriptionArticle, '')  + '' + CHAR(10)
                     + ''      + ISNULL(@tmp_authorArticle, '')       + '' + CHAR(10)
                     + ''       + ISNULL(@tmp_linkArticle, '')         + '' + CHAR(10)
                     + ''     + ISNULL(@tmp_pubDateArticle, '')      + '' + CHAR(10)
                     + '' + CHAR(10) + CHAR(10);

        FETCH NEXT FROM tmp_CursorArticles INTO
            @tmp_titleArticle, @tmp_descriptionArticle, @tmp_authorArticle, @tmp_linkArticle, @tmp_pubDateArticle;
    END;

    CLOSE tmp_CursorArticles;
    DEALLOCATE tmp_CursorArticles;

    -- Закрываем канал и корневой элемент
    SET @result = @result + '' + CHAR(10)
                 + '' + CHAR(10);

    -- Выводим результат
    SELECT @result;
END

Тип данных для табличного параметра

Чтобы передать статьи, нужен специальный тип. Вот он:

CREATE TYPE [dbo].[RSSItemType] AS TABLE(
    [titleArticle] [nvarchar](max) NULL,
    [descriptionArticle] [nvarchar](max) NULL,
    [authorArticle] [nvarchar](max) NULL,
    [linkArticle] [nvarchar](1024) NULL,
    [pubDateArticle] [datetime] NULL
)

Пример вызова

Допустим, хотим собрать ленту из трёх статей. Вот как это выглядит:

DECLARE @TestRSSItemTable RSSItemType;

INSERT INTO @TestRSSItemTable (titleArticle, descriptionArticle, authorArticle, linkArticle, pubDateArticle)
VALUES
    ('RSS Tutorial', 'New RSS tutorial on w3ii', 'hege@refsnesdata.no', 'http://www.w3ii.com/xml/xml_rss.html', GETDATE() - 10),
    ('XML Tutorial', 'New XML tutorial on w3ii', 'hege2@refsnesdata.no', 'http://www.w3ii.com/xml', GETDATE() - 9),
    ('XML Tutorial test1', 'New XML tutorial on w3ii test1', 'hegetest1@refsnesdata.no', 'http://www.w3ii.com/xml', GETDATE() - 8);

EXEC [dbo].[xml_getRSS]
    @RSSItemData = @TestRSSItemTable,
    @titleChannel = 'w3ii Home Page title',
    @linkChannel = 'http://www.w3ii.com',
    @descriptionChannel = 'Free web building tutorials',
    @languageChannel = 'en-us';

Запустили — получили XML. Можно парсить или отдавать как фид.

Ещё один пример — с датами в прошлом

Если нужно протестировать сортировку или даты:

DECLARE @OlderRSS RSSItemType;

INSERT INTO @OlderRSS (titleArticle, descriptionArticle, authorArticle, linkArticle, pubDateArticle)
VALUES
    ('Old Post', 'First article ever', 'admin@site.com', 'http://site.com/old', '2023-01-01'),
    ('Newer Post', 'Recent update', 'editor@site.com', 'http://site.com/new', '2024-05-15');

EXEC [dbo].[xml_getRSS]
    @RSSItemData = @OlderRSS,
    @titleChannel = 'My Blog',
    @linkChannel = 'http://site.com',
    @descriptionChannel = 'Tech stuff',
    @languageChannel = 'en-us';

Что по итогу?

  • Процедура собирает RSS 2.0.
  • Использует курсор — не самый быстрый вариант, но для небольших лент норм.
  • Проверяет, есть ли данные. Если нет — ошибка.
  • Все NULL-поля заменяются на пустые строки — без сюрпризов.

Если нужна скорость для тысяч записей — лучше переписать на FOR XML PATH. Но для типовых задач и этого хватит.

Насколько полезной была статья?

Что еще посмотреть по SQL Server

Как запустить SQL сценарий сразу на нескольких БД

Индексы SQL Server. Поиск дубликатов

Запрос для получения SQL всех индексов для таблиц базы данных SQL Server

Как перестроить все индексы на базе SQL Server

Как разрезать строку на части в SQL по некоторому символу

Конвертация из строки в таблицу в SQL Server

Выполнение прямого запроса к URL из SQL

SQL Server Как установить у таблицы описание (MS Description)

Как получить текущего юзера БД

Как хранить в 1 поле таблицы БД значения разных типов?

Генерация MD5 в SQL Server

Как привести телефон в нормализованный вид

Дополнительный заработок для разработчиков на T-SQL

Прямая работа с заказчиками как ИП или самозанятый. Нужно знать только SQL и HTML.
Falcon Space - платформа для создания сайтов с личными кабинетами
В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
Запрос расчета стоимости веб-проекта на базе Falcon Space
Если видео Youtube плохо грузится, то попробуйте найти видео в ВК видео на канале Falcon Space
Сайт использует Cookie, Яндекс Метрику. Используя сайт, вы соглашаетесь с правилами сайта. См. Правила конфиденциальности и Правила использования сайта OK