Получение RSS в SQL запросе
Генерация 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)
Как получить текущего юзера БД
Дополнительный заработок для разработчиков на T-SQL
- Шаг 1. Создать концепт проекта
- Шаг 2. Получить оценку бюджета (КП)
- Шаг 3. Заключить договор
- Шаг 4. Создать совместно техническое задание
- Шаг 5. Поэтапная реализация проекта