Действительно, T-SQL изначально не поддерживает регулярные выражения, и это та проблема, в которой регулярные выражения были бы предпочтительным инструментом. Во-первых, я скажу, что уровень сложности решения сильно зависит от того, насколько последовательны ваши данные. Например, предположим, что мы ищем элементы с заголовком:
Select ..
From ...
Where HtmlContent Like '<span class="heading-2">%'
Это предполагает отсутствие дополнительного интервала между span
и class
, а также отсутствие дополнительного интервала после заключительной двойной кавычки перед конечной скобкой. Мы могли бы написать '%<span%class="heading-2"%>%'
для учета пробелов, но это также позволило бы найти теги div
, помеченные как heading-2
, в том же контенте, что и любой тег span. Если этот более поздний сценарий не должен произойти, но у вас могут быть различные пробелы, используйте этот пересмотренный шаблон. Где мы действительно столкнемся с неприятностями - это закрывающий тег. Предположим, что наш контент выглядит так:
<span class="heading-2"> Foo <span class="heading-3">Bar</span> And Gamma Too</span> .... <span class="heading-4">Fubar Is the right way!</span>...
Не так просто найти правильный закрывающий тег span
для изменения на </h2>
. Вы не можете просто найти первый </span>
и изменить его на </h2>
. Если бы вы знали, что у вас нет вложенных тегов span
, вы можете написать пользовательскую функцию, которая сделает это:
Create Function ReplaceSpanToH2( @HtmlContent nvarchar(max) )
Returns nvarchar(max)
As
Begin
Declare @StartPos int
Declare @EndBracket int
Set @StartPos = CharIndex('<span class="heading-2">', @HtmlContent)
If @StartPos = 0
Return @HtmlContent
Set @HtmlContent = Replace(@HtmlContent, '<span class="heading-2">', '<h2>')
-- find next </span>
Set @StartPos = CharIndex('</span>', @HtmlContent, @StartPos)
Set @HtmlContent = Stuff(@HtmlContent, @StartPos, 7, '</h2>')
Return @HtmlContent
End