Published on

July 26, 2024

Удаление HTML-тегов из символьных строк данных в SQL Server

Проблема:

Иногда возникают ситуации, когда необходимо удалить HTML-теги из символьных строк данных. Например, представьте, что вам нужно отправить данные о продукте в поисковую систему, такую как Google. В этом случае подробное описание продукта обязательно. Рекомендуется удалить все специальные символы и форматирование HTML. Эту задачу можно решить с помощью кода T-SQL, однако в данном случае у меня есть возможность использовать .NET и мощь регулярных выражений для работы со строкой.

Решение:

В этой статье я покажу, как создать CLR-функцию, которая очищает строку от HTML-тегов и специальных символов. Я буду использовать Visual Studio 2010 с языком программирования C#. Вот шаги, которые нужно выполнить:

  1. Убедитесь, что включена интеграция CLR. Это можно сделать с помощью серверных фасетов в SQL Server 2008, инструмента конфигурации области поверхности в SQL Server 2005 или выполнением следующего кода:
  2. sp_configure 'clr enabled', 1
    GO
    RECONFIGURE
    GO
  3. Откройте Visual Studio 2010 и нажмите “Создать проект”. Выберите шаблон “База данных” -> “SQL Server” -> “Visual C# SQL CLR Database Project”. Убедитесь, что проект нацелен на .NET 2 / .NET 3 / .NET 3.5.
  4. Настройте подключение к вашей базе данных, протестируйте подключение и нажмите “ОК”.
  5. Щелкните правой кнопкой мыши на проекте и добавьте определенную пользователем функцию, как объясняется в следующем разделе.

Вот код определенной пользователем функции:

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.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.