@dataFrom) BEGIN -- calcolo totale "raw" delle ore SET @oreTot = CAST(ISNULL(DATEDIFF(minute, @dataFrom, @dataTo), 0) AS float) / 60; -- definisco tabella cte ricorsiva WITH mycte AS ( SELECT CAST(dbo.f_dateOnly(DATEADD(dd,1,@dataFROM)) AS DATETIME) DateValue UNION ALL SELECT DateValue + 1 FROM mycte WHERE DateValue + 1 < dbo.f_dateOnly(@dataTo) ) -- carico nella tab temporanea i sabati e le domeniche... INSERT into @tmp_dates(DateValue, h) SELECT *, CASE ((DATEPART(dw, DateValue) + @@DATEFIRST) % 7) WHEN 0 THEN 16 ELSE 24 END AS h FROM mycte WHERE ((DATEPART(dw, DateValue) + @@DATEFIRST) % 7) IN (0,1) OPTION (MAXRECURSION 0) -- carico le festività per le date NON ancora presenti insert into @tmp_dates(DateValue, h) select data as DateValue, 24 as h--, descrizione from CalendFesteFerie where data between @dataFrom and @dataTo and data not in (select distinct DateValue from @tmp_dates) -- aggiorno sabati/domenica che fossero festivi (ipotesi che hfest > h sab/dom... UPDATE @tmp_dates SET h=24 WHERE DateValue in (SELECT data FROM CalendFesteFerie WHERE data between @dataFrom and @dataTo) -- calcolo INFINE le ore off! SET @oreOff = (SELECT ISNULL(SUM(h),0) FROM @tmp_dates) END -- setto le nuove ore totali... se ho un numero di ore > delle fermate le sottraggo per evitare ore engative... IF(@oreTot > @oreOff) BEGIN SET @oreTot = @oreTot - @oreOff END RETURN @oreTot END]]> 0 BEGIN DROP TABLE ##TMP_nomiTabelle END -- enumero le tab del db in una tab temporanea SELECT IDENT = IDENTITY (INT,1,1), name INTO ##TMP_nomiTabelle FROM sys.Tables -- eseguo reindicizzazione DECLARE @VAR1 INT SET @VAR1 = 1 WHILE @VAR1 < = ( SELECT COUNT(*) FROM ##TMP_nomiTabelle) BEGIN DECLARE @OBJECTNAME VARCHAR(256) -- carico il nome della tab i-esima SELECT @OBJECTNAME = name FROM ##TMP_nomiTabelle WHERE [IDENT] = @VAR1 -- rebuild indice DBCC DBREINDEX(@OBJECTNAME) -- incremento SET @VAR1 = @VAR1 + 1 END --shrink del db DBCC SHRINKDATABASE (@databaseName) END]]> 0) BEGIN UPDATE InterventiMtz SET idxStato = Tra_Ev2Stati.nextIdxStato FROM InterventiMtz INNER JOIN Tra_Ev2Stati ON InterventiMtz.idxStato = Tra_Ev2Stati.idxStato WHERE (InterventiMtz.numIntMtz = @numIntMtz) AND (Tra_Ev2Stati.idxEvento = @idxEvento) END COMMIT TRAN -- calcolo lo stato nuovo... SET @idxStatoNew = ISNULL((SELECT idxStato FROM InterventiMtz WHERE (numIntMtz = @numIntMtz)),0) RETURN (@idxStatoNew)]]>