Usuário com melhor resposta
Procedure criando select

Pergunta
-
Pessoal, tenho uma duvida:
Para fazer uma busca de uma string "teste de leitura" dentro de um sql seria facil.
Bastaria eu fazer:Select * from table where (campo like '%teste%' and campo like '%de%' and campo like '%leitura%')
No entanto, se eu nao sei como essa string viria (com 1, 5, 10 palavras) eu tenho que criar um select dinamico.
A duvida é, em questao de performance, o q é melhor se fazer :
1. Criar varias sp's com o mesmo conteudo, somente mudando o numero de parametros recebidos
2. Criar apenas uma procedure, separando a string em varias palavras e gerando o like dinamicamente para cada palavra???
Valeu
Respostas
-
Agora se vc quiser pesquisar fora de ordem... e retornar todas as linha que contenham ao menos 1 das palavras...
-- CRIANDO TABELA DE TESTES DECLARE @TABELA TABLE (CAMPO NVARCHAR(1000)) INSERT INTO @TABELA VALUES('Aqui vc tem um teste de leitura de string') INSERT INTO @TABELA VALUES('Aqui vc tem as palavras "teste", "de" e "leitura" na ordem da consulta') INSERT INTO @TABELA VALUES('Aqui vc tem as palavras "leitura", "de" e "teste" fora da ordem da consulta') INSERT INTO @TABELA VALUES('Aqui vc tem so tem a palavra "teste"') INSERT INTO @TABELA VALUES('Aqui vc tem so tem a palavra "leitura"') INSERT INTO @TABELA VALUES('Aqui vc não tem nenhuma das palavras') DECLARE @POS INT DECLARE @PALAVRAS TABLE(ITEM NVARCHAR(1000)) DECLARE @CONSULTA NVARCHAR(1000) SELECT @CONSULTA = 'teste de leitura' WHILE (CHARINDEX(' ', @CONSULTA) > 0) BEGIN SELECT @POS = CHARINDEX(' ', @CONSULTA) - 1 INSERT INTO @PALAVRAS VALUES(LEFT(@CONSULTA, @POS)) SELECT @CONSULTA = LTRIM(RTRIM(SUBSTRING(@CONSULTA, @POS + 1, LEN(@CONSULTA)))) END INSERT INTO @PALAVRAS VALUES(@CONSULTA) SELECT * FROM @TABELA WHERE EXISTS(SELECT * FROM @PALAVRAS WHERE CAMPO LIKE '%' + ITEM + '%')
- Marcado como Resposta Eder Costa terça-feira, 10 de maio de 2011 17:29
-
Mas por exemplo, vamos supor que chegue a string com 10 palavras.
Eu tenho que fazer um for e separar a frase em 10 palavras certo ?
Como separo estas palavras e como faco o for ?
Valeu
Vc pode fazer exatamente como eu mostrei acima...-- String de Consulta DECLARE @CONSULTA NVARCHAR(1000) SELECT @CONSULTA = 'teste de leitura ou quantas palavras mais vc quiser aqui' -- Separando as palavras em uma tabela de memoria DECLARE @POS INT DECLARE @PALAVRAS TABLE(ITEM NVARCHAR(1000)) WHILE (CHARINDEX(' ', @CONSULTA) > 0) BEGIN SELECT @POS = CHARINDEX(' ', @CONSULTA) - 1 INSERT INTO @PALAVRAS VALUES(LEFT(@CONSULTA, @POS)) SELECT @CONSULTA = LTRIM(RTRIM(SUBSTRING(@CONSULTA, @POS + 1, LEN(@CONSULTA)))) END INSERT INTO @PALAVRAS VALUES(@CONSULTA) -- Consultando registros que contenha ao menos 1 das palavras SELECT * FROM @TABELA WHERE EXISTS(SELECT * FROM @PALAVRAS WHERE CAMPO LIKE '%' + ITEM + '%')
- Marcado como Resposta Eder Costa terça-feira, 10 de maio de 2011 17:29
Todas as Respostas
-
na verdade se vc quer pesquisa na ordem q as palavras aparecem e assumir que devem ter todas as palavras da frase... vc poderia fazer assim:
Select * from table where (campo like '%teste%de%leitura%'')
Exemplo:DECLARE @TABELA TABLE (CAMPO NVARCHAR(1000))
INSERT INTO @TABELA VALUES('Aqui vc tem um teste de leitura de string')
INSERT INTO @TABELA VALUES('Aqui vc tem as palavras "teste", "de" e "leitura" na ordem da consulta')
INSERT INTO @TABELA VALUES('Aqui vc tem as palavras "leitura", "de" e "teste" fora da ordem da consulta')
INSERT INTO @TABELA VALUES('Aqui vc tem so tem a palavra "teste"')
INSERT INTO @TABELA VALUES('Aqui vc tem so tem a palavra "leitura"')
INSERT INTO @TABELA VALUES('Aqui vc não tem nenhuma das palavras')
SELECT * FROM @TABELA WHERE CAMPO LIKE '%teste%de%leitura%' -
-
Agora se vc quiser pesquisar fora de ordem... e retornar todas as linha que contenham ao menos 1 das palavras...
-- CRIANDO TABELA DE TESTES DECLARE @TABELA TABLE (CAMPO NVARCHAR(1000)) INSERT INTO @TABELA VALUES('Aqui vc tem um teste de leitura de string') INSERT INTO @TABELA VALUES('Aqui vc tem as palavras "teste", "de" e "leitura" na ordem da consulta') INSERT INTO @TABELA VALUES('Aqui vc tem as palavras "leitura", "de" e "teste" fora da ordem da consulta') INSERT INTO @TABELA VALUES('Aqui vc tem so tem a palavra "teste"') INSERT INTO @TABELA VALUES('Aqui vc tem so tem a palavra "leitura"') INSERT INTO @TABELA VALUES('Aqui vc não tem nenhuma das palavras') DECLARE @POS INT DECLARE @PALAVRAS TABLE(ITEM NVARCHAR(1000)) DECLARE @CONSULTA NVARCHAR(1000) SELECT @CONSULTA = 'teste de leitura' WHILE (CHARINDEX(' ', @CONSULTA) > 0) BEGIN SELECT @POS = CHARINDEX(' ', @CONSULTA) - 1 INSERT INTO @PALAVRAS VALUES(LEFT(@CONSULTA, @POS)) SELECT @CONSULTA = LTRIM(RTRIM(SUBSTRING(@CONSULTA, @POS + 1, LEN(@CONSULTA)))) END INSERT INTO @PALAVRAS VALUES(@CONSULTA) SELECT * FROM @TABELA WHERE EXISTS(SELECT * FROM @PALAVRAS WHERE CAMPO LIKE '%' + ITEM + '%')
- Marcado como Resposta Eder Costa terça-feira, 10 de maio de 2011 17:29
-
-
Gabriel
acredito que o fulltext é o indicado para a sua necessidade...
http://msdn.microsoft.com/pt-br/library/ms142571.aspx
Att.
Marcelo FernandesMCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba- Sugerido como Resposta Eder Costa terça-feira, 10 de maio de 2011 17:30
-
Mas por exemplo, vamos supor que chegue a string com 10 palavras.
Eu tenho que fazer um for e separar a frase em 10 palavras certo ?
Como separo estas palavras e como faco o for ?
Valeu
Vc pode fazer exatamente como eu mostrei acima...-- String de Consulta DECLARE @CONSULTA NVARCHAR(1000) SELECT @CONSULTA = 'teste de leitura ou quantas palavras mais vc quiser aqui' -- Separando as palavras em uma tabela de memoria DECLARE @POS INT DECLARE @PALAVRAS TABLE(ITEM NVARCHAR(1000)) WHILE (CHARINDEX(' ', @CONSULTA) > 0) BEGIN SELECT @POS = CHARINDEX(' ', @CONSULTA) - 1 INSERT INTO @PALAVRAS VALUES(LEFT(@CONSULTA, @POS)) SELECT @CONSULTA = LTRIM(RTRIM(SUBSTRING(@CONSULTA, @POS + 1, LEN(@CONSULTA)))) END INSERT INTO @PALAVRAS VALUES(@CONSULTA) -- Consultando registros que contenha ao menos 1 das palavras SELECT * FROM @TABELA WHERE EXISTS(SELECT * FROM @PALAVRAS WHERE CAMPO LIKE '%' + ITEM + '%')
- Marcado como Resposta Eder Costa terça-feira, 10 de maio de 2011 17:29