quarta-feira, 15 de setembro de 2010

Removendo caracteres não imprimíveis

Em aplicações que utilizam campos memo, integrações de dados com arquivos texto, Excel  ou outras fontes de dados, podemos ter problemas com os famosos caracteres não imprimíveis.

Fontes de grande dor de cabeça, ao tratarmos campos e variáveis com estes caracteres, problemas diversos podem ser encontrados como comprimentos de campos que não correspondem ao que está visível, apresentação em aplicações Web bagunçadas, funções com retornos discrepantes, procedures com comportamentos inesperados, etc.

Pesquisando na internet localizei a função abaixo no www.sqlservercentral.com, e realizei algumas pequenas alterações, como a mudança dos tipos de dados de Varchar(8000) para Varchar(Max).

Vejam abaixo a função na íntegra:

CREATE FUNCTION dbo.RemoveNonDisplayChars(@pString VARCHAR(MAX))

RETURNS VARCHAR(MAX)

     AS

  BEGIN

 

DECLARE

@IncorrectCharLoc SMALLINT,       

@Pattern          CHAR(37) 

 

 SELECT @Pattern          = '%['

                          + CHAR(0)+CHAR(1)+CHAR(2)+CHAR(3)+CHAR(4)

                          + CHAR(5)+CHAR(6)+CHAR(7)+CHAR(8)+CHAR(9)

                          + CHAR(10)+CHAR(11)+CHAR(12)+CHAR(13)+CHAR(14)

                          + CHAR(15)+CHAR(16)+CHAR(17)+CHAR(18)+CHAR(19)

                          + CHAR(20)+CHAR(21)+CHAR(22)+CHAR(23)+CHAR(24)

                          + CHAR(25)+CHAR(26)+CHAR(27)+CHAR(28)+CHAR(29)

                          + CHAR(30)+CHAR(31)+CHAR(127)

                          + ']%',

        @IncorrectCharLoc = PATINDEX(@Pattern, @pString)

 

  WHILE @IncorrectCharLoc > 0

SELECT @pString          = STUFF(@pString, @IncorrectCharLoc, 1, ''),

@IncorrectCharLoc = PATINDEX(@Pattern, @pString)

 RETURN @pString

    END

GO

 

 

A query abaixo, retorna o valor 7, pois além da string “teste” temos também uma quebra de linha:

SELECT LEN('

teste')

 

A query abaixo, retorna o valor 5, pois se utiliza da função de remoção de caracteres não imprimíveis:

SELECT LEN(dbo.RemoveNonDisplayChars('

teste'))

 

 

 

Até a próxima!

 

Nenhum comentário:

Postar um comentário

Leave your comment here!