none
Filtro de busqueda SQL Server

    Pregunta

  • Hola buen día quisiera realizar este tipo de filtro en sql server, ya que le filtro que utilizo solo aplica a un campo en especifico, lo que necesito es poner filtrar todos los campos de mi tabla en un solo parametro

    filtro de busqueda =  Juan Hernandez activo

    Ticket         asunto          Nombre                  Depto           Fecha               Estatus 

    T - 00001    errores       Juan Hernandez      Informatica     12/12/2017       activo

    el codigo que utilizo es es el siguinte 

    create PROCEDURE [dbo].[filtarAsesorias]
     (
     @buscar varchar(max)
    
     )
    AS
    BEGIN
    
    	SET NOCOUNT ON;
    	
    	Select * from tabla1.dbo.Asesorias ase where ase.sTicket like '%'+ @buscar +'%' or ase.sAsunto like '%'+ @buscar +'%' or ase.sNombre like '%'+ @buscar +'%' 
    or ase.sDepto like '%'+ @buscar +'%' or ase.dFecha like '%'+ @buscar +'%' or ase.sEstatus like '%'+ @buscar +'%'
    	
    	order by ase.sTicket desc
    END


    • Editado D. Velazquez miércoles, 13 de diciembre de 2017 16:22
    miércoles, 13 de diciembre de 2017 16:22

Respuestas

  • No, me temo que no será posible, si evalúas cada parte de la expresión con el operador OR obtendrás más filas de las que esperas (resultados no deseados), si ocupas el operador AND no obtendrás resultados si por lo menos una condición no se cumple, yo insisto en que deberías considerar la forma que te he sugerido desde un inicio.

    Aún así, tienes otro camino algo más complicado, hacer consultas Full-Text con Contains: Query with Full-Text Search, evalúa cada caso, y toma la opción que consideres adecuada.

    • Marcado como respuesta D. Velazquez jueves, 14 de diciembre de 2017 23:20
    jueves, 14 de diciembre de 2017 4:24

Todas las respuestas

  • No, no es lo correcto, bajo esa forma es muy probable que obtengas resultados no esperados. Declara un parámetro para columna sobre la que desees buscar, si no deseas filtrar por un parámetro en particular le asignas DBNull desde la aplicación.

    WHERE (Ticket = @Ticket OR @Ticket IS NULL) AND (Asunto = @Asunto OR @Asunto IS NULL) AND ...

    • Propuesto como respuesta CMAPM miércoles, 13 de diciembre de 2017 16:44
    miércoles, 13 de diciembre de 2017 16:36
  • Gracias por la repuesta, pero sigo sin poder obtener el resultado esperado, lo que necesito es que en filtro que yo asigno es decir el filtro es ='Juan Hernandez activo' me de todos los resultados que contengan "Juan Hernandez" como nombre y "activo" como estatus, espero haberme explicado, gracias
    miércoles, 13 de diciembre de 2017 17:06
  • alter PROCEDURE [dbo].[filtarAsesorias]
     (
     @sTicket varchar (max) = null,
     @sAsunto varchar (max) = null,
     @sNombre varchar (max) = null,
     @sDepto varchar (max) = null,
     @dFecha varchar (max) = null,
     @sEstatus varchar (max) = null
    
     )
    AS
    BEGIN
    
    	SET NOCOUNT ON;
    	
    	Select * from Gestiones.dbo.Asesorias ase where 
    	(ase.sTicket like @sTicket or @sTicket is null) and
    	(ase.sAsunto like @sAsunto  or @sAsunto is null) and
    	(ase.sNombre like @sNombre or  @sNombre is null)and
    	(ase.sDepto like  @sDepto or @sDepto is null) and
    	(ase.dFecha like  @dFecha or @dFecha is null) and
    	(ase.sEstatus like @sEstatus or @sEstatus is null)
    
    	order by ase.sTicket desc
    END
    
    
    
    este es el codigo que tengo y cuando pongo el parametro (en general ya que lo envio en un formulario estravez de un texbox) "Juan Hernandez activo' no me da ningún resultado, pero si coloco solo Juan Hernandez  si obtengo resultados al igual que con "activo' (por separados),  mi campo fecha es tipo varchar
    miércoles, 13 de diciembre de 2017 18:03
  • - Sobre el procedimiento almacenado

    Falta agregar el comodín '%': (ase.sTicket LIKE '%' + @sTicket + '%' OR @sTicket IS NULL) AND ...

    - Respecto al código de la aplicación

    Debes de tener una caja de texto para cada criterio de búsqueda, si una o varias cajas de texto "están vacías" no agregas el/los parámetro(s) a la colección Parameters y en consecuencia valdrán null y lo que hace el procedimiento almacenado con los valores por defecto de los parámetros es historia conocida.

    miércoles, 13 de diciembre de 2017 18:17
  • Si lo entiendo, pero ese es el punto al que voy que no puedo tener varias cajas de texto, requiero solo una en donde yo proporciono el valor "Juan Hernandez activo" y me regrese la información solicitada de ambos 
    miércoles, 13 de diciembre de 2017 18:22
  • No, me temo que no será posible, si evalúas cada parte de la expresión con el operador OR obtendrás más filas de las que esperas (resultados no deseados), si ocupas el operador AND no obtendrás resultados si por lo menos una condición no se cumple, yo insisto en que deberías considerar la forma que te he sugerido desde un inicio.

    Aún así, tienes otro camino algo más complicado, hacer consultas Full-Text con Contains: Query with Full-Text Search, evalúa cada caso, y toma la opción que consideres adecuada.

    • Marcado como respuesta D. Velazquez jueves, 14 de diciembre de 2017 23:20
    jueves, 14 de diciembre de 2017 4:24