SQL Server - pasar procedimiento a funcion

 
Vista:

pasar procedimiento a funcion

Publicado por Jorge (1 intervención) el 13/04/2010 08:48:35
me gustaria saber como transformar el siguiente procedimiento almacenado de sql server a una funcion que devuelva los datos de una consulta de referencias cruzadas, muchas gracias:

CREATE PROCEDURE GetInformeStock

@fechainicio datetime,
@fechafin datetime,
@lote nvarchar(50),
@producto nvarchar(50),
@almacen nvarchar(50)

AS
BEGIN
SET NOCOUNT ON;

select dbo.TipoProducto.Codigo as código, dbo.TipoProducto.Nombre as producto, dbo.RegTrazabilidad.LoteDestino as lote, sum(Convert(decimal(10,2),dbo.RegTrazabilidad.CantDestino+'0')/10) as cantidad , dbo.Almacen.NombreAlmacen as almacen
from dbo.TipoProducto inner join dbo.RegTrazabilidad
on dbo.RegTrazabilidad.IDTipoProductoDestino = dbo.TipoProducto.IDTipoProducto
inner join dbo.Almacen on dbo.RegTrazabilidad.IDAlmacenDestino = dbo.Almacen.IDAlmacen
where convert(datetime, substring(dbo.RegTrazabilidad.Instante,4,2)+'/'+substring(dbo.RegTrazabilidad.Instante,0,3)+'/'+substring(dbo.RegTrazabilidad.Instante,7,2) )>=@fechainicio
and convert(datetime, substring(dbo.RegTrazabilidad.Instante,4,2)+'/'+substring(dbo.RegTrazabilidad.Instante,0,3)+'/'+substring(dbo.RegTrazabilidad.Instante,7,2) ) <= @fechafin
and dbo.RegTrazabilidad.IDTipoProductoDestino=@producto
and dbo.RegTrazabilidad.IDAlmacenDestino=@almacen
and dbo.RegTrazabilidad.LoteDestino=@lote
and dbo.RegTrazabilidad.Auditoria='INSERT'
group by dbo.TipoProducto.Codigo, dbo.TipoProducto.Nombre, dbo.RegTrazabilidad.LoteDestino, dbo.Almacen.NombreAlmacen

union all

select dbo.TipoProducto.Codigo as código, dbo.TipoProducto.Nombre as producto, dbo.RegTrazabilidad.LoteOrigen as lote, sum(Convert(decimal(10,2),dbo.RegTrazabilidad.CantDestino+'0')/10) as cantidad , dbo.Almacen.NombreAlmacen as almacen
from dbo.TipoProducto inner join dbo.RegTrazabilidad
on dbo.RegTrazabilidad.IDTipoProductoOrigen = dbo.TipoProducto.IDTipoProducto
inner join dbo.Almacen on dbo.RegTrazabilidad.IDAlmacenOrigen = dbo.Almacen.IDAlmacen
where convert(datetime, substring(dbo.RegTrazabilidad.Instante,4,2)+'/'+substring(dbo.RegTrazabilidad.Instante,0,3)+'/'+substring(dbo.RegTrazabilidad.Instante,7,2) )>= @fechainicio and convert(datetime, substring(dbo.RegTrazabilidad.Instante,4,2)+'/'+substring(dbo.RegTrazabilidad.Instante,0,3)+'/'+substring(dbo.RegTrazabilidad.Instante,7,2) ) <= @fechafin
and dbo.RegTrazabilidad.IDTipoProductoOrigen=@producto
and dbo.RegTrazabilidad.IDAlmacenOrigen=@almacen
and dbo.RegTrazabilidad.LoteOrigen=@lote
and dbo.RegTrazabilidad.Auditoria='INSERT'
group by dbo.TipoProducto.Codigo, dbo.TipoProducto.Nombre, dbo.RegTrazabilidad.LoteOrigen, dbo.Almacen.NombreAlmacen
order by 1 ;

END

/////////////////
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de roger

RE:pasar procedimiento a funcion

Publicado por roger (173 intervenciones) el 13/04/2010 14:52:41
no puedes poner el order by si se trata de una funcion de tabla en línea. Te quedari algo asi como:

CREATE function GetInformeStock(
@fechainicio datetime,
@fechafin datetime,
@lote nvarchar(50),
@producto nvarchar(50),
@almacen nvarchar(50))
RETURNS TABLE
AS
return
select dbo.TipoProducto.Codigo as código, dbo.TipoProducto.Nombre as producto, dbo.RegTrazabilidad.LoteDestino as lote, sum(Convert(decimal(10,2),dbo.RegTrazabilidad.CantDestino+'0')/10) as cantidad , dbo.Almacen.NombreAlmacen as almacen
from dbo.TipoProducto inner join dbo.RegTrazabilidad
on dbo.RegTrazabilidad.IDTipoProductoDestino = dbo.TipoProducto.IDTipoProducto
inner join dbo.Almacen on dbo.RegTrazabilidad.IDAlmacenDestino = dbo.Almacen.IDAlmacen
where convert(datetime, substring(dbo.RegTrazabilidad.Instante,4,2)+'/'+substring(dbo.RegTrazabilidad.Instante,0,3)+'/'+substring(dbo.RegTrazabilidad.Instante,7,2) )>=@fechainicio
and convert(datetime, substring(dbo.RegTrazabilidad.Instante,4,2)+'/'+substring(dbo.RegTrazabilidad.Instante,0,3)+'/'+substring(dbo.RegTrazabilidad.Instante,7,2) ) <= @fechafin
and dbo.RegTrazabilidad.IDTipoProductoDestino=@producto
and dbo.RegTrazabilidad.IDAlmacenDestino=@almacen
and dbo.RegTrazabilidad.LoteDestino=@lote
and dbo.RegTrazabilidad.Auditoria='INSERT'
group by dbo.TipoProducto.Codigo, dbo.TipoProducto.Nombre, dbo.RegTrazabilidad.LoteDestino, dbo.Almacen.NombreAlmacen

union all

select dbo.TipoProducto.Codigo as código, dbo.TipoProducto.Nombre as producto, dbo.RegTrazabilidad.LoteOrigen as lote, sum(Convert(decimal(10,2),dbo.RegTrazabilidad.CantDestino+'0')/10) as cantidad , dbo.Almacen.NombreAlmacen as almacen
from dbo.TipoProducto inner join dbo.RegTrazabilidad
on dbo.RegTrazabilidad.IDTipoProductoOrigen = dbo.TipoProducto.IDTipoProducto
inner join dbo.Almacen on dbo.RegTrazabilidad.IDAlmacenOrigen = dbo.Almacen.IDAlmacen
where convert(datetime, substring(dbo.RegTrazabilidad.Instante,4,2)+'/'+substring(dbo.RegTrazabilidad.Instante,0,3)+'/'+substring(dbo.RegTrazabilidad.Instante,7,2) )>= @fechainicio and convert(datetime, substring(dbo.RegTrazabilidad.Instante,4,2)+'/'+substring(dbo.RegTrazabilidad.Instante,0,3)+'/'+substring(dbo.RegTrazabilidad.Instante,7,2) ) <= @fechafin
and dbo.RegTrazabilidad.IDTipoProductoOrigen=@producto
and dbo.RegTrazabilidad.IDAlmacenOrigen=@almacen
and dbo.RegTrazabilidad.LoteOrigen=@lote
and dbo.RegTrazabilidad.Auditoria='INSERT'
group by dbo.TipoProducto.Codigo, dbo.TipoProducto.Nombre, dbo.RegTrazabilidad.LoteOrigen, dbo.Almacen.NombreAlmacen
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar