Procedimiento Almacenado

26/01/2004 - 21:19 por Luis Gutierrez | Informe spam
quien me podria ayudar con este store procedure, no se
que estoy haciendo mal...


SELECT A.comp_item_no, C.item_desc_1, C.PUR_OR_MFG,
C.item_desc_2, C.mat_cost_type, C.Prod_Cat,
(A.qty_per_par) AS Peso_Neto, A.SCRAP_FACTOR,
((A.qty_per_par*(A.SCRAP_FACTOR/100))+A.qty_per_par) as
Peso_Bruto , A.loc,
B.qty_on_hand, A.mfg_uom,
(if (SELECT item_no FROM PPCSTSTR_SQL WHERE
ITEM_NO=A.comp_item_no and vac_type='MAQ') <> null
BEGIN
isnull(((SELECT VAC_RATE FROM PPCSTSTR_SQL WHERE
ITEM_NO=A.comp_item_no and vac_type='MAQ') *
A.qty_per_par),0)
END
ELSE
BEGIN
EXEC SP_IR_BMITEMLEVEL2 A.comp_item_no
END) AS Maquila,
CostoProm= CASE C.pur_or_mfg
WHEN 'P' THEN (SELECT avg_cost FROM IMINVLOC_SQL
WHERE ITEM_NO=A.comp_item_no AND LOC='300')
WHEN 'M' THEN 0.00
END,
Costo= CASE C.pur_or_mfg
WHEN 'P' THEN (SELECT avg_cost FROM IMINVLOC_SQL
WHERE ITEM_NO=A.comp_item_no AND LOC='300')+(SELECT
VAC_RATE FROM PPCSTSTR_SQL WHERE ITEM_NO=A.comp_item_no
and vac_type='MAQ')
WHEN 'M' THEN 0.00
END
FROM BMPRDSTR_SQL A
INNER JOIN IMINVLOC_SQL AS B ON A.comp_item_no =
B.item_no
INNER JOIN IMITMIDX_SQL AS C ON A.comp_item_no =
C.item_no
WHERE A.item_no = 'P03M000100' AND B.loc=c.loc
AND A.activity_fg IN ('A','F')
ORDER BY A.item_no
 

Leer las respuestas

#1 Adrian Garcia
27/01/2004 - 04:23 | Informe spam
Bien, vayamos por partes...
A nivel de sintaxis

a) no puedes poner un IF dentro de la lista de columnas de un SELECT. Puedes
reemplazarlo el IF por un CASE y en ese caso si anda.

b) tampoco puedes invocar a un procedimiento almacenado en la lista de
columnas de un SELECT. Eso si, puedes reemplazar el procedmiento almacenado
por una UDF (siempre y cuando sea SQL Server 2000) que devuelve una tabla.

A nivel de diseño del query...
Por lo que veo la resolucion de este query esta orientada a un procesamiento
orientado fila a fila. Piensalo y rediseñalo en funcion de las capacidades
de resolver queryes en forma de conjunto de filas que ofrece SQL Server. Vas
a encontrar un mejor rendimiento (quizas hasta en varios ordenes de
magnitud) diseñando y pensando de esta forma.

Saludos
Adrian D. Garcia
NDSoft




"Luis Gutierrez" wrote in message
news:4d2501c3e449$bc2a7330$
quien me podria ayudar con este store procedure, no se
que estoy haciendo mal...


SELECT A.comp_item_no, C.item_desc_1, C.PUR_OR_MFG,
C.item_desc_2, C.mat_cost_type, C.Prod_Cat,
(A.qty_per_par) AS Peso_Neto, A.SCRAP_FACTOR,
((A.qty_per_par*(A.SCRAP_FACTOR/100))+A.qty_per_par) as
Peso_Bruto , A.loc,
B.qty_on_hand, A.mfg_uom,
(if (SELECT item_no FROM PPCSTSTR_SQL WHERE
ITEM_NO=A.comp_item_no and vac_type='MAQ') <> null
BEGIN
isnull(((SELECT VAC_RATE FROM PPCSTSTR_SQL WHERE
ITEM_NO=A.comp_item_no and vac_type='MAQ') *
A.qty_per_par),0)
END
ELSE
BEGIN
EXEC SP_IR_BMITEMLEVEL2 A.comp_item_no
END) AS Maquila,
CostoProm= CASE C.pur_or_mfg
WHEN 'P' THEN (SELECT avg_cost FROM IMINVLOC_SQL
WHERE ITEM_NO=A.comp_item_no AND LOC='300')
WHEN 'M' THEN 0.00
END,
Costo= CASE C.pur_or_mfg
WHEN 'P' THEN (SELECT avg_cost FROM IMINVLOC_SQL
WHERE ITEM_NO=A.comp_item_no AND LOC='300')+(SELECT
VAC_RATE FROM PPCSTSTR_SQL WHERE ITEM_NO=A.comp_item_no
and vac_type='MAQ')
WHEN 'M' THEN 0.00
END
FROM BMPRDSTR_SQL A
INNER JOIN IMINVLOC_SQL AS B ON A.comp_item_no > B.item_no
INNER JOIN IMITMIDX_SQL AS C ON A.comp_item_no > C.item_no
WHERE A.item_no = 'P03M000100' AND B.loc=c.loc
AND A.activity_fg IN ('A','F')
ORDER BY A.item_no

Preguntas similares