Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
Carregando comentários...