I created new table-valued function, and then realized that the approach may not be very good. The main problem (in my opinion) is that I used declaration new table in tvf
. I'm sure that this is not very good for tvf
.
ALTER FUNCTION [dbo].[tvf_GetOnSaleDate]
(
@EntityType INT
)
RETURNS @Result TABLE(OnSaleDate DATETIME, EntityId INT)
BEGIN
DECLARE @Sales TABLE (SaleDate DATETIME, EntityId INT, SaleDateVenueDate DATE, CurrentVenueDate DATE)
INSERT @Sales (SaleDate, EntityId, SaleDateVenueDate, CurrentVenueDate)
SELECT SaleDate, EntityId, CAST(DATEADD(hour, vc.HoursOffset, SaleDate) AS DATE) AS SaleDateVenueDate, CAST(DATEADD(hour, vc.HoursOffset, GETUTCDATE()) AS DATE) AS CurrentVenueDate
FROM dbo.om_EntityOnSale AS es WITH (NOLOCK)
INNER JOIN dbo.event AS e WITH (NOLOCK) ON e.event_id = es.EntityId AND es.EntityType = @EntityType
INNER JOIN dbo.om_Venue AS vc WITH (NOLOCK) ON vc.Indux_Venue_Id = e.venue_id
INSERT @Result(OnSaleDate, EntityId)
SELECT [OnSaleDate] =
CASE
WHEN (SELECT COUNT([SaleDate]) FROM @Sales WHERE [SaleDateVenueDate] > [CurrentVenueDate] AND [EntityId] = sales.EntityId) > 0
THEN (SELECT MIN([SaleDate]) FROM @Sales WHERE [SaleDateVenueDate] > [CurrentVenueDate] AND [EntityId] = sales.EntityId)
WHEN (SELECT COUNT([SaleDate]) FROM @Sales WHERE [SaleDateVenueDate] < [CurrentVenueDate] AND [EntityId] = sales.EntityId) > 0
THEN (SELECT MAX([SaleDate]) FROM @Sales WHERE [SaleDateVenueDate] < [CurrentVenueDate] AND [EntityId] = sales.EntityId)
END, sales.[EntityId]
FROM @Sales sales
GROUP BY EntityId
RETURN
END
What can I do to optimize this function?
Aucun commentaire:
Enregistrer un commentaire