none
Procedure criando select RRS feed

  • 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

     

    quarta-feira, 4 de maio de 2011 16:26

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
    quarta-feira, 4 de maio de 2011 16:52
    Moderador

  • 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
    quinta-feira, 5 de maio de 2011 18:38
    Moderador

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%'

    quarta-feira, 4 de maio de 2011 16:37
    Moderador
  • Gabriel

    Depedendo na massa de dados e do volume de pesquisa talvez o FullText seja a melhor opção em relação a performnce

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quarta-feira, 4 de maio de 2011 16:41
    Moderador
  • 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
    quarta-feira, 4 de maio de 2011 16:52
    Moderador
  • 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

    quinta-feira, 5 de maio de 2011 15:28
  • Gabriel

    acredito que o fulltext é o indicado para a sua necessidade...

    http://msdn.microsoft.com/pt-br/library/ms142571.aspx

    Att.
    Marcelo Fernandes


    MCP, 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
    quinta-feira, 5 de maio de 2011 15:50
    Moderador

  • 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
    quinta-feira, 5 de maio de 2011 18:38
    Moderador