Hola, chicos,
Buen día.
En esta publicación comentaré brevemente una función UDF (Función definida por el usuario) que solía usar para eliminar acentos y caracteres especiales de una cadena en SQL Server.
Quitar acentos
Hay varias formas de hacer esto, como usar una UDF para hacer este trabajo, una función SQLCLR o la que yo prefiero que es usar COLLATION.
Usando una función 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

Usando una función 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();
}
};

Usando la intercalación
En mi opinión, esta es la mejor manera de eliminar la acentuación de una cadena en SQL Server. Es la forma más rápida de hacerlo y es nativa de la propia base de datos (es decir, universal, funciona en cualquier base de datos SQL Server).

Para conocer todos los tipos de COLLATION, puede ejecutar el siguiente comando:
select name, description
from ::fn_helpcollations()
where name like 'SQL_Latin%'
AND NAME NOT LIKE '%1254%'
Eliminar caracteres especiales
Usando la siguiente función, puede eliminar esos caracteres especiales de una cadena y devolver solo los 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

¡Eso es todo, amigos!
Hasta la próxima.
Comentários (0)
Carregando comentários…