Edgard Leal

My personal blog hosted on Github using Jekyll

Home View on GitHub
14 December 2012

Por melhor que seja sua rotina de busca, ainda assim vai existir um usuário que não consiga encontrar o que esta procurando, por isso criei a rotina abaixo para fazer algo parecido com a busca do google.
Para testar utilizei também uma rotina para gerar dados aleatórios que pode ser muito boa para testar procedimentos.

ATENÇÃO!! Veja a função SPLIT aqui

--Criação dos dados
set nocount on --não exibe número de comandos executados ( xx registros inclusos )
create table #endereco(codigo int primary key, rua varchar(250), bairro varchar(100))
go
create table #cliente (codigo int , nome varchar(100), telefone varchar(15), endereco int)
go
create table #nomes(codigo int , nome varchar(20))
go
insert into #nomes(codigo, nome) values
(1, 'Maria'),
(2, 'João'),
(3, 'Abelardo'),
(4, 'Antonio'),
(5, 'Joaquina'),
(6, 'Laura'),
(7, 'Elizete'),
(8, 'Abgail'),
(9, 'Antonieta'),
(10, 'Lucia'),
(11, 'Megan'),
(12, 'Dorizete'),
(13, 'Zumira'),
(14, 'Gorete'),
(15, 'Josefa'),
(16, 'Joana'),
(17, 'Sonia'),
(18, 'Marcos'),
(19, 'Mauro'),
(20, 'Bruno'),
(21, 'Bruna'),
(22, 'Benedita')
go

insert into #endereco(codigo , rua , bairro) values
(1, 'Rua 10', 'Centro'),
(2, 'Rua 11', 'Bairro novo'),
(3, 'Rua 12', 'Zona leste'),
(4, 'Rua 13', 'Zona sul'),
(5, 'Rua 14', 'Zona norte'),
(6, 'Rua 15', 'Zona oeste'),
(7, 'Rua 16', 'Faroeste'),
(8, 'Rua 17', 'Itaguaçu do norte'),
(9, 'Rua 18', 'Itapeciribecaba'),
(10, 'Rua 19', 'Itamonhangabaçu do norte')
go

--Fim da criação dos dados


declare @i int = 1
declare @nome1 varchar(100)
declare @nome2 varchar(100)
declare @telefone varchar(8)
while @i < 200
begin
select @nome1 = nome from #nomes where codigo = ROUND(RAND() * 23,0)
select @nome2 = nome from #nomes where codigo = ROUND(RAND() * 23,0 )
set @telefone = CAST(ROUND(rand() * 999999, 0) as varchar(8))
Select @telefone = '33' + REPLICATE('0', 6 - LEN(@telefone)) + @telefone
insert into #cliente(codigo, nome, telefone, endereco) values(@i, @nome1 + char(32) + @nome2, @telefone, ROUND(RAND() * 11,0))
set @i = @i + 1
end-- Gera os dados de clientes


declare @texto varchar(500) = ' abgail centro rua 10'

set @texto = rtrim(ltrim(@texto))-- remove os espaços das estrimidades esquerda e direita
set @texto = replace(@texto, ' ', ' ') -- Remove os espaços repetidos (duplos)
declare @termoGeral varchar(8000) = '%' + replace(@texto, ' ', '%') + '%'

--Cursor usando a função SPLIT criada em outro post para dividir o texto
--procurado em uma lista de palavras para que seja montado um critério
--de busca para cada parte do texto separadamente.
declare palavras cursor for select palavra from fn_split(@texto)
declare @termo varchar(100)
declare @condicao varchar(8000) = ' and ( 1 <> 1 '

open palavras
fetch palavras into @termo
while @@FETCH_STATUS = 0
begin
set @condicao = @condicao + ' or c.nome like ''%' + @termo + '%'' or e.rua like ''%' + @termo + '%'''
fetch palavras into @termo
end

close palavras
deallocate palavras

exec('Select c.codigo , c.nome, c.telefone, e.rua + '', '' + e.bairro [Endereço] from #cliente c, #endereco e where c.endereco = e.codigo ' + @condicao + ')')


drop table #cliente
drop table #endereco
drop table #nomes
set nocount off





blog comments powered by Disqus