none
Procedimiento almacenado para hacer búsquedas RRS feed

  • Pregunta

  • He estado buscando por internet algún ejemplo para realizar búsquedas en un tabla en sql usando procedimientos almacenados pero no he encontrado nada que me aclare mi duda. Lo que yo quiero es hacer búsquedas en un Datagridview usando para ello una caja de texto y un botón o usando el evento textchanged pero usando una función que use un procedimiento almacenado. Tengo entendido que tengo que crear el procedimiento en sql y luego llamarlo desde mi función en vb.net pero no se exactamente como es la consulta y como pasarle el parámetro en la función. Si alguien me puede dar algún ejemplo estaré muy agradecido.

    Gracias y saludos

    miércoles, 1 de julio de 2015 22:08

Respuestas

  • Hola Manuel,

    ¿Pero dónde estás teniendo el problema? En hacer el procedimiento con t-sql o en invocar el procedimiento desde la aplicación. Ahora, ¿trabajas con ADO .Net? o ¿trabajas con algún ORM como EF? Lo último pregunto porque podrías hacer uso de LinQ para consultar sobre el modelo de clases de EF.

    El procedimiento es tan simple como:

    create procedure BuscarCliente
      @NombreCliente nvarchar(100)
    as
    begin
      set nocount on;
    
      select
        NombreCliente, Apellido, Edad
      from
         Clientes
      where
        (NombreCliente like '%' + @NombreCliente + '%')
    end

    Tu aplicación deberá contar con un método que invoque al procedimiento y recupere el conjunto de resultados. Es posible también escribir el código t-sql en la aplicación con ADO.Net

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    • Marcado como respuesta Ciao Manuel jueves, 2 de julio de 2015 20:03
    miércoles, 1 de julio de 2015 22:13
  • Manuel, lo que has oído es correcto, generalmente y digo generalmente, pero no siempre, la forma mas eficaz de filtar datos es hacerlo en la base de datos.  te pongo en contexto

    Ejemplo 1, tabla con unos pocos cientos de filas.

    Si la leo entera y la meto en un datagrid.... irá muy bien. la tabla leerá los 100 registros muy rápido. porque cargar esos 100 registros es una operación trivial.

    Ejemplo 2, tabla con unos pocos millones de filas...

    Tendrás problemas en la carga inicial, porque leer unos millón de filas desde un servidor y cargarlos en un cliente... llevará un tiempo.. mas aún si tienes muchos clientes haciendo lo mismo...

    Ejemplo 3. Tabla con muichos millones de filas.

    Simplemente no funcionaría porque no te cabría en memoria de tu cliente la tabla entera.

    Dicho todo esto, en SQL Server todo lo que necesitas hacer es crear procedimientos almacenados del estilo que te recomendaba Williams, con cuidado además en que los índices que tienes sean adecuados. Aunque a mi me gustan más que no todas las búsquedas se hagan como propone Willian

    yo haría algo así

    create procedure BuscarCliente
      @NombreCliente nvarchar(100),@tipobusqueda tinyint =0
    as
    begin
      set nocount on;
      /* 0... busqueda por igualdad
    	 1 .. comienza por
    	 2.. termina por
    	 3 contiene */
    
    
    
      select
        NombreCliente, Apellido, Edad
      from
         Clientes
      where
        (NombreCliente like 
    	 case @tipobusqueda when 0 then @NombreCliente when 1 then @NombreCliente+'%' when 2 then '%'+@NombreCliente when 3 then 
    	'%' + @NombreCliente + '%'else '' end)
    end

    El resto de preguntas manuel, son más para los foros de desarrollo, como lo armas para llamarlo desde tu aplicación, será exacatamente igual, pero... es mejor que allí te aconsejen sobre la técnica a usar.Saludos


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    jueves, 2 de julio de 2015 8:00
    Moderador

Todas las respuestas

  • Hola Manuel,

    ¿Pero dónde estás teniendo el problema? En hacer el procedimiento con t-sql o en invocar el procedimiento desde la aplicación. Ahora, ¿trabajas con ADO .Net? o ¿trabajas con algún ORM como EF? Lo último pregunto porque podrías hacer uso de LinQ para consultar sobre el modelo de clases de EF.

    El procedimiento es tan simple como:

    create procedure BuscarCliente
      @NombreCliente nvarchar(100)
    as
    begin
      set nocount on;
    
      select
        NombreCliente, Apellido, Edad
      from
         Clientes
      where
        (NombreCliente like '%' + @NombreCliente + '%')
    end

    Tu aplicación deberá contar con un método que invoque al procedimiento y recupere el conjunto de resultados. Es posible también escribir el código t-sql en la aplicación con ADO.Net

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    • Marcado como respuesta Ciao Manuel jueves, 2 de julio de 2015 20:03
    miércoles, 1 de julio de 2015 22:13
  • Muchas gracias, no te entendí muy bien lo primero. Lo único que se, es que es una aplicación de escritorio y uso una base de datos en sql server. He tratado de ver como hacer búsquedas pero muchos usan filtros usando dataview o algo y por ahí he leído que no es muy correcto, por lo tanto debo hacer una consulta contra la tabla en la base de datos y que mejor manera que hacer un procedimiento almacenado. Mi otra duda es como pasarle el parametro dentro de mi función y si afecta en el modo en que lleno mi datagridview. 

    También he visto otras manera de hacer búsquedas pero no se cual se la más optima o usar filtros etc.

    Muchas gracias por contestar

    miércoles, 1 de julio de 2015 22:23
  • Manuel, lo que has oído es correcto, generalmente y digo generalmente, pero no siempre, la forma mas eficaz de filtar datos es hacerlo en la base de datos.  te pongo en contexto

    Ejemplo 1, tabla con unos pocos cientos de filas.

    Si la leo entera y la meto en un datagrid.... irá muy bien. la tabla leerá los 100 registros muy rápido. porque cargar esos 100 registros es una operación trivial.

    Ejemplo 2, tabla con unos pocos millones de filas...

    Tendrás problemas en la carga inicial, porque leer unos millón de filas desde un servidor y cargarlos en un cliente... llevará un tiempo.. mas aún si tienes muchos clientes haciendo lo mismo...

    Ejemplo 3. Tabla con muichos millones de filas.

    Simplemente no funcionaría porque no te cabría en memoria de tu cliente la tabla entera.

    Dicho todo esto, en SQL Server todo lo que necesitas hacer es crear procedimientos almacenados del estilo que te recomendaba Williams, con cuidado además en que los índices que tienes sean adecuados. Aunque a mi me gustan más que no todas las búsquedas se hagan como propone Willian

    yo haría algo así

    create procedure BuscarCliente
      @NombreCliente nvarchar(100),@tipobusqueda tinyint =0
    as
    begin
      set nocount on;
      /* 0... busqueda por igualdad
    	 1 .. comienza por
    	 2.. termina por
    	 3 contiene */
    
    
    
      select
        NombreCliente, Apellido, Edad
      from
         Clientes
      where
        (NombreCliente like 
    	 case @tipobusqueda when 0 then @NombreCliente when 1 then @NombreCliente+'%' when 2 then '%'+@NombreCliente when 3 then 
    	'%' + @NombreCliente + '%'else '' end)
    end

    El resto de preguntas manuel, son más para los foros de desarrollo, como lo armas para llamarlo desde tu aplicación, será exacatamente igual, pero... es mejor que allí te aconsejen sobre la técnica a usar.Saludos


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    jueves, 2 de julio de 2015 8:00
    Moderador
  • Muchas Gracias Miguel por tu respuesta ya que en Internet no he encontrado nada parecido y de igual manera por dejarme la consulta ya voy a probarla a ver que tal me sale.
    jueves, 2 de julio de 2015 20:05