Я использую SQL Server 2008 R2, но получаю доступ к этому серверу через SQL Server 2012 Management Studio.
У меня есть таблица под названием Search со столбцом Body типа (nvarchar(Max), not null).
Данные в этом столбце на самом деле являются основным текстом сообщений электронной почты, и в этом столбце все теги HTML хранятся как часть текста.
Например, в теле письма будет отображаться:
Good morning
This invoice has been assigned.
Но когда он хранится в столбце под названием Body, он выглядит так:
[size=14.0pt]Good morning
[/size][size=14.0pt]This invoice has been assigned.[/size]
У меня есть следующий SQL-код для удаления всего, что находится между "[" и "]" (включая скобки):
SELECT
*,
CASE
WHEN CHARINDEX('[', Body) > 0 AND CHARINDEX(']', Body) > 0
AND CHARINDEX('[', Body) < CHARINDEX(']', Body)
THEN STUFF(Body, CHARINDEX('[', Body), (CHARINDEX(']', Body) - CHARINDEX('[', Body)) + 1, '')
ELSE Body
END AS Body1
FROM search
Но все это удаляет первый набор тегов, который теперь выглядит так:
Good morning
[/size][size=14.0pt]This invoice has been assigned.[/size]
Можете ли вы помочь мне с моим SQL, чтобы он удалил их все, чтобы он выглядел так:
Good Morning
This invoice has been assigned.
Я использую MS SQL Server 2008 R2, но получаю доступ к этому серверу через SQL Server Management Studio 2012. Приношу свои извинения, я должен был включить это в свой исходный пост.
Но это НЕ правильный HTML. Если бы это был настоящий HTML, мы можем использовать некоторые уловки. Поскольку, похоже, это не так, я бы предложил использовать CLR и регулярные выражения.


Вы можете определить скалярную функцию, которая удаляет квадратные скобки и весь текст, заключенный между ними:
create function [dbo].[fx_removetags] (@text nvarchar(max))
returns nvarchar(max) as
begin
declare @tag_start int
declare @tag_end int
declare @tag_length int
set @tag_start = charindex('[', @text)
set @tag_end = charindex(']', @text, charindex('[', @text))
set @tag_length = (@tag_end - @tag_start) + 1
while @tag_start > 0 and @tag_end > 0 and @tag_length > 0
begin
set @text = stuff(@text,@tag_start,@tag_length, '')
set @tag_start = charindex('[',@text)
set @tag_end = charindex(']',@text,charindex('[', @text))
set @tag_length = (@tag_end - @tag_start) + 1
end
return ltrim(rtrim(@text))
end
Теперь вы можете вызвать функцию, чтобы получить текст без скобок:
declare @test nvarchar(max)= ''
set @test = '[size=14.0pt]Good morning [/size][size=14.0pt]This invoice has been assigned.[/size] '
select [dbo].[fx_RemoveTags](@test)
Результат:
В вашем конкретном случае вы используете такую функцию:
SELECT
*,
[dbo].[fx_RemoveTags](@test) as Body1
FROM search
Андреа, спасибо за помощь. I: n относительно оператора SQL, части, которая гласит: set @test = '[size = 14.0pt] Доброе утро [/size visible[size=14.0pt ]Этот счет был назначен. [/ Size]' Как сделать Я ссылаюсь на исходное поле под названием «тело». Этот код работает с точным набором слов: [size = 14.0pt] Доброе утро [/size provided[size=14.0pt ]Этот счет был назначен. [/ Size] ', но все записи в этом поле отличаются.
Вы тестировали функцию с разными параметрами? Там нет ничего специфичного для конкретного случая использования ....
Эрик, спасибо за ответ. Я все еще изучаю SQL. Я запустил его точно так же, как опубликовала Андреа, и получил тот же результат, что и она. Однако теперь я пытаюсь понять, как это проверить с помощью столбца «Тело», в котором находятся все данные. Я предполагаю, что это как-то связано с этой строкой "set @test = '[size = 14.0pt] Доброе утро [/size sizes[size=14.0pt ]Этот счет был назначен. [/ Size]'", но не знаю, как чтобы изменить его так, чтобы он ссылался на столбец «Тело» в моей таблице с именем «Поиск».
Это должно сработать. SELECT dbo.fx_RemoveTags(s.Body) FROM Search AS s; Может попробовать SELECT TOP 10.... для запуска, просто чтобы проверить функцию.
@StephenMorrell Эрик прав, вы можете использовать эту функцию прямо в своем операторе select, заменив case ... when. Я обновил свой ответ примером
Спасибо всем, это очень помогло.
Какой вид SQL вы используете? например MYSQL, MS SQL и т. д.?