Проблема:
Иногда возникают ситуации, когда необходимо удалить HTML-теги из символьных строк данных. Например, представьте, что вам нужно отправить данные о продукте в поисковую систему, такую как Google. В этом случае подробное описание продукта обязательно. Рекомендуется удалить все специальные символы и форматирование HTML. Эту задачу можно решить с помощью кода T-SQL, однако в данном случае у меня есть возможность использовать .NET и мощь регулярных выражений для работы со строкой.
Решение:
В этой статье я покажу, как создать CLR-функцию, которая очищает строку от HTML-тегов и специальных символов. Я буду использовать Visual Studio 2010 с языком программирования C#. Вот шаги, которые нужно выполнить:
- Убедитесь, что включена интеграция CLR. Это можно сделать с помощью серверных фасетов в SQL Server 2008, инструмента конфигурации области поверхности в SQL Server 2005 или выполнением следующего кода:
- Откройте Visual Studio 2010 и нажмите “Создать проект”. Выберите шаблон “База данных” -> “SQL Server” -> “Visual C# SQL CLR Database Project”. Убедитесь, что проект нацелен на .NET 2 / .NET 3 / .NET 3.5.
- Настройте подключение к вашей базе данных, протестируйте подключение и нажмите “ОК”.
- Щелкните правой кнопкой мыши на проекте и добавьте определенную пользователем функцию, как объясняется в следующем разделе.
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
Вот код определенной пользователем функции:
using System;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Collections.Generic;
using Microsoft.SqlServer.Server;
using System.Text;
using System.Text.RegularExpressions;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString CleanHTML(SqlString s)
{
if (s.IsNull) return String.Empty;
string s1 = s.ToString().Trim();
if (s1.Length == 0) return String.Empty;
StringBuilder tmpS = new StringBuilder(s1.Length);
// Удаление "управляющих символов"
if (!Char.IsControl(s1[0])) tmpS.Append(s1[0]);
for (int i = 1; i <= s1.Length - 1; i++)
{
if (Char.IsControl(s1[i]))
{
if (s1[i - 1] != ' ') tmpS.Append(' ');
}
else
{
tmpS.Append(s1[i]);
}
}
string result = tmpS.ToString();
// Поиск HTML-тегов и замена их пустой строкой
string pattern = @"<[^>]*?>|<[^>]*>";
Regex rgx = new Regex(pattern);
return rgx.Replace(result, String.Empty);
}
}
Сравнение кода T-SQL и C# CLR:
Эту задачу можно решить также с помощью T-SQL. Однако, в ходе тестирования я обнаружил, что использование кода CLR обеспечивает лучшую производительность. В моих тестовых случаях я работал на виртуальной машине с Windows Server Standard 2003 SP2, 2 ГБ оперативной памяти и SQL Server 2008 Developer Edition с SP2. Я запустил два фрагмента кода в отдельных окнах SSMS, один с использованием CLR-функции, а другой с использованием T-SQL-функции, предоставленной Пиналом Дэйвом. Код CLR всегда превосходил код T-SQL по времени CPU и затраченному времени.
Вывод:
Использование кода CLR для удаления HTML-тегов из символьных строк данных в SQL Server может обеспечить лучшую производительность по сравнению с использованием кода T-SQL. Однако важно учитывать использование памяти и возможное давление на память при использовании кода CLR. В зависимости от операционной системы, среды и способа написания кода CLR, возможно возникновение давления на память. Рекомендуется отслеживать использование памяти и производительность при использовании кода CLR в SQL Server.