sábado, 26 de novembro de 2011

Remover acentos em SQL SERVER 2005 / 2008 / 2012


APDSJ!

Função (store function) para remover acentos em SQL Server 2005, SQL Server 2008 e SQL Server 2012.

Funciona para maiúsculas e minúsculas e com banco de dados em latin1, mas pode ser adaptada facilmente para outro encoding.

Espero ter ajudado!


IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N'[dbo].[usf_rm_accent_pt_latin1]') 
               AND type IN (N'FN')
           )
 DROP FUNCTION usf_rm_accent_pt_latin1;
GO
CREATE FUNCTION usf_rm_accent_pt_latin1 (@txt varchar(max)) RETURNS varchar(max) 
-- Nome Artefato/Programa..: usf_rm_accent_pt_latin1.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) 
-- Data Inicio ............: 26/11/2011
-- Data Atualizacao........: 08/10/2012
-- Versao..................: 0.03
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008/2012
-- Kernel..................: Nao informado!
-- Finalidade..............: store function para remover acentos maiúsculos e minúsculos em latin1 pt
-- OBS.....................: só funciona para banco configurado com o collate latin1, para saber qual o collate do seu banco execute essa query 
-- ........................: SELECT DatabasePropertyEx(db_name(),'Collation');
--
BEGIN
DECLARE @txt0 varchar(max) 
 --caixa baixa
    SET @txt0 = replace(@txt COLLATE Latin1_General_BIN, char(225),'a')  --SELECT 'á',ASCII('á'); --225
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(224),'a')  --SELECT 'à',ASCII('à'); --224   
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(227),'a')  --SELECT 'ã',ASCII('ã'); --227 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(226),'a')  --SELECT 'â',ASCII('â'); --226
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(233),'e')  --SELECT 'é',ASCII('é'); --233 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(232),'e')  --SELECT 'è',ASCII('è'); --232
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(234),'e')  --SELECT 'ê',ASCII('ê'); --234
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(237),'i')  --SELECT 'í',ASCII('í'); --237 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(236),'i')  --SELECT 'ì',ASCII('ì'); --236
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(238),'i')  --SELECT 'î',ASCII('î'); --238 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(243),'o')  --SELECT 'ó',ASCII('ó'); --243
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(242),'o')  --SELECT 'ò',ASCII('ò'); --242
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(244),'o')  --SELECT 'ô',ASCII('ô'); --244
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(245),'o')  --SELECT 'õ',ASCII('õ'); --245
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(250),'u')  --SELECT 'ú',ASCII('ú'); --250
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(249),'u')  --SELECT 'ù',ASCII('ù'); --249
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(251),'u')  --SELECT 'û',ASCII('û'); --251 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(252),'u')  --SELECT 'ü',ASCII('ü'); --252 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(231),'ç')  --SELECT 'ç',ASCII('ç'); --231
 -- caixa alta
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(193),'A')  --SELECT 'Á',ASCII('Á'); --193
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(192),'A')  --SELECT 'À',ASCII('À'); --192  
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(194),'A')  --SELECT 'Â',ASCII('Â'); --194
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(195),'A')  --SELECT 'Ã',ASCII('Ã'); --195
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(201),'E')  --SELECT 'É',ASCII('É'); --201
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(200),'E')  --SELECT 'È',ASCII('È'); --200
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(202),'E')  --SELECT 'Ê',ASCII('Ê'); --202
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(205),'I')  --SELECT 'Í',ASCII('Í'); --205
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(204),'I')  --SELECT 'Ì',ASCII('Ì'); --204
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(206),'I')  --SELECT 'Î',ASCII('Î'); --206
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(211),'O')  --SELECT 'Ó',ASCII('Ó'); --211
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(210),'O')  --SELECT 'Ò',ASCII('Ò'); --210
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(212),'O')  --SELECT 'Ô',ASCII('Ô'); --212
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(213),'O')  --SELECT 'Õ',ASCII('Õ'); --213
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(218),'U')  --SELECT 'Ú',ASCII('Ú'); --218
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(217),'U')  --SELECT 'Ù',ASCII('Ù'); --217
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(219),'U')  --SELECT 'Û',ASCII('Û'); --219 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(220),'U')  --SELECT 'Ü',ASCII('Ü'); --220
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(199),'C')  --SELECT 'Ç',ASCII('Ç'); --199
     
 RETURN (@txt0)
END
GO
    
-- Exemplo de uso da function

-- Ex.: 01 - Removendo acentos nas consultas
-- SELECT dbo.usf_rm_accent_pt_latin1('café, Sofá, pé,caÇa, CAÇA, aviões, sapê, à, sítio, Avião, LÂMPADA, mesa, cadeira, AVIÕES');  
-- Retorno: cafe, Sofa, pe,caCa, CACA, avioes, sape, a, sitio, Aviao, LAMPADA, mesa, cadeira, AVIOES


-- Ex.: 02 - Removendo acentos no campo obs da tabela1 
-- UPDATE tabela1 SET obs = dbo.usf_rm_accent_pt_latin1(obs); 
--





O Peregrino agradece o acesso, tenha um bom trabalho!
:)

4 comentários:

  1. c cedilha minúsculo não está ok.
    Confere?

    ResponderExcluir
  2. Está correto, "Ç" é convertido para "C" e "ç" é convertido "c", conforme query abaixo:
    SELECT char(231), char(199);
    Mas se não lhe convier é só remover a linha 44 e 64 e adaptar para a sua necessidade.

    ResponderExcluir