Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Procedimiento Almacenado para Referencia Cruzada

41 views
Skip to first unread message

RP

unread,
Oct 23, 2009, 10:52:01 AM10/23/09
to
Hola que tal, Bueno Resulta que estoy queriendo hacer un Procedimiento
almacenado para ejecutar una Referencia Cruzada, tengo la siguiente consulta
que me funciona bien

WITH Ordenar(Item, Descripcion, Abrev, Meses, Valor, Fecha) AS

(
SELECT
b.Item As Item, b.Descripcion As Descripcion, u.abrev As Abrev,
MONTH(oc.FechReg) AS Meses, avg(dc.CostoUnit) AS Valor, '22/10/2009'

From
Bien b, DetalleOC dc, OrdenC oc, UnidadMedida u
Where
dc.CodBien = B.Codigo And B.Unidad = U.Codigo
And dc.CodOC=oc.Codigo And oc.Estado<>0
And year(oc.FechReg)=2009
And month(oc.FechReg)>7
Group By
MONTH (oc.FechReg), B.Item, B.Descripcion, U.Abrev
)
SELECT * From Ordenar
PIVOT(sum(Valor) FOR Meses IN ([7],[8],[9])) AS P

Pero cuando quiero hacerlo en un Procedimiento Almacenado que me reciba los
parametros no me funciona:

ALTER PROCEDURE [dbo].[sp_PromXMeses]
@nvcFecha nvarchar(25),
@intAnio int,
@intMes0 int,
@intMes1 int,
@intMes2 int,
@intMes3 int
AS
BEGIN
WITH Ordenar(Item, Descripcion, Abrev, Cast(Meses), Valor, Fecha) AS

(
SELECT
b.Item As Item, b.Descripcion As Descripcion, u.abrev As Abrev,
MONTH(oc.FechReg) AS Meses, avg(dc.CostoUnit) AS Valor, @nvcFecha

From
Bien b, DetalleOC dc, OrdenC oc, UnidadMedida u
Where
dc.CodBien = B.Codigo And B.Unidad = U.Codigo
And dc.CodOC=oc.Codigo And oc.Estado<>0
And year(oc.FechReg)=@intAnio
And month(oc.FechReg)>@intMes0
Group By
MONTH (oc.FechReg), B.Item, B.Descripcion, U.Abrev
)

SELECT * From Ordenar
PIVOT(sum(Valor) FOR Meses IN ([@intMes1],[@intMes2],[@intMes3])) AS P
END

Me salen los siguientes errores:

Msg 8114, Level 16, State 1, Procedure sp_PromXMeses, Line 16
Error al convertir el tipo de datos nvarchar a int.
Msg 473, Level 16, State 1, Procedure sp_PromXMeses, Line 16
Se ha proporcionado el valor incorrecto "@intMes1" en el operador PIVOT.

Como haria ese Procedimiento, o en que me estoy equivocando??

Carlos M. Calvelo

unread,
Oct 24, 2009, 7:50:53 AM10/24/09
to
Hola RP,

No puedes usar variables en el IN (...) del PIVOT (si no ve equivoco).
Entonces podr�as usar sql din�mico.

A ver si esto te funciona:

------------------------------------
declare @sql nvarchar(max);

set @sql = N'
WITH Ordenar AS

(
SELECT
b.Item As Item, b.Descripcion As Descripcion, u.abrev As Abrev,

MONTH(oc.FechReg) AS Meses, avg(dc.CostoUnit) AS Valor,'+
@nvcFecha+ N' as Fecha


From
Bien b, DetalleOC dc, OrdenC oc, UnidadMedida u
Where
dc.CodBien = B.Codigo And B.Unidad = U.Codigo
And dc.CodOC=oc.Codigo And oc.Estado<>0

And year(oc.FechReg)= '+ cast(@intAnio as nvarchar) + N'
And month(oc.FechReg)>' + cast(@intMes0 as nvarchar) + N'


Group By
MONTH (oc.FechReg), B.Item, B.Descripcion, U.Abrev
)
SELECT * From Ordenar

PIVOT(sum(Valor) FOR Meses IN ([' +
cast(@intMes1 as nvarchar) + N'],[' +
cast(@intMes2 as nvarchar) + N'],[' +
cast(@intMes3 as nvarchar) + N'])) AS P'

exec sp_executesql @sql
------------------------------------

Saludos,
Carlos

0 new messages