Procedimiento Almacenado para Referencia Cruzada

23/10/2009 - 16:52 por RP | Informe spam
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) 09
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??
 

Leer las respuestas

#1 Carlos M. Calvelo
24/10/2009 - 13:50 | Informe spam
Hola RP,

On Fri, 23 Oct 2009 07:52:01 -0700, RP wrote:

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) 09
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??



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

Preguntas similares