none
Consulta SQL que reciba n parámetros RRS feed

  • Pregunta

  • Hola

    Trabajo con SQL Server 2014 Express Edition tengo el siguiente modelo de datos:

    En este modelo de datos es de un sistema de punto de venta en el cual la venta se realiza por Catálogos, donde los productos que se desea vender deben estar ingresados en un Catálogo si no, no se puede vender.

    • Un producto puede tener Especificaciones como por ejemplo: Un pantalón tiene dos especificaciones que son Talla y Color las tallas y colores van en la tabla Opciones.
    • Un producto no puede tener especificaciones como por ejemplo: Jabón de Ropa.
    • Un producto puede tener dos o mas especificaciones como por ejemplo: Una medicina que tiene laboratorio, lote, fecha vencimiento.
    • Se puede ingresar un servicio como un producto.

     

    Toda la búsqueda radica en el Catalogo, entonces cuando busco un producto lo hago en el Catalogo y la Especificación del Catalogo.

    La consulta sería la siguiente apuntando al ProductoCatalogo

    SELECT EC.EspecificacionCatalogoId, EC.ProductoCatalogoId, EC.EspecificacionProductoId, E.Nombre, O.NombreOpcion
    FROM ProductoCatalogos AS PC
    INNER JOIN EspecificacionCatalogos AS EC ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    INNER JOIN Especificaciones AS E ON EC.EspecificacionId = E.EspecificacionId 
    INNER JOIN Opciones AS O ON EC.OpcionId = O.OpcionId
    WHERE PC.ProductoId = 447

    Pera de esta manera no lo voy a mostrar al usuario final necesito ponerlo en le siguiente formato

    Vestido Isaura Samantha Talla Letra S Color Negro

    Vestido Isaura Samantha TallaLetra S Color Rojo

    Es por eso que trato con la otra consulta pero el problema es cuando el producto tiene mas de 2 parámetros

    El problema radica a la hora de pasarle los parámetros a esta consulta. Le paso el 3 y el 2 por que antes lo vi en el depurador del Visual Studio y lo pongo donde corresponde.

    exec sp_executesql 
    N'SELECT DISTINCT T.ProductoCatalogoId AS Id, T.ProductoId, CONCAT(T.Nombre, '' | '', T.TALLA, '' | '', C.COLOR) AS Descripcion,
    T.PrecioVenta, T.CATALOGO AS Nombre 
    FROM ( SELECT PC.ProductoCatalogoId, PC.ProductoId, P.Nombre, O.NombreOpcion AS TALLA, PC.PrecioVenta, C.Nombre AS CATALOGO
     FROM Productos AS P 
     JOIN ProductoCatalogos AS PC ON P.ProductoId = PC.ProductoId 
     JOIN EspecificacionCatalogos AS EC ON PC.ProductoCatalogoId = EC.ProductoCatalogoId 
     JOIN Opciones AS O ON EC.OpcionId = O.OpcionId 
     JOIN Especificaciones AS E ON EC.EspecificacionId = E.EspecificacionId 
     JOIN Catalogos AS C ON PC.CatalogoId = C.CatalogoId
     WHERE P.Nombre LIKE ''%'' + @valor + ''%'' AND EC.EspecificacionId = @tallaId ) AS T 
     CROSS JOIN ( SELECT PC.ProductoCatalogoId, PC.ProductoId, P.Nombre, O.NombreOpcion AS COLOR,
     PC.PrecioVenta, C.Nombre AS CATALOGO 
     FROM Productos AS P 
     JOIN ProductoCatalogos AS PC ON P.ProductoId = PC.ProductoId 
     JOIN EspecificacionCatalogos AS EC ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
     JOIN Opciones AS O ON EC.OpcionId = O.OpcionId 
     JOIN Especificaciones AS E ON EC.EspecificacionId = E.EspecificacionId 
     JOIN Catalogos AS C ON PC.CatalogoId = C.CatalogoId 
     WHERE P.Nombre LIKE ''%'' + @valor + ''%'' 
     AND EC.EspecificacionId = @colorId ) AS C',N'@colorId int,@tallaId int,@valor nvarchar(8)',@colorId=3,@tallaId=2,@valor=N'SAMANTHA'


    Las especificaciones las obtengo con la siguiente consulta.

    public IEnumerable<UniversalExtend> ListaEspecificaciones(string valor)
            {
                using (var context = new BusinessContext())
                {
                    var list = from ep in context.EspecificacionProductos
                               join e in context.Especificaciones on ep.EspecificacionId equals e.EspecificacionId
                               join p in context.Productos on ep.ProductoId equals p.ProductoId
                               where p.Nombre.Contains(valor)
                               orderby e.Nombre ascending
                               select new UniversalExtend()
                               {
                                   Id = ep.EspecificacionId,
                                   Nombre = e.Nombre
                               };
                    return list.ToList();
                }
            }


    ¿Lo que necesito es una consulta que reciba n  parámetros o tal vez un store procedure? 

    Lo que me trae la consulta de la búsqueda son estos datos.

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    miércoles, 30 de enero de 2019 19:16

Todas las respuestas

  • Hola Pedro Ávila

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te comento que estaremos realizando una revisión a profundidad acerca del inconveniente que se te está presentando.

    Proporcionaremos una respuesta lo más pronto posible.

    Gracias por usar los foros de MSDN.

    Pedro Alfaro
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
    miércoles, 30 de enero de 2019 22:29
  • Hola Pedro,

    Proporcionas mucha información, pero sigo sin tener claro qué es lo que te hace falta :/

    Parece que necesitas poder hacer búsquedas de una manera flexible, esto se podría conseguir con un procedimiento almacenado que reciba todos los parámetros de entrada posibles, y ya en el código del procedimiento, usar SQL dinámico para construir la query oportuna y se ejecute con exec sp_executesql, por ejemplo.

    Mira este ejemplo, creo que te servirá de ayuda :)

    Un saludo.

    • Propuesto como respuesta Pedro Alfaro viernes, 1 de febrero de 2019 20:20
    jueves, 31 de enero de 2019 21:04
  • Hola @Pedro Bonilla

    Exactamente lo que necesito es un store que por dentro me haga la magía de mostrar la información de esta manera, quizás dentro del store se use una tabla temporal donde se haga el mach de la información para salir de esta manera.

    Pero para eso el código se hace dos veces mira

    SELECT DISTINCT T.ProductoCatalogoId AS Id, T.ProductoId,
    	CONCAT(T.Nombre, ' | ', T.TALLA, ' | ', C.COLOR) AS Descripcion, T.PrecioVenta, T.CATALOGO AS Nombre
    	FROM
    	(
    		SELECT PC.ProductoCatalogoId, PC.ProductoId, P.Nombre, O.NombreOpcion AS TALLA, PC.PrecioVenta, C.Nombre AS CATALOGO
    		FROM Productos AS P
    		JOIN ProductoCatalogos AS PC ON P.ProductoId = PC.ProductoId
    		JOIN EspecificacionCatalogos AS EC ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    		JOIN Opciones AS O ON EC.OpcionId = O.OpcionId
    		JOIN Especificaciones AS E ON EC.EspecificacionId = E.EspecificacionId
    		JOIN Catalogos AS C ON PC.CatalogoId = C.CatalogoId
    		WHERE P.Nombre LIKE '%VESTIDO PIQUE%' AND EC.EspecificacionId = 3
    	) AS T
    	CROSS JOIN
    	(
    		SELECT PC.ProductoCatalogoId, PC.ProductoId, P.Nombre, O.NombreOpcion AS COLOR, PC.PrecioVenta, C.Nombre AS CATALOGO
    		FROM Productos AS P
    		JOIN ProductoCatalogos AS PC ON P.ProductoId = PC.ProductoId
    		JOIN EspecificacionCatalogos AS EC ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    		JOIN Opciones AS O ON EC.OpcionId = O.OpcionId
    		JOIN Especificaciones AS E ON EC.EspecificacionId = E.EspecificacionId
    		JOIN Catalogos AS C ON PC.CatalogoId = C.CatalogoId
    		WHERE P.Nombre LIKE '%VESTIDO PIQUE%' AND EC.EspecificacionId = 2
    	) AS C

    ¿Que pasaría si tendría tres especificaciones en vez de dos?, ese código se tendría que repetir tres veces.

    Leeré la info que me proporcionas.

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    jueves, 31 de enero de 2019 23:36