Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

inforthiago

Mudar IF para CASE

Recommended Posts

Olá Pessoal !!!

 

Estou com uma duvida q é a seguinte. Tenho uma query que eu criei q conta os espaços em branco de uma coluna e depois quebra em varias colunas.

 

EXEMPLO:

 

TELEFONE

12345678 87456321 45123678 36251478

 

A query conta o numero de espaço em branco q existe na coluna no caso são 4 espaços e ele quebra a coluna em 4 partes.

 

EXEMPLO:

TEL1	TEL2	TEL3	TEL4
12345678	87456321	45123678	36251478

 

Mas eu acho q o processo da query é muito lento e gostaria da ajuda de vcs para poder melhorar a desempenho dessa query.

 

Derrepente modificando os IF por CASE ou criando funções, mas eu não sei como fazer essa modificação.

 

set nocount on

declare @telefone varchar(44),
@cnpj varchar(14),
@uf varchar(2),
@telefoneNovo1 varchar (8),
@telefoneNovo2 varchar (8),
@telefoneNovo3 varchar (8),
@telefoneNovo4 varchar (8),
@telefoneNovo5 varchar (8),
@espaco1 int,
@espaco2 int,
@espaco3 int,
@espaco4 int,
@Pos int,
@Sumtelefone int


SET @Pos = 1
SET @Sumtelefone = 0
set @espaco1 = charindex(' ', @telefone)
set @espaco2 = charindex(' ', @telefone, @espaco1+1)
set @espaco3 = charindex(' ', @telefone, @espaco2+1)
set @espaco4 = charindex(' ', @telefone, @espaco3+1)

declare cr_cursor cursor FOR 
--pega os 20 primeiros registros da uf rj
select distinct top 20 uf, telefone, cnpj from pjnovo
where uf = 'rj' and telefone is not null

open cr_cursor 
fetch next from cr_cursor into @uf, @telefone, @cnpj
while @@fetch_status = 0 
begin 
	--iniciando
	SET @Pos = 0
	SET @Sumtelefone = 0
	set @espaco1 = charindex(' ', @telefone)
	set @espaco2 = charindex(' ', @telefone, @espaco1+1)
	set @espaco3 = charindex(' ', @telefone, @espaco2+1)
	set @espaco4 = charindex(' ', @telefone, @espaco3+1)
	
	--verifica se @Pos menor igual tamanho do @telefone	
	while @Pos <= DATALENGTH(@telefone)
	begin 
		--conta espaco em branco
		IF ASCII(SUBSTRING(@telefone, @Pos, 1)) = 32
			set @Sumtelefone = @Sumtelefone + 1
		SET @Pos = @Pos + 1		
		
		--pega apenas um registro por vez	
		SELECT top 1 @cnpj = cnpj FROM pjnovo where telefone = @telefone and uf = @uf 
		order by 1
		--verificando o total de espaços em branco para poder quebra a coluna do telefone
				IF(@Sumtelefone = 0)
				BEGIN
					SET @telefoneNovo1 = substring(@telefone, 1, 100)
					SET @telefoneNovo2 = ''
					SET @telefoneNovo3 = ''
					SET @telefoneNovo4 = ''
					SET @telefoneNovo5 = ''
				END
				ELSE	
				IF(@Sumtelefone = 1)
				BEGIN
					SET @telefoneNovo1 = substring(@telefone, 1, @espaco1-1)
					SET @telefoneNovo2 = substring(@telefone, @espaco1+1, 100)
					SET @telefoneNovo3 = ''
					SET @telefoneNovo4 = ''
					SET @telefoneNovo5 = ''
				END
				ELSE					
				IF(@Sumtelefone = 2)
				BEGIN
					SET @telefoneNovo1 = substring(@telefone, 1, @espaco1-1)
					SET @telefoneNovo2 = substring(@telefone, @espaco1+1, @espaco2-@espaco1-1)
					SET @telefoneNovo3 = substring(@telefone, @espaco2+1, 100)
					SET @telefoneNovo4 = ''
					SET @telefoneNovo5 = ''
				END
				ELSE
				IF(@Sumtelefone = 3)
				BEGIN
					SET @telefoneNovo1 = substring(@telefone, 1, @espaco1-1);
					SET @telefoneNovo2 = substring(@telefone, @espaco1+1, @espaco2-@espaco1-1)
					SET @telefoneNovo3 = substring(@telefone, @espaco2+1, @espaco3-@espaco2-1)
					SET @telefoneNovo4 = substring(@telefone, @espaco3+1, 100)
					SET @telefoneNovo5 = ''
				END
				ELSE
				IF(@Sumtelefone = 4)
				BEGIN
					SET @telefoneNovo1 = substring(@telefone, 1, @espaco1-1);
					SET @telefoneNovo2 = substring(@telefone, @espaco1+1, @espaco2-@espaco1-1)
					SET @telefoneNovo3 = substring(@telefone, @espaco2+1, @espaco3-@espaco2-1)
					SET @telefoneNovo4 = substring(@telefone, @espaco3+1, @espaco4-@espaco3-1)
					SET @telefoneNovo5 = substring(@telefone, @espaco4+1, 100)
				END
						
	END
	--atualiza direto na tabela
	update pjnovo
	set tel1 = @telefoneNovo1,  tel2 = @telefoneNovo2, tel3 = @telefoneNovo3, tel4 = @telefoneNovo4,
	tel5 = @telefoneNovo5
	where telefone = @telefone and cnpj = @cnpj

		
fetch next from cr_cursor into @uf, @telefone, @cnpj
end

close cr_cursor 
deallocate cr_cursor

Desde já eu agradeço a ajuda de vcs pela colaboração e um

 

Abraço a Todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

inforthiago,

pq ao inves de usar cursor, nao usa tabela temporaria.De uma olhada neste link para ter uma ideia:

http://forum.imasters.com.br/index.php?showtopic=325377

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu uso essa query em uma tabela ja existente que eu tenho !!!

 

Mas tem como eu criar essa tabela q ja existe e fazer ela ficar temporária ???

 

Desde ja !!! eu agradeço pela ajuda

 

Abç

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pq eu uso essa query numa tabela especifica que eu tenho !!!

 

Mas tem como eu deixar essa tabela como temporária ??? Se tiver como faz ???

 

Desde ja eu agradeço a sua ajuda !!!

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

inforthiago,

 

no link que te passei, ao inves de criar uma temporaria (#temp), você pode pular esta parte e colocar a tabela e campo que vai usar. é só um dos modos de se fazer.

 

Geralmente cursor eh demorado msm, lento e muitos dbas nao o utilizam nem por decreto rs

 

Nestes links tem exemplos que você pode dar uma lida para te ajudar:

http://forum.imasters.com.br/index.php?showtopic=224255

Qtos registros tem na tabela? qto tempo ela demora ?

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos dizer que tem 1 Milhão de registros !!! Ele demora 3 dias(+ ou -) para rodar 100 mil registros. Eu estou achando muito lento, sei que a utilização dos IF ... ELSE tb ajuda a demorar para verificar os dados, por isso que tive a idéia princial de fazer a mudança para CASE´s. Mas tb não sei como fazer.

 

Vou entrar no link que você me passou e vou tentar fazer a mudança !!!

 

Obrigado mais uma vez pela dica !!!

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá us2ka !!! Obrigado pela ajuda

 

Mas surgiu uma dúvida !!! Estou tentando fazer o que você me indicou mas não estou conseguindo !!!

 

Como ficaria essa query que eu postei sem os cursores ???

 

Desde ja eu agradeço !!!

 

 

Abç

Compartilhar este post


Link para o post
Compartilhar em outros sites

inforthiago,

 

vou tentar fazer sem os cursores e posto aki o resultado ;)

mas 100k registro em 3 dias, o problema pode nao ser somente sua sintaxe, pode ser tb indices das tabelas.

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado mais uma vez !!! você me ajudando a fazer essa query sem os cursores vai me ajudar a montar outras querys q eu tenho aki que foram montadas com cursores.

 

Mas uma vez muito obrigado.

 

Abç

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.