quarta-feira, janeiro 23, 2008

Remover registros duplicados utilizando tabela temporária

Tive um probleminha com uma tabela no banco de dados (SQLServer 2000) onde trabalho, que estava sem chave primária (não fui eu quem criei), e após algumas importações e exportações muitos registros ficaram duplicados. Foi necessário então criar uma query para remover as entradas duplicadas, sendo que algumas estavam com 5 registros duplicados, outras com 4, outras com 3, assim sucessivamente...

Então, para cada quantidade de registros duplicados é necessário ajustar o valor do count conforme descrito abaixo:

--- a) Cria tabela temporária
CREATE TABLE #tb_temp
(cid_cod int,
cid_nome varchar(50),
uf char(2),
data datetime
)

--- Observação geral: *atualizar o valor do count p/ qtdade de registros duplicados que você deseja consultar.

--- b) Consulta registros duplicados
[*atualizar count]
SELECT cid_cod, cid_nome FROM tb_cidades WHERE cid_cod IS NOT NULL GROUP BY cid_cod, cid_nome HAVING Count(*)=2

--- c) Insere 1 registro do campo repetido na tabela temporária [*atualizar count]
INSERT INTO #tb_temp
SELECT cid_cod, cid_nome, uf, data
FROM [tb_cidades] As Tmp GROUP BY cid_cod, cid_nome, uf, data HAVING Count(*)=2

--- d) Deleta todos os registros do campo repetido na tabela original [*atualizar count]
DELETE FROM tb_cidades
WHERE cid_cod IN
(SELECT cid_cod FROM tb_cidades WHERE cid_cod IS NOT NULL GROUP BY cid_cod HAVING Count(*)=2)

--- e) Insere 1 registro da temporária na tabela original
INSERT INTO tb_cidades SELECT * FROM #tb_temp

--- f) Consulta o registro pelo nome (verifica se a duplicidade foi corrigida) [*atualizar o cid_nome]
SELECT * FROM tb_cidades WHERE cid_nome like 'BELEM'

--- g) Deleta tabela temporária
DROP TABLE #tb_temp


Uma observação importante é:
- Não tente fazer JOIN (INNER, LEFT, RIGHT etc) utilizando tabela temporária, não vai funcionar. Se realmente precisar fazer isso crie uma View talvez isso resolva seu problema.

terça-feira, janeiro 15, 2008

UDF Coldfusion para converter quebra de linha

Hoje eu tive que desenvolver uma UDF em Coldfusion para resolver esse pequeno problema. A UDF por sua vez faz o seguinte converte o código ASC que representa quebra de linha para o formato de exibição em HTML, no caso <br />.


<cffunction name="converteQuebraDeLinha" returntype="string"
output="false" hint="Converte código ASC de quebra de linha

para <br />">

<cfargument name="s_texto" type="string">

<cfscript>

result = reReplace(arguments.s_texto, chr(13) & chr(10), "<br/>", "ALL");

result = reReplace(result, chr(13), "<br />","ALL");

result = reReplace(result, chr(10), "<br />","ALL");

</cfscript>
<cfreturn result>
</cffunction>