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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 Gina Solís
08/12/2009 - 17:08 | Informe spam
Si haces una funcion puedes usarla como si fuera cualquier tabla, o sea que
el parametro lo mandas de cualquier otra tabla enlazada (join).

Tambien puedes ver si te conviene mas tener una vista.


"Mauricio" escribió en el mensaje
news:
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


Respuesta Responder a este mensaje
#3 Juan Carlos Leguizamon
09/12/2009 - 14:50 | Informe spam
Probaste agregando a esa funcion un Left Join con la tabla donde tienes los
componentes?

"Mauricio" escribió en el mensaje
news:
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


Respuesta Responder a este mensaje
#4 Mauricio
09/12/2009 - 15:43 | Informe spam
No, no lo probé así. Lo hago y les cuento.
Gracias por la ayuda.

Juan Carlos Leguizamon a exprimé avec précision :
Probaste agregando a esa funcion un Left Join con la tabla donde tienes los
componentes?

"Mauricio" escribió en el mensaje
news:
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.



Copenhague, Dinamarca







Mauricio
Copenhague, Dinamarca
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida