Olá Pessoal,
Bom dia.

Neste post irei comentar rapidamente sobre uma função UDF (User Defined Function) que costumava utilizar para remover acentos e caracteres especiais de uma string no SQL Server.

Removendo acentos

Existem várias formas de se fazer isso, como utilizando uma UDF para fazer esse trabalho, uma função SQLCLR ou a que eu prefiro, que é utilizando o COLLATION.

Utilizando uma função UDF

CREATE FUNCTION [dbo].[fncRemove_Acentuacao2](
    @String VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
    
    /****************************************************************************************************************/
    /** RETIRA ACENTUAÇÃO DAS VOGAIS **/
    /****************************************************************************************************************/
    SET @String = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@String,'á','a'),'à','a'),'â','a'),'ã','a'),'ä','a')
    SET @String = REPLACE(REPLACE(REPLACE(REPLACE(@String,'é','e'),'è','e'),'ê','e'),'ë','e')
    SET @String = REPLACE(REPLACE(REPLACE(REPLACE(@String,'í','i'),'ì','i'),'î','i'),'ï','i')
    SET @String = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@String,'ó','o'),'ò','o'),'ô','o'),'õ','o'),'ö','o')
    SET @String = REPLACE(REPLACE(REPLACE(REPLACE(@String,'ú','u'),'ù','u'),'û','u'),'ü','u')
    
    /****************************************************************************************************************/
    /** RETIRA ACENTUAÇÃO DAS CONSOANTES **/
    /****************************************************************************************************************/
    SET @String = REPLACE(@String,'ý','y')
    SET @String = REPLACE(@String,'ñ','n')
    SET @String = REPLACE(@String,'ç','c')
    
    RETURN UPPER(@String)

END
GO

SQL Server - Remove acentuação 2
SQL Server - Remove acentuação 2

Utilizando uma função SQLCLR

using System.Text;
using System.Data.SqlTypes;
using System.Globalization;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString fncRemove_Acentuacao(SqlString Ds_Texto)
    {

        if (Ds_Texto.IsNull)
            return null;

        var s = Ds_Texto.Value.Normalize(NormalizationForm.FormD);
        var sb = new StringBuilder();

        foreach (var t in s)
        {
            var uc = CharUnicodeInfo.GetUnicodeCategory(t);
            if (uc != UnicodeCategory.NonSpacingMark)
            {
                sb.Append(t);
            }
        }

        return sb.ToString();

    }
};

SQL Server - Remove acentuação - SQL CLR
SQL Server - Remove acentuação - SQL CLR

Utilizando o Collation
Na minha opinião, essa é a melhor forma de se remover acentuação de uma string no SQL Server. Ela é a forma mais rápida de se fazer e é nativa do próprio banco de dados (ou seja, universal, funciona em qualquer banco SQL Server).

SQL Server - Remove acentuação - Collate
SQL Server - Remove acentuação - Collate

Para saber todos os tipos de COLLATION, você pode executar o comando abaixo:

select name, description
from ::fn_helpcollations() 
where name like 'SQL_Latin%'
AND NAME NOT LIKE '%1254%'

Removendo caracteres especiais

Com o uso da função abaixo, pode-se remover aqueles caracteres especiais de uma string e retornar apenas os caracteres alfanuméricos.

CREATE FUNCTION [dbo].[fncRemove_Caracteres_Especiais](
    @String VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN

    
    DECLARE 
        @Result VARCHAR(MAX), 
        @StartingIndex INT = 0
    
    
    WHILE (1 = 1)
    BEGIN 
        
        SET @StartingIndex = PATINDEX('%[^a-Z|0-9|^ ]%',@String) 
        
        IF (@StartingIndex <> 0)
            SET @String = REPLACE(@String,SUBSTRING(@String, @StartingIndex,1),'') 
        ELSE 
            BREAK

    END	
    
    SET @Result = REPLACE(@String,'|','')
    
    RETURN @Result

END
GO

SQL Server - Remover caracteres especiais - UDF
SQL Server - Remover caracteres especiais - UDF

É isso aí, pessoal!
Até a próxima.