Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 2
            [id] => 500485
            [titulo] => Removendo e Bloquear o uso Caracteres especiais
            [dataCadastro] => DateTime Object
                (
                    [date] => 2014-11-07 14:35:43
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 332951
            [status] => A
            [isExample] => 
            [NomeUsuario] => Fabiano Carvalho
            [Apelido] => FaabiianooC
            [Foto] => 332951_20140826143737.jpg
            [Conteudo] => COm base na tabela que te envie, basta incluir os que deseja.

[code]
ALTER FUNCTION [dbo].[FN_REMOVE_CHAR_ESPECIAL] (@TXTINICIAL VARCHAR(MAX)) RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @TXTSEQUENCIA VARCHAR(MAX)

/*
CARACTERES MINUSCULOS
*/
SET @TXTSEQUENCIA = REPLACE(@TXTINICIAL COLLATE Latin1_General_BIN,char(225),'a') --SELECT 'á',ASCII('á'); --225
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(224),'a') --SELECT 'à',ASCII('à'); --224
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(227),'a') --SELECT 'ã',ASCII('ã'); --227
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(226),'a') --SELECT 'â',ASCII('â'); --226
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(233),'e') --SELECT 'é',ASCII('é'); --233
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(232),'e') --SELECT 'è',ASCII('è'); --232
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(234),'e') --SELECT 'ê',ASCII('ê'); --234
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(237),'i') --SELECT 'í',ASCII('í'); --237
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(236),'i') --SELECT 'ì',ASCII('ì'); --236
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(238),'i') --SELECT 'î',ASCII('î'); --238
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(243),'o') --SELECT 'ó',ASCII('ó'); --243
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(242),'o') --SELECT 'ò',ASCII('ò'); --242
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(244),'o') --SELECT 'ô',ASCII('ô'); --244
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(245),'o') --SELECT 'õ',ASCII('õ'); --245
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(250),'u') --SELECT 'ú',ASCII('ú'); --250
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(249),'u') --SELECT 'ù',ASCII('ù'); --249
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(251),'u') --SELECT 'û',ASCII('û'); --251
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(252),'u') --SELECT 'ü',ASCII('ü'); --252
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(231),'c') --SELECT 'ç',ASCII('ç'); --231
/*
CARACTERES MAIUSCULOS
*/
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(193),'A') --SELECT 'Á',ASCII('Á'); --193
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(192),'A') --SELECT 'À',ASCII('À'); --192
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(194),'A') --SELECT 'Â',ASCII('Â'); --194
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(195),'A') --SELECT 'Ã',ASCII('Ã'); --195
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(201),'E') --SELECT 'É',ASCII('É'); --201
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(200),'E') --SELECT 'È',ASCII('È'); --200
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(202),'E') --SELECT 'Ê',ASCII('Ê'); --202
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(205),'I') --SELECT 'Í',ASCII('Í'); --205
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(204),'I') --SELECT 'Ì',ASCII('Ì'); --204
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(206),'I') --SELECT 'Î',ASCII('Î'); --206
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(211),'O') --SELECT 'Ó',ASCII('Ó'); --211
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(210),'O') --SELECT 'Ò',ASCII('Ò'); --210
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(212),'O') --SELECT 'Ô',ASCII('Ô'); --212
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(213),'O') --SELECT 'Õ',ASCII('Õ'); --213
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(218),'U') --SELECT 'Ú',ASCII('Ú'); --218
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(217),'U') --SELECT 'Ù',ASCII('Ù'); --217
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(219),'U') --SELECT 'Û',ASCII('Û'); --219
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(220),'U') --SELECT 'Ü',ASCII('Ü'); --220
SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(199),'C') --SELECT 'Ç',ASCII('Ç'); --199

RETURN (@TXTSEQUENCIA)

END
[/code] ) )

Removendo e Bloquear o uso Caracteres especiais

Alex Lekao
   - 24 out 2014

Ola Galere,
Gostaria de ajuda de vcs com relacao a um problema que tenho aqui na empresa.
Gosataria de saber se existe alguma forma pratica de removermos os caracteres especiais no banco, alguma funcao ou comando especifico.
E tambem se eh possivel fazer algum tipo de bloqueio para o uso destes caracteres.
Estou fazendo algumas pesquisas na net tbm, se alguem tiver ou souber e puder me ajudar, fico "devendo". rssr
Desde ja agradeco.
Abraco.

Post mais votado

Faabiianooc
   - 07 nov 2014

COm base na tabela que te envie, basta incluir os que deseja.

#Código

ALTER FUNCTION [dbo].[FN_REMOVE_CHAR_ESPECIAL] (@TXTINICIAL VARCHAR(MAX)) RETURNS VARCHAR(MAX) 
       AS 
BEGIN
   DECLARE @TXTSEQUENCIA VARCHAR(MAX) 

/*
CARACTERES MINUSCULOS
*/
   SET @TXTSEQUENCIA = REPLACE(@TXTINICIAL   COLLATE Latin1_General_BIN,char(225),'a') --SELECT 'á',ASCII('á'); --225 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(224),'a') --SELECT 'à',ASCII('à'); --224 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(227),'a') --SELECT 'ã',ASCII('ã'); --227 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(226),'a') --SELECT 'â',ASCII('â'); --226 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(233),'e') --SELECT 'é',ASCII('é'); --233 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(232),'e') --SELECT 'è',ASCII('è'); --232 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(234),'e') --SELECT 'ê',ASCII('ê'); --234 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(237),'i') --SELECT 'í',ASCII('í'); --237 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(236),'i') --SELECT 'ì',ASCII('ì'); --236 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(238),'i') --SELECT 'î',ASCII('î'); --238 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(243),'o') --SELECT 'ó',ASCII('ó'); --243 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(242),'o') --SELECT 'ò',ASCII('ò'); --242 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(244),'o') --SELECT 'ô',ASCII('ô'); --244 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(245),'o') --SELECT 'õ',ASCII('õ'); --245 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(250),'u') --SELECT 'ú',ASCII('ú'); --250 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(249),'u') --SELECT 'ù',ASCII('ù'); --249 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(251),'u') --SELECT 'û',ASCII('û'); --251 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(252),'u') --SELECT 'ü',ASCII('ü'); --252 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(231),'c') --SELECT 'ç',ASCII('ç'); --231 
/*
CARACTERES MAIUSCULOS
*/
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(193),'A') --SELECT 'Á',ASCII('Á'); --193 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(192),'A') --SELECT 'À',ASCII('À'); --192 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(194),'A') --SELECT 'Â',ASCII('Â'); --194 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(195),'A') --SELECT 'Ã',ASCII('Ã'); --195 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(201),'E') --SELECT 'É',ASCII('É'); --201 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(200),'E') --SELECT 'È',ASCII('È'); --200 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(202),'E') --SELECT 'Ê',ASCII('Ê'); --202 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(205),'I') --SELECT 'Í',ASCII('Í'); --205 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(204),'I') --SELECT 'Ì',ASCII('Ì'); --204 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(206),'I') --SELECT 'Î',ASCII('Î'); --206 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(211),'O') --SELECT 'Ó',ASCII('Ó'); --211 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(210),'O') --SELECT 'Ò',ASCII('Ò'); --210 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(212),'O') --SELECT 'Ô',ASCII('Ô'); --212 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(213),'O') --SELECT 'Õ',ASCII('Õ'); --213 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(218),'U') --SELECT 'Ú',ASCII('Ú'); --218 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(217),'U') --SELECT 'Ù',ASCII('Ù'); --217 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(219),'U') --SELECT 'Û',ASCII('Û'); --219 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(220),'U') --SELECT 'Ü',ASCII('Ü'); --220 
   SET @TXTSEQUENCIA = REPLACE(@TXTSEQUENCIA COLLATE Latin1_General_BIN,char(199),'C') --SELECT 'Ç',ASCII('Ç'); --199 

   RETURN (@TXTSEQUENCIA) 

END

Roniere Almeida
   - 24 out 2014

Boa tarde Alex, pelo que pesquisei tambem, pode-se mudar o Collation, mas não sei se é possivel com o banco em produção.

olha aqui:

http://emersonhermann.blogspot.com.br/2011/07/remover-caracteres-especiais-em-campos.html

Alex Lekao
   - 24 out 2014

Oi Roniere,

Ate cheghei nesse link tbm, pelo que percebi nas pesquisas ate eh possivel vc mudar a collation com o banco em producao, mas nao sei se influenciara alguma coisa no ERP de modo geral.

Pelas pesquisas ate encontrei que tem como mudar a collation da coluna em especifico ou da tabela, mas pelo que estou vendo na cobre todos os caracteres. rsrr

Roniere Almeida
   - 24 out 2014

Para evitar problemas no servidor de produção é bom testar em outro ambiente, no caso o de testes.

Alex Lekao
   - 24 out 2014

Pois eh, os caras nao tem ambiente de testes aqui. rsrsr

entao, fico a ver navios. rsrsr

Roniere Almeida
   - 24 out 2014

Eu não sei se para vocês é perder tempo, mas tem como fazer ou pelo menos tentar recriar um ambiente parecido com o utilizado, com maquinas virtuais mesmo.

Alex Lekao
   - 24 out 2014

cara eu ate sei, ja ate propus, mas os caras normalmente nao autorizam, sao "disconfiados", e nao tiro a razao deles, tem muita gente que vem com essa desculpe de maquina virtual e tal e faz m... em cima de m... nessas VMs. rsrsr

Marisiana
   - 24 out 2014

Você poderia criar um banco e restaurar um backup dele nesse banco com alguns dados para fazer os testes.
Como se fizesse uma replica do banco...

Roniere Almeida
   - 24 out 2014

Rapaz, ta dificil hein, hehehe, brincadeira, entendo como deve ser, essa opção da Marisiana é bem mais viavel.

Marisiana
   - 24 out 2014

Sim... é bem prático! =)
Eu faço isso quando preciso testar alguma coisa q não pode ser em produção...

Alex Lekao
   - 28 out 2014

Oi Marisiana,

Eu ate fazia isso quando o servidor era local, agora como ele esta no Data Center, eu evito ficar movendo bases de la para ca(local).

Embora que seja possivel restaurar a base com outro nome, mesmo no Data Center, como o pessoal eh meio desconfiado, prefiro evitar.

To numa sinuca de bico.

=/

Citação:
Você poderia criar um banco e restaurar um backup dele nesse banco com alguns dados para fazer os testes.
Como se fizesse uma replica do banco...


Ate é, mas eh meio complicado de fazer isso pelos motivos citados acima. rsrsr

Citação:
Rapaz, ta dificil hein, hehehe, brincadeira, entendo como deve ser, essa opção da Marisiana é bem mais viavel.

Roniere Almeida
   - 28 out 2014

Essa é uma questão bem especifica, queria mesmo te ajudar.

Alex Lekao
   - 28 out 2014

blz.

Sem crise... mas estou me virando a medida do possivel. rsrsr

Roniere Almeida
   - 28 out 2014

Para finalizar minha participação, se puder depois nos informe como foi feito, ta certo?

Marisiana
   - 28 out 2014

Entendo Alex, é complicado.
Você podia tentar pedir se é possível criar uma base testes que fique fixa e sempre com o mesmo nome.
Nunca apanhe esse banco. Elimine tabelas, limpe os dados quantas vezes for necessário, restaure backups de diferentes bases...
Parece meio louco, mas talvez seja uma idéia útil... =D

Faabiianooc
   - 28 out 2014

Possivel atualizar é sim e bloquear o uso de carcteres especias também é possivel, nem que seja um trigger.
Voce pode criar um função e verificar qual é o codigo asc dele e dar um replace pra vazio, ou substituir para algo que voce queira, estou meio sem tempo agora, mas a idéia é essa, amanha durante o dia se voce nao conseguir resolver eu retorno para auxiliar melhor.

Alex Lekao
   - 29 out 2014

Oi Roniere,

Pode deixar que comento aqui sim. rsrs

Citação:
Para finalizar minha participação, se puder depois nos informe como foi feito, ta certo?


sim, eu ate fazia isso antes, qdo era tudo local, agora que esta na cloud nao estou fazendo mais, e no sistema anterior eu mantinha um ambiente de testes / homologacao, neste erp atual o pessoal nao tem isso.

tbm acho interessante poder ter essa possibilidade, ja comentei no passado, a resposta foi que nao tinham e nao disponibilizavam isso, mas quem sabe pedindo mais umas vezes(200 talves. rsrsr) eles amolecem o coracao e liberam. rssr

Citação:
Entendo Alex, é complicado.
Você podia tentar pedir se é possível criar uma base testes que fique fixa e sempre com o mesmo nome.
Nunca apanhe esse banco. Elimine tabelas, limpe os dados quantas vezes for necessário, restaure backups de diferentes bases...
Parece meio louco, mas talvez seja uma idéia útil... =D


Blz, eu estive pensando em algo do tipo tbm, ate achei functions na net que ajudaria, mas tudo muito superficial, trigger? sem chance, os caras bloquearam isso no banco, eu tinha uma que funcionava perfeitamente e hj nao mais. rsrsrsr(pq foi removida e bloqueado o uso. rsrsr)

mas Fabiano, muito obrigado pelo empenho, toda ajuda eh bem vinda.

Citação:
Possivel atualizar é sim e bloquear o uso de carcteres especias também é possivel, nem que seja um trigger.
Voce pode criar um função e verificar qual é o codigo asc dele e dar um replace pra vazio, ou substituir para algo que voce queira, estou meio sem tempo agora, mas a idéia é essa, amanha durante o dia se voce nao conseguir resolver eu retorno para auxiliar melhor.

Faabiianooc
   - 29 out 2014

Essa função remove os caracteres.
Com isso voce pode remover os já existentes. Pra novos valores, acredito que você possa criar uma constraint do tipo check, e nisso você faz os valores passar por essa função; (Precisa dar alter table ... alter column)

Link da tabela asc: Clique na imagem para abrir em uma nova janela

Dúvidas, só sinalizar.
#Código

CREATE FUNCTION [dbo].[FN_REMOVER_CHAR_INVALIDO] (@DIRTY VARCHAR(MAX)) RETURNS VARCHAR(MAX) 
       AS 
BEGIN
   DECLARE @CLEAN VARCHAR(MAX) 
   DECLARE @STEP  INT
   SET @STEP = 1
       
   DECLARE @STR TABLE(CARACTERES VARCHAR(MAX))
   INSERT INTO @STR(CARACTERES) SELECT '' AS CARACTERES
   
   WHILE @STEP <= LEN(LTRIM(RTRIM(@DIRTY)))
         BEGIN
            IF (ASCII(SUBSTRING(@DIRTY,@STEP,1)) >= 65 AND ASCII(SUBSTRING(@DIRTY,@STEP,1)) <= 90) --Alterar Esse filtro
						OR ASCII(SUBSTRING(@DIRTY,@STEP,1)) IN (32,44,45,46) --e esse tambem
               BEGIN
                  SET @CLEAN = SUBSTRING(@DIRTY,@STEP,1)
                  UPDATE @STR SET CARACTERES = CARACTERES + @CLEAN
               END
            SET @STEP = @STEP + 1
         END
   RETURN(SELECT CARACTERES FROM @STR)
END

Faabiianooc
   - 29 out 2014

e ai, deu certo?

Alex Lekao
   - 06 nov 2014

Oi Fabiano,

Desculpe cara, nem cheguei a tentar, fiquei fora do forum por um tempo, muita correria do dia a dia aqui.

cara se eu entendi bem essa funcao eh show, ela isola os caracteres normais e os mais usados, virgula, ponto, traco, essas coisas certo?

mas no caso nao eh feita nenhuma substituicao por um outrao caracter correspondente, correto?

por exemplo, faça ficaria faa, certo?

vou me organizar aqui e fazer uns testes.

Obrigado!!!!