Optimering af funktion
HejJeg har en stored procedure som indeholder et view der henter fra et view og igen hen..., ting som gør forespørgslen langsom, men som det vil være for vidt og indvie jer i her. Derimod mistænker jeg en funktion jeg har lavet for at være en medvirkende årsag til at få det til at køre langsomt.
Jeg håber I kan hjælpe mig med at optimere funktionen. Funktionen kommer her med forklarende tekst til:
-- Create date: <7. april 2009>
-- Description: <Will find the workingdays from activitystart until datetime.now>
-- =============================================
-- DER ØNSKES FØLGENDE RETURNERET
-- (L)5 LUKKET OG HAR VÆRET REPARARET I 5 DAGE
-- 5 VÆRET REPARARET I 5 DAGE, MEN ER STADIG ÅBEN
ALTER FUNCTION [dbo].[WorkingDays]
-- aktivitetsid'et angiver et id på en reparation, der tager x-antal arbejdsdage at reparare.
(
-- Add the parameters for the function here
@ActivityID int,
-- Getdate() - function is not allowed in a function
@Datenow DATETIME
)
RETURNS VARCHAR(20)
AS
BEGIN
-- Declare the return variable here
DECLARE @WorkingDays VARCHAR(20)
DECLARE @DayFrom DATETIME
DECLARE @DayTo DATETIME
DECLARE @OffDays INT
DECLARE @ActivityClosed BIT
DECLARE @Prefix CHAR(4)
-- Add the T-SQL statements to compute the return value here
-- STARTTIDSPUNKTET FOR REPARATIONEN.
SET @DayFrom = (SELECT Activities.ActivityStartDateTime
FROM Activities
WHERE ActivityID = @ActivityID)
-- ... UNDERSØGES FOR OM REPARATIONEN ER SLUT 0 = ÅBEN 1 = LUKKET (SLUT)
SET @ActivityClosed =(SELECT Activities.ActivityClosed
FROM Activities
WHERE ActivityID = @ActivityID)
-- HVIS DEN IKKE ER LUKKET SKAL DER IKKE VÆRE ET PREFIX
-- OG DATOEN TIL SKAL VÆRE DAGS DATO
IF (@ActivityClosed = 0)
BEGIN
SET @DayTo = @Datenow
SET @Prefix = ''
END
ELSE
-- HVIS REPARATIONEN ER LUKKET SKAL PRÆFIX VÆRE (L)
-- OG DATOEN TIL SKAL VÆRE LUKKEDATOEN (ACTIVITYENDDATETIEM)
BEGIN
SET @DayTo = (SELECT Activities.ActivityEndDateTime
FROM Activities
WHERE ActivityID = @ActivityID)
SET @Prefix = '(L) '
-- SET @Prefix = ''
END
SELECT @OffDays = COUNT(DateID)
FROM Calender
-- JEG HAR LAVET EN KALENDER -TABEL DER SER SÅDAN UD
--
--1998-01-01 00:00:00.000 1 Nytårsdag
--1998-01-02 00:00:00.000 0 NULL
--1998-01-03 00:00:00.000 1 NULL
--1998-01-04 00:00:00.000 1 NULL
--1998-01-05 00:00:00.000 0 NULL
WHERE (DayOff = 1) AND (DateID > @DayFrom) AND (DateID <= @DayTo)
SET @WorkingDays = DATEDIFF( day , @DayFrom, @DayTo) - @OffDays
RETURN (@Prefix + @WorkingDays)
END
-- Måske vil det hjælpe at Præfix? - det er blot en smart feature jeg har lavet - men folk vil godt nok blive kede af det :-(