segunda-feira, 4 de julho de 2011

Remover caracteres especiais em campos do SQL Server

Function scalar no SQL SERVER para remover caracteres especiais, exatamente 33 caracteres de controle (especiais) menos o NULL ficando 32 ao todo, recomendo usar essa store function, (store procedure) em procedimentos de ETL, migração de dados ou em consultas que precisem remover esses tais caracteres da tabela ASCII.

Fica aqui o compartilhamento do conhecimento.

Abraços.

--
-- Nome Artefato/Programa..: sp_rm_special_chars.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann at gmail.com)  O Peregrino (http://www.emersonhermann.blogspot.com) 
-- Data Inicio ............: 04/07/2011
-- Data Atual..............: 04/07/2011
-- Versao..................: 0.01
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2008
-- Kernel..................: Nao informado!
-- Finalidade..............: store procedure (function) para remocao de caracteres especiais do ASCII (33) caracteres nao imprimiveis 
-- OBS.....................: Remover "caracteres especiais" em campos do SQL Server
--

IF EXISTS
(
    SELECT * 
      FROM sys.objects 
     WHERE object_id = OBJECT_ID(N'[dbo].[sp_rm_special_chars]') 
       AND type IN (N'FN')
)
    DROP FUNCTION sp_rm_special_chars
GO

CREATE FUNCTION sp_rm_special_chars (@stexto varchar(max))
RETURNS varchar(max)
AS 
 BEGIN
 IF @stexto IS NULL BEGIN  
     RETURN NULL 
 END 
 -- Tabela ASCII
 -- Caracteres não imprimiveis, 33 ao total, menos o NUL fica 32 
 --  hex d abr ctl descricao  
 --  00  0 NUL ^@ Null - Nulo desativado, pois o nulo no postgres funciona em forma de cascata      
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(1),''))  --  01  1 SOH ^A Start of Header - Início do cabeçalho
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(2),''))  --  02  2 STX ^B Start of Text - Início do texto
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(3),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(4),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(5),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(6),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(7),''))  --  07  7 BEL ^G Bell - Campainha
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(8),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(9),''))  --  09  9 HT  ^I  Horizontal Tabulation - Tabulação horizontal
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(10),'')) --  0A 10 LF  ^J Line-Feed - Alimenta linha
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(11),'')) --  0B 11 VT  ^K  Vertical Tabulation - Tabulação vertical
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(12),'')) --  0C 12 FF  ^L Form-Feed - Alimenta formulário
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(13),'')) --  13 19 DC3 ^S Device-Control 3
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(14),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(15),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(16),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(17),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(18),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(19),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(20),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(21),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(22),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(23),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(24),'')) -- 18 24 CAN ^X Cancel
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(25),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(26),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(27),'')) -- 1B 27 ESC ^[ Escape
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(28),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(29),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(30),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(31),''))
 SET @stexto = (SELECT REPLACE(@stexto, CHAR(127),'')) -- 7F127 DEL ^?  Delete     

 RETURN @stexto     
END
GO

-- Exemplo de uso: 

-- SELECT texto = dbo.sp_rm_special_chars ('legal e bom'), getdate() as data;  -- 'legal e bom' 
-- SELECT texto = dbo.sp_rm_special_chars ('NULL'), getdate() as data;  -- 'NULL'
-- SELECT texto = dbo.sp_rm_special_chars (NULL), getdate() as data;   -- NULL

Nenhum comentário:

Postar um comentário