COMO USAR LIKE COM % EM PARÂMETRO NO SQL SERVER?

 Tópico anterior Próximo tópico Novo tópico

COMO USAR LIKE COM % EM PARÂMETRO NO SQL SERVER?

SQL / DATABASE

 Compartilhe  Compartilhe  Compartilhe
#490175 - 24/08/2019 04:23:00

MARCOPINHEIRO
TAUBATE
Cadast. em:Agosto/2019


Bom dia (agora madrugada 4:03am )

Estou de cabelo em pé tentando resolver uma situação:
Tenho uma StoredProcedure que faz um select com where simples no BD. Ocorre que preciso que a pesquisa seja feira no campo cli_nome por qualquer parte do nome.

Sim, direto na sql eu sei: cli_nome LIKE '%joa%'...

Mas passando como parâmetro o critério, sempre me retorna um erro:

A SP é essa:
ALTER PROCEDURE [dbo].[usp_lista_inscricoes]
    @idGE INT,
    @nome NVARCHAR(100),
    @cpf NVARCHAR(11),
    @cidade NVARCHAR(60),
    @caravana_id INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @strSQL AS NVARCHAR(2000), @filtro AS NVARCHAR(2000),@parametros AS NVARCHAR(2000)
    
    --SET @filtro = CONCAT(' WHERE gerenciamento_evento_id=',@idGE)
    SET @filtro = 'WHERE (i.gerenciamento_evento_id = @idGE)'
    
    --Montando a estrutura de filtros
    IF LEN(@cpf)>0
    BEGIN
        SET @filtro =' AND (cl.cli_cpf = @cpf)'
    END
    ELSE
    BEGIN
        IF @nome IS NOT NULL BEGIN SET @filtro = @filtro + ' AND (cl.cli_nome LIKE @nome)' END
        IF @cidade IS NOT NULL BEGIN SET @filtro = @filtro + ' AND (ci.cid_cidade = @cidade)' END
        IF @caravana_id>0 BEGIN SET @filtro = @filtro + ' AND (i.caravana_id = @caravana_id)' END
    END
    SET @parametros =N'@idGE INT,@nome NVARCHAR(100),@cpf NVARCHAR(11),@cidade NVARCHAR(60),@caravana_id INT'
--SELECT MONTADO
    SET @strSQL='SELECT i.id_inscricao, i.gerenciamento_evento_id,
            IIF(i.ins_data_cancelamento IS NULL,IIF(i.ins_data_efetivacao_inscricao IS NULL,''Pré-inscrição'',''Confirmada''),''Cancelada'') AS StatusIns,
            IIF(i.ins_financeiro_pago=1,''Pago'',IIF(i.ins_financeiro_criado=1,''Criado'',''Não criado'')) AS StatusFin,cl.cli_nome,CONCAT(ci.cid_cidade,'' - '',ci.cid_uf) AS Cidade, cv.car_descricao, i.ins_lider, q.qua_descricao from tbl_inscricoes i
            INNER JOIN tbl_clientes cl ON i.cliente_id = cl.id_cliente
            LEFT JOIN tbl_cidades ci ON cl.cli_cidade_id = ci.id_cidade  
            LEFT JOIN tbl_valores_eventos v ON i.valor_evento_id = v.id_valor
            LEFT JOIN tbl_caravanas cv ON i.caravana_id = cv.id_caravana
            LEFT JOIN tbl_quartos q ON i.quarto_id = q.id_quarto '+ @filtro;
            
--FIM SELECT MONTADO
--Executando o SELECT MONTADO (Se não fosse um select montado em variável, poderia ser direto sem o EXECUT)    
    EXECUTE SP_EXECUTESQL @strSQL,@parametros,@idGE,@nome,@cpf,@cidade,@caravana_id
    --PRINT @strSQL
END


Notem que em: IF @nome IS NOT NULL BEGIN SET @filtro = @filtro + ' AND (cl.cli_nome LIKE @nome)' END, se o nome for completo funciona normal e encontra o registro, se for apenas parte do nome que é o preciso, não encontra nada.

Não sei onde por o %, já tentei as seguintes maneiras e nada:
IF @nome IS NOT NULL BEGIN SET @filtro = @filtro + ' AND (cl.cli_nome LIKE %@nome%)' END
Se o nome for completo e existir no banco, funciona. Se o nome não for completo ou não existir no banco da o erro abaixo:
Mensagem 102, Nível 15, Estado 1, Linha 10
Sintaxe incorreta próxima a '@nome'.


Também já tentei duplicar os ', mas sem sucesso também.

Percebi que da forma: LIKE %@nome%)' passando o parâmetro da SP já envolvido com %, funciona normalmente. Mas não sei se isso é o correto
pois terei que passar o % na aplicação, coisa que o próprio banco já deveria resolver...

Caso passar na aplicação seja a única forma e a mais indicada, ok, mas se tiver uma forma de definir isso direto na SP, melhor.
Conto com os companheiros.

Marco Pinheiro
Aprendiz do que me ensinarem

Resposta escolhida #490176 - 24/08/2019 08:59:30

PLUGSOFTSM
SANTA MARIA
Cadast. em:Julho/2015


Na parte do nome vc tem que fazer assim
  IF @nome IS NOT NULL BEGIN SET @filtro = @filtro + ' AND (cl.cli_nome LIKE ''' + @nome + '%'')' END


'' é duas vezes o caracter '




#490182 - 24/08/2019 20:09:59

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe

Última edição em 24/08/2019 20:13:08 por FOXMAN

Citação:
:
Bom dia (agora madrugada 4:03am )

Estou de cabelo em pé tentando resolver uma situação:
Tenho uma StoredProcedure que faz um select com where simples no BD. Ocorre que preciso que a pesquisa seja feira no campo cli_nome por qualquer parte do nome.

Sim, direto na sql eu sei: cli_nome LIKE '%joa%'...

Mas passando como parâmetro o critério, sempre me retorna um erro:

A SP é essa:
ALTER PROCEDURE [dbo].[usp_lista_inscricoes]
    @idGE INT,
    @nome NVARCHAR(100),
    @cpf NVARCHAR(11),
    @cidade NVARCHAR(60),
    @caravana_id INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @strSQL AS NVARCHAR(2000), @filtro AS NVARCHAR(2000),@parametros AS NVARCHAR(2000)
    
    --SET @filtro = CONCAT(' WHERE gerenciamento_evento_id=',@idGE)
    SET @filtro = 'WHERE (i.gerenciamento_evento_id = @idGE)'
    
    --Montando a estrutura de filtros
    IF LEN(@cpf)>0
    BEGIN
        SET @filtro =' AND (cl.cli_cpf = @cpf)'
    END
    ELSE
    BEGIN
        IF @nome IS NOT NULL BEGIN SET @filtro = @filtro + ' AND (cl.cli_nome LIKE @nome)' END
        IF @cidade IS NOT NULL BEGIN SET @filtro = @filtro + ' AND (ci.cid_cidade = @cidade)' END
        IF @caravana_id>0 BEGIN SET @filtro = @filtro + ' AND (i.caravana_id = @caravana_id)' END
    END
    SET @parametros =N'@idGE INT,@nome NVARCHAR(100),@cpf NVARCHAR(11),@cidade NVARCHAR(60),@caravana_id INT'
--SELECT MONTADO
    SET @strSQL='SELECT i.id_inscricao, i.gerenciamento_evento_id,
            IIF(i.ins_data_cancelamento IS NULL,IIF(i.ins_data_efetivacao_inscricao IS NULL,''Pré-inscrição'',''Confirmada''),''Cancelada'') AS StatusIns,
            IIF(i.ins_financeiro_pago=1,''Pago'',IIF(i.ins_financeiro_criado=1,''Criado'',''Não criado'')) AS StatusFin,cl.cli_nome,CONCAT(ci.cid_cidade,'' - '',ci.cid_uf) AS Cidade, cv.car_descricao, i.ins_lider, q.qua_descricao from tbl_inscricoes i
            INNER JOIN tbl_clientes cl ON i.cliente_id = cl.id_cliente
            LEFT JOIN tbl_cidades ci ON cl.cli_cidade_id = ci.id_cidade  
            LEFT JOIN tbl_valores_eventos v ON i.valor_evento_id = v.id_valor
            LEFT JOIN tbl_caravanas cv ON i.caravana_id = cv.id_caravana
            LEFT JOIN tbl_quartos q ON i.quarto_id = q.id_quarto '+ @filtro;
            
--FIM SELECT MONTADO
--Executando o SELECT MONTADO (Se não fosse um select montado em variável, poderia ser direto sem o EXECUT)    
    EXECUTE SP_EXECUTESQL @strSQL,@parametros,@idGE,@nome,@cpf,@cidade,@caravana_id
    --PRINT @strSQL
END


Notem que em: IF @nome IS NOT NULL BEGIN SET @filtro = @filtro + ' AND (cl.cli_nome LIKE @nome)' END, se o nome for completo funciona normal e encontra o registro, se for apenas parte do nome que é o preciso, não encontra nada.

Não sei onde por o %, já tentei as seguintes maneiras e nada:
IF @nome IS NOT NULL BEGIN SET @filtro = @filtro + ' AND (cl.cli_nome LIKE %@nome%)' END
Se o nome for completo e existir no banco, funciona. Se o nome não for completo ou não existir no banco da o erro abaixo:
Mensagem 102, Nível 15, Estado 1, Linha 10
Sintaxe incorreta próxima a '@nome'.


Também já tentei duplicar os ', mas sem sucesso também.

Percebi que da forma: LIKE %@nome%)' passando o parâmetro da SP já envolvido com %, funciona normalmente. Mas não sei se isso é o correto
pois terei que passar o % na aplicação, coisa que o próprio banco já deveria resolver...

Caso passar na aplicação seja a única forma e a mais indicada, ok, mas se tiver uma forma de definir isso direto na SP, melhor.
Conto com os companheiros.


No mysql(o que não é seu caso) vc precisaria concatenar o valor vindo do parametro com o %.

Exemplo....

Na Stored procedure vc tem um parametro chamado NOME_CLI, que recebe valores como JOÃO.
Dentro da SP, deveria ficar assim ::

select * from cadastro_cli where NOME_CLI LIKE CONCAT("%",JOÃO,"%");

Lhe retornará todos os cadastros cujo NOME_CLI contenha JOÃO

Em meu novo sistema adotei um processo que busca todos os registros que contem a string informada....
Se eu passar ACHO 200ML, ME RETORNARÁ TODOS OS PRODUTOS QUE contem essa string, mesmo como o espaço.

Da mesma forma se eu passar JO SIL SAN, O SISTEMA ME RETORNARÁ TODOS OS REGISTRO QUE CONTENHA JO, SIL, SAN.





Grupo DotNet.Br no FaceBook

Grupo WhatsDev



#490184 - 24/08/2019 21:41:01

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe

Última edição em 24/08/2019 21:43:26 por KERPLUNK

Porque não uma view com parâmetros opcionais? Você não precisa montar um SQL, é muito mais simples...


_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por MARCOPINHEIRO em 26/08/2019 11:33:36