Tipo,
¡Buenas tardes!

Hoy les mostraré cómo eliminar etiquetas HTML de una cadena en SQL Server usando solo T-SQL. Esta función me resultó muy útil, ya que necesitaba incluir una columna en un informe que se exportaba a XLS (Excel), pero esta columna era la descripción HTML de las llamadas generadas por el sistema y en Excel ese montón de etiquetas HTML no se veían muy bien. Fue realmente malo de leer... Fue entonces cuando desarrollé esta función y se la presenté.

Código fuente de la función 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 fuente de la función fncRemove_Formatacao_Html

Otra forma de eliminar etiquetas HTML y formato de una cadena es usar la función fncRemove_Formatacao_Html, que demuestro a continuación.

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 de la ejecución:

Si quieres usar esta misma función, pero con el código fuente en C# y usándolo en el CLR, para un rendimiento mucho mejor, mira el post SQL Server: cómo convertir una cadena HTML en texto (eliminar etiquetas HTML) usando CLR (C#).

¡Un abrazo y hasta luego!