Запрос SQL Server для удаления текста из текстового столбца

У меня есть база данных SQL Server с таблицей feedback, которая содержит текстовый столбец comment. В этом столбце у меня есть данные тега, например

This is my record <tag>Random characters are here</tag> with information. 

Как написать запрос для обновления всех этих записей, чтобы удалить <tag></tag> и весь текст между ними?

Я хотел бы записать это в другую «временную» таблицу, чтобы сначала проверить изменения, а затем обновить исходную таблицу.

Я использую SQL Server 2014 Express.

Спасибо


person ScottEH    schedule 25.01.2016    source источник
comment
T-SQL для этого не подходит. Попробуйте написать небольшое консольное приложение, которое считывает значения этих полей и анализирует их с помощью RegEx или анализатора HTML, такого как HTML Agility Pack.   -  person Sam Axe    schedule 26.01.2016
comment
Сделайте 2 подстроки, используя в качестве ссылки открывающий и закрывающий теги, и объедините их вместе в обновлении.   -  person Mihai    schedule 26.01.2016
comment
Проверьте этот сообщение SO, я думаю, это поможет ..   -  person vmachan    schedule 26.01.2016


Ответы (3)


Вот функция для удаления тегов..

CREATE FUNCTION [dbo].[RemoveTag](@text NVARCHAR(MAX), @tag as nvarchar(max))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    declare @startTagIndex as int
    declare @endTagIndex as int

    set @startTagIndex = CHARINDEX('<' + @tag + '>', @text)
    if(@startTagIndex > 0) BEGIN
        set @endTagIndex = CHARINDEX('</' + @tag + '>', @text, @startTagIndex)
        if(@endTagIndex > 0) BEGIN
            return LEFT(@text, @startTagIndex - 1) + RIGHT(@text, len(@text) - len(@tag) - @endTagIndex  - 2)
        END
    END

    return @text
END

Позже вы можете использовать его как:

Update table set field = dbo.RemoveTag(field, 'tag')

Если вы хотите записать поля в другую таблицу, то:

CREATE TABLE dbo.OtherTable (
    OtherField nvarchar(MAX) NOT NULL
) 
GO

INSERT INTO OtherTable (OtherField)
SELECT dbo.RemoveTag(field, 'tag') from table
person Ramazan Binarbasi    schedule 26.01.2016

Делая много предположений о формате вашей строки. Но если они действительны, то это очень просто:

left(s, charindex('<tag>', s - 1)) +
    substring(s, charindex('</tag>', s) + 6, len(s))

Очевидно, мы предполагаем, что строки поиска появляются только один раз и в правильном порядке. Также есть предположение, что матчи будут. Кроме того, я использовал len(s) в качестве простой верхней границы количества символов, которые нужно взять справа. Вы можете просто жестко закодировать что-то подходящее, если вам так хочется, поскольку SQL Server не выдает ошибки при переходе за конец. s - это просто замена для вашего столбца char.

http://sqlfiddle.com/#!3/771a3/8

Не уверен, что дополнительные пробелы будут проблемой, поэтому вы можете обрезать и добавить пробел в середине.

rtrim(left(s, charindex('<tag>', s) - 1)) + ' ' +
    ltrim(substring(s, charindex('</tag>', s) + 6, len(s)))
person shawnt00    schedule 26.01.2016

Вы можете использовать CHARINDEX, чтобы найти, где начинаются и заканчиваются ваши теги, SUBSTRING, чтобы получить весь текст между ‹ и >, и REPLACE, чтобы заменить подстроку на ''.

Select Field, 
Substring(FIELD, charindex('<', Field), CHARINDEX('>', Field, 
    (CHARINDEX('>', FIELD)) + 1) - charindex('<', Field)+1)  as ToRemove,
replace (Field, Substring(FIELD, charindex('<', Field), CHARINDEX('>',
    Field, (CHARINDEX('>', FIELD)) + 1) - charindex('<', Field)+1), '') 
    as FinalResult

из ИмяТаблицы

На выходе будут три столбца: Field, ToRemove и FinalResult, но на самом деле ничего не будет обновлено.

Я думаю, что единственный способ, которым это не удастся, - это если у вас есть вложенные теги. <b><i>sometext</i></b>

Чтобы действительно внести изменения:

Update #TableName set Field = replace (Field, Substring(FIELD, charindex('<', Field), CHARINDEX('>', Field, (CHARINDEX('>', FIELD)) + 1) - charindex('<', Field)+1), '')

Протестировано на SQL Server 2012.

person John Greiner    schedule 26.01.2016