quinta-feira, 10 de abril de 2008

Como retirar acento de caracteres

Por uma necessidade de regra de negócio ou para exportar dados para outras fontes de dados, as vezes precisamos tirar acento dos caracteres de certas colunas ou expressões.

Existem várias formas para resolver esses casos. Podemos criar uma procedure ou função com uma estrutura do tipo DE/PARA e desenvolver um código que captura a informação passada como parâmetro, lêr cada caracter dessa expressão e faz a troca de acordo com a estrutura DE/PARA.
O processo consiste em fazer a troca de um caracter acentuado por outro caracter sem o acento.

A proposta aqui é mostra a utilização do comando COLLATE para fazer a troca dos caracteres acentuados. Seja o exemplo:


Declare @cExpressao varchar(30)
Set @cExpressao = 'aeiouáéíóúàèìòòâêîôûãõäëïöüç'
Select @cExpressao collate sql_latin1_general_cp1251_ci_as


------------------------------
aeiouaeiouaeiooaeiouaoaeiouc


(1 row(s) affected)

Declare @cExpressao varchar(30)
Set @cExpressao = 'AEIOUÁÉÍÓÚÀÈÌÒÒÂÊÎÔÛÃÕÄËÏÖÜÇ'
Select @cExpressao collate sql_latin1_general_cp1251_ci_as

------------------------------
AEIOUAEIOUAEIOOAEIOUAOAEIOUC

(1 row(s) affected)


Podemos criar uma função que contém a regra acima, conforme exemplo abaixo:

Create Function fnTiraAcento (@cExpressao varchar(100))
Returns varchar(100)
as
Begin


Declare @cRetorno varchar(100)

Set @cRetorno = @cExpressao collate sql_latin1_general_cp1251_cs_as
Return @cRetorno

End

GO

Declare @cExpressao varchar(30)

Set @cExpressao = 'AEIOUÁÉÍÓÚÀÈÌÒÒÂÊÎÔÛÃÕÄËÏÖÜÇ'
Select dbo.fnTiraAcento( @cExpressao )

Set @cExpressao = 'aeiouáéíóúàèìòòâêîôûãõäëïöüç'

Select dbo.fnTiraAcento( @cExpressao )

----------------------------
AEIOUAEIOUAEIOOAEIOUAOAEIOUC

(1 row(s) affected)

----------------------------
aeiouaeiouaeiooaeiouaoaeiouc

(1 row(s) affected)

Se voce tem informações em uma coluna do tipo nchar e nvarchar , voce deve passar os dados para um tipo char e varchar. Exemplo:

Declare @cExpressao nvarchar(30)
Set @cExpressao = 'aeiouáéíóúàèìòòâêîôûãõäëïöüç'
Select @cExpressao collate sql_latin1_general_cp1251_ci_as

------------------------------
aeiouáéíóúàèìòòâêîôûãõäëïöüç

(1 row(s) affected)

Não ocorreu a troca dos acentos. Fazendo a conversão implícita do tipo unicode, voce consegue fazer a troca dos acentos.

Declare @cExpressao nvarchar(30)
Declare @cExpr varchar(30)
Set @cExpressao = 'aeiouáéíóúàèìòòâêîôûãõäëïöüç'
Set @cExpr = @cExpressao
Select @cExpr collate sql_latin1_general_cp1251_ci_as

------------------------------
aeiouaeiouaeiooaeiouaoaeiouc

(1 row(s) affected)


Utilizando a função criada no exemplo anterior, não temos a necessidade de fazer a conversão.
Como o parametro da função não é do tipo unicode, no momento da passagem a expressão caracter, ocorre a conversão implícita.


Declare @cExpressao nvarchar(30)
Set @cExpressao = 'aeiouáéíóúàèìòòâêîôûãõäëïöüç'
Select dbo.fnTiraAcento( @cExpressao )

----------------------------
aeiouaeiouaeiooaeiouaoaeiouc

(1 row(s) affected)

O Collate utilizado nesse exemplo (sql_latin1_general_cp1251_cs_as) foi escolhido entre 315 'collates' existente no SQL SERVER 2005 que fizeram a conversão dos conjuntos de caracteres acima.

A relação de collate é obtida atraves de função ::fn_helpcollations()

select * from ::fn_helpcollations()

Para maiores detalhes sobre COLLATE, consulte o BOL do SQLServer. Abaixo segue link sobre o assunto:

http://imasters.uol.com.br/artigo/262

Nenhum comentário: