Pessoal,
Boa tarde!

Hoje vou mostrar a vocês como remover tags HTML de uma string no SQL Server usando apenas T-SQL. Essa function foi muito útil para mim, pois surgiu a necessidade de incluir uma coluna num relatório que era exportado para XLS (Excel), mas essa coluna era a descrição em HTML dos chamados gerados pelo sistema e no Excel não ficava muito legal aquele monte de tags HTML. Ficava bem ruim pra ler.. Foi aí que eu desenvolvi essa função e apresento a vocês.

Código fonte da função fncRemove_HTML:

CREATE FUNCTION [dbo].[fncRemove_HTML] (@HTMLText VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN

    DECLARE	@Start INT
    DECLARE	@End INT
    DECLARE	@Length INT

    -- Substitui a entidade HTML "&" pelo caracter '&'
    SET @Start = CHARINDEX('&', @HTMLText)
    SET @End = @Start + 4
    SET @Length = (@End - @Start) + 1

    WHILE (@Start > 0 AND @End > 0 AND @Length > 0)
    BEGIN
        SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '&')
        SET @Start = CHARINDEX('&', @HTMLText)
        SET @End = @Start + 4
        SET @Length = (@End - @Start) + 1
    END

    -- Substitui a entidade HTML "<" pelo caracter '<'
    SET @Start = CHARINDEX('<', @HTMLText)
    SET @End = @Start + 3
    SET @Length = (@End - @Start) + 1

    WHILE (@Start > 0 AND @End > 0 AND @Length > 0) 
    BEGIN
        SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '<')
        SET @Start = CHARINDEX('<', @HTMLText)
        SET @End = @Start + 3
        SET @Length = (@End - @Start) + 1
    END

    -- Substitui a entidade HTML ">" pelo caracter '>'
    SET @Start = CHARINDEX('>', @HTMLText)
    SET @End = @Start + 3
    SET @Length = (@End - @Start) + 1

    WHILE (@Start > 0 AND @End > 0 AND @Length > 0)
    BEGIN
        SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '>')
        SET @Start = CHARINDEX('>', @HTMLText)
        SET @End = @Start + 3
        SET @Length = (@End - @Start) + 1
    END

    -- Substitui a entidade HTML "&&" pelo caracter '&'
    SET @Start = CHARINDEX('&amp;', @HTMLText)
    SET @End = @Start + 4
    SET @Length = (@End - @Start) + 1

    WHILE (@Start > 0 AND @End > 0 AND @Length > 0)
    BEGIN
        SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '&')
        SET @Start = CHARINDEX('&amp;', @HTMLText)
        SET @End = @Start + 4
        SET @Length = (@End - @Start) + 1
    END

    -- Substitui a entidade HTML " " pelo caracter ' '
    SET @Start = CHARINDEX(' ', @HTMLText)
    SET @End = @Start + 5
    SET @Length = (@End - @Start) + 1

    WHILE (@Start > 0 AND @End > 0 AND @Length > 0)
    BEGIN
        SET @HTMLText = STUFF(@HTMLText, @Start, @Length, ' ')
        SET @Start = CHARINDEX(' ', @HTMLText)
        SET @End = @Start + 5
        SET @Length = (@End - @Start) + 1
    END

    -- Substitui a tag <br> pela sequência de nova linha (CHR(13) + CHR(10))
    SET @Start = CHARINDEX('<br>', @HTMLText)
    SET @End = @Start + 3
    SET @Length = (@End - @Start) + 1

    WHILE (@Start > 0 AND @End > 0 AND @Length > 0)
    BEGIN
        SET @HTMLText = STUFF(@HTMLText, @Start, @Length, CHAR(13) + CHAR(10))
        SET @Start = CHARINDEX('<br>', @HTMLText)
        SET @End = @Start + 3
        SET @Length = (@End - @Start) + 1
    END


    -- Substitui a tag <br/> pela sequência de nova linha (CHR(13) + CHR(10))
    SET @Start = CHARINDEX('<br/>', @HTMLText)
    SET @End = @Start + 4
    SET @Length = (@End - @Start) + 1

    WHILE (@Start > 0 AND @End > 0 AND @Length > 0)
    BEGIN
        SET @HTMLText = STUFF(@HTMLText, @Start, @Length, 'CHAR(13) + CHAR(10)')
        SET @Start = CHARINDEX('<br/>', @HTMLText)
        SET @End = @Start + 4
        SET @Length = (@End - @Start) + 1
    END

    -- Substitui a tag <br /> pela sequência de nova linha (CHR(13) + CHR(10))
    SET @Start = CHARINDEX('<br />', @HTMLText)
    SET @End = @Start + 5
    SET @Length = (@End - @Start) + 1

    WHILE (@Start > 0 AND @End > 0 AND @Length > 0)
    BEGIN
        SET @HTMLText = STUFF(@HTMLText, @Start, @Length, 'CHAR(13) + CHAR(10)')
        SET @Start = CHARINDEX('<br />', @HTMLText)
        SET @End = @Start + 5
        SET @Length = (@End - @Start) + 1
    END


    -- Remove os parâmetros contidos nas tags HTML
    SET @Start = CHARINDEX('<', @HTMLText)
    SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
    SET @Length = (@End - @Start) + 1

    WHILE (@Start > 0 AND @End > 0 AND @Length > 0)
    BEGIN
        SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
        SET @Start = CHARINDEX('<', @HTMLText)
        SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
        SET @Length = (@End - @Start) + 1
    END


    RETURN LTRIM(RTRIM(@HTMLText))
	

END

Resultado:

Código-fonte da função fncRemove_Formatacao_Html

Uma outra forma de se conseguir remover as tags e formatações HTML de uma strings, é utilização a função fncRemove_Formatacao_Html, que demonstro abaixo.

CREATE FUNCTION [dbo].[fncRemove_Formatacao_Html] (
    @pe_sTexto VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS 
BEGIN 

    DECLARE 
        @v_sTexto         VARCHAR(MAX),
        @v_iPosicaoInicio INT = 0,
        @v_iPosicaoFim    INT = 0,
        @v_iTotalPosicoes INT = 0

    SET @v_sTexto         = @pe_sTexto
    SET @v_sTexto         = REPLACE(@v_sTexto, '<BR><BR><BR>', '<BR>')
    SET @v_sTexto         = REPLACE(@v_sTexto, '<BR><BR>', '<BR>')
    SET @v_sTexto         = REPLACE(@v_sTexto, '<BR>', '. ')	    
    
    WHILE (1 = 1) 
    BEGIN

        SET @v_iPosicaoInicio = PATINDEX('%<%', @v_sTexto)
        SET @v_iPosicaoFim    = ISNULL(NULLIF(PATINDEX('%>%', @v_sTexto), 0), LEN(@v_sTexto))
        SET @v_iTotalPosicoes = ((@v_iPosicaoFim - @v_iPosicaoInicio) + 1)
        
        IF (@v_iPosicaoFim<@v_iPosicaoInicio)
            SET @v_sTexto = SUBSTRING(@v_sTexto, 1, @v_iPosicaoFim-1)+SUBSTRING(@v_sTexto, @v_iPosicaoFim+1, LEN(@v_sTexto))
        ELSE  
            IF (@v_iPosicaoInicio <> 0) 
                SET @v_sTexto = REPLACE(@v_sTexto, SUBSTRING(@v_sTexto, @v_iPosicaoInicio, @v_iTotalPosicoes), '') 
            ELSE
                BREAK;

        SET @v_iPosicaoInicio = 0 
        SET @v_iPosicaoFim    = 0 
        SET @v_iTotalPosicoes = 0 

    END

    SET @v_sTexto = REPLACE(@v_sTexto, '..', '. ')
    SET @v_sTexto = REPLACE(@v_sTexto, ',.', ', ')
    SET @v_sTexto = REPLACE(@v_sTexto, '?.', '? ')
    SET @v_sTexto = REPLACE(@v_sTexto, '!.', '! ')
    SET @v_sTexto = REPLACE(@v_sTexto, ',.', ', ')
    SET @v_sTexto = REPLACE(@v_sTexto, '.. ', '. ')
    SET @v_sTexto = REPLACE(@v_sTexto, ',. ', ', ')
    SET @v_sTexto = REPLACE(@v_sTexto, '?. ', '? ')
    SET @v_sTexto = REPLACE(@v_sTexto, '!. ', '! ')
    SET @v_sTexto = REPLACE(@v_sTexto, ',. ', ', ')
    SET @v_sTexto = REPLACE(@v_sTexto, '.  ', '. ')
    SET @v_sTexto = REPLACE(@v_sTexto, ',  ', ', ')
    SET @v_sTexto = REPLACE(@v_sTexto, '?  ', '? ')
    SET @v_sTexto = REPLACE(@v_sTexto, '!  ', '! ')
    SET @v_sTexto = REPLACE(@v_sTexto, ' . ', '. ')
    SET @v_sTexto = REPLACE(@v_sTexto, '&nbsp', '')
    SET @v_sTexto = RTRIM(@v_sTexto)
    SET @v_sTexto = LTRIM(@v_sTexto)
    

    RETURN @v_sTexto


END

Resultado da execução:

Caso você queira utilizar essa mesma função, mas com o código fonte em C# e utilizando no CLR, para ter uma performance muito superior, veja o post SQL Server – Como converter uma string HTML para texto (Remover tags HTML) utilizando o CLR (C#).

Um abraço e até mais!