Procedimientos almacenados y selects (2009-12-08)

08/12/2009 - 12:13 por Mauricio | Informe spam
Hola a todos,
en primer lugar quiero aclarar que probablemente esté preguntando
algo muy tonto pero... preguntando se aprende.
Tengo este procedimiento almacenado:

ALTER PROCEDURE Ingredients
@Pro_Id INT

AS
BEGIN
SET NOCOUNT ON;

WITH Ingredients (ING_NAME,ING_PRO_ID,ING_QUANTITY,ING_TYPE,ING_UNIT,
ING_LEVEL)
AS
(SELECT PRO_DESCRIPTION, PRO_ID,cast(0 as
decimal(18,3)),'R',PRO_DEFAULTUNIT, 1 FROM MCS_PRODUCTS WHERE
PRO_RECIPE = 'Y' AND PRO_ID = @Pro_Id
UNION ALL
SELECT PRO_DESCRIPTION, REC_PRO_ID, REC_QUANTITY_1, (case when
PRO_RECIPE = 'Y' THEN 'R' ELSE 'P' END ),REC_UNIT,
Ingredients.ING_LEVEL + 1
FROM MCS_RECIPES , Ingredients, MCS_PRODUCTS
WHERE MCS_RECIPES.REC_PARENT_ID = Ingredients.ING_PRO_ID AND
MCS_Recipes.REC_PRO_ID = MCS_Products.PRO_ID)
SELECT space((Ingredients.ING_LEVEL-1) * 5) + Ingredients.ING_NAME,
* FROM Ingredients WHERE Ingredients.ING_PRO_ID <> @Pro_Id
END
GO

Lo que hace es listar los ingredientes de una receta, la tabla
principal es MCS_Products (tanto para productos como para recetas) y
una tabla relacionada MCS_Recipes que guarda los ingredientes de una
receta.
El procedimiento almacenado funciona bien, me lista todos los
componentes de una receta, hasta ahí, todos contentos.

Ahora tengo una tabla de Pedidos donde cada línea es un producto.
Dado que un producto puede ser una receta, necesito "abrirlo" y mostrar
todos los componentes. Un ejemplo será más claro.

SELECT * FROM MCS_OrderLines WHERE ol_ord_id = 612

Eso me listará todos los productos/recetas que tiene esa orden pero,
como expliqué antes, si uno de esos productos es una receta, necesito
mostrar los componentes.

Acá la pregunta ridícula: existe alguna forma de usar el
procedimiento almacenado en la consulta? O pasar el resultado de la
select anterior (solo el campo OL_PRO_ID) como parámetro al
procedimiento almacenado?

Muchas gracias por leerme :)
Saludos.

Mauricio
Copenhague, Dinamarca
 

Leer las respuestas

#1 Mauricio
08/12/2009 - 13:05 | Informe spam
Una vuelta de tuerca, tal vez sea más fácil.
En lugar de un procedimiento almacenado hice una función, dbo.Recipes,
a la cual puedo llamar como
SELECT * FROM dbo.Recipes(9565) y funciona bien.
Cómo hago para que el parámetro sea una columna de un select? O
nuevamente estoy preguntando algo tonto?
Gracias.


Mauricio a couché sur son écran :
Hola a todos,
en primer lugar quiero aclarar que probablemente esté preguntando algo muy
tonto pero... preguntando se aprende.
Tengo este procedimiento almacenado:

ALTER PROCEDURE Ingredients
@Pro_Id INT

AS
BEGIN
SET NOCOUNT ON;

WITH Ingredients (ING_NAME,ING_PRO_ID,ING_QUANTITY,ING_TYPE,ING_UNIT,
ING_LEVEL)
AS
(SELECT PRO_DESCRIPTION, PRO_ID,cast(0 as
decimal(18,3)),'R',PRO_DEFAULTUNIT, 1 FROM MCS_PRODUCTS WHERE PRO_RECIPE =
'Y' AND PRO_ID = @Pro_Id
UNION ALL
SELECT PRO_DESCRIPTION, REC_PRO_ID, REC_QUANTITY_1, (case when PRO_RECIPE
= 'Y' THEN 'R' ELSE 'P' END ),REC_UNIT, Ingredients.ING_LEVEL + 1
FROM MCS_RECIPES , Ingredients, MCS_PRODUCTS
WHERE MCS_RECIPES.REC_PARENT_ID = Ingredients.ING_PRO_ID AND
MCS_Recipes.REC_PRO_ID = MCS_Products.PRO_ID)
SELECT space((Ingredients.ING_LEVEL-1) * 5) + Ingredients.ING_NAME, *
FROM Ingredients WHERE Ingredients.ING_PRO_ID <> @Pro_Id
END
GO

Lo que hace es listar los ingredientes de una receta, la tabla principal
es MCS_Products (tanto para productos como para recetas) y una tabla
relacionada MCS_Recipes que guarda los ingredientes de una receta.
El procedimiento almacenado funciona bien, me lista todos los componentes
de una receta, hasta ahí, todos contentos.

Ahora tengo una tabla de Pedidos donde cada línea es un producto. Dado que
un producto puede ser una receta, necesito "abrirlo" y mostrar todos los
componentes. Un ejemplo será más claro.

SELECT * FROM MCS_OrderLines WHERE ol_ord_id = 612

Eso me listará todos los productos/recetas que tiene esa orden pero, como
expliqué antes, si uno de esos productos es una receta, necesito mostrar los
componentes.

Acá la pregunta ridícula: existe alguna forma de usar el procedimiento
almacenado en la consulta? O pasar el resultado de la select anterior (solo
el campo OL_PRO_ID) como parámetro al procedimiento almacenado?

Muchas gracias por leerme :)
Saludos.



Mauricio
Copenhague, Dinamarca

Preguntas similares