Удаление символов в скобках - PullRequest
0 голосов
/ 29 августа 2018

Я использую 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.

1 Ответ

0 голосов
/ 29 августа 2018

Вы можете определить скалярную функцию, которая удаляет квадратные скобки и весь текст, содержащийся между ними:

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)

Результат:

enter image description here

В вашем конкретном случае вы используете такую ​​функцию:

SELECT 
     *,
     [dbo].[fx_RemoveTags](@test) as Body1
FROM search
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...