Questione : La dichiarazione terminata. La ricorrenza massima 100 è stata esaurita prima di completamento di dichiarazione

Ciao ho il codice sotto di sql e continu aare ottenere all'errore “la dichiarazione terminata. La ricorrenza massima 100 è stata esaurita prima idee del

Any di completamento di dichiarazione " perché?
class= > " libero " del
> " del codeSnippet " del class= del
class= " lineNumbers " del
class= del
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
cte notpretty del >WITH " del class= " " di codeSnippet947215 del id= del
           
class= del

Risposta : La dichiarazione terminata. La ricorrenza massima 100 è stata esaurita prima di completamento di dichiarazione

Provare il codice qui sotto -!! ATTENZIONE!! - provarla prego a fondo.

La mia congettura è che le ricorrenze di CTE sono contate cumulativamente per tutto il CTEs ricorsivo/incastonato.  Così se avete 3 livelli di CTE ed il livello superiore induce il secondo livello a collegare 50 volte in circuito, il secondo livello induce il terzo livello a collegare 80 volte in circuito (80 giorni), voi ottiene 4000 ricorrenze già senza persino collegare al livello superiore.

Studiare la possibilità di usando mentre i cicli o altri metodi per ridurre il numero di CTE denomina.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
GENERARE LA FUNZIONE [dbo]. [CalcMinutesSLA_TFAM] (
 DATETIME del @startTime,
 DATETIME del @endTime
 ) 
restituisce il int
As
cominciare
	dichiarare i @minutes int;
	dichiarare il datetime @startPlus1
	dichiarare il datetime @endLess1
	-- risolvere nel fratempo la gamma per i giorni interi
	selezionare @startPlus1 = datediff (d, 0, @startTime+1),
			@endLess1 = datediff (d, 0, @endTime-1)
	-- controllare i quanti giorni di non-fine settimana esistono in questa gamma
	selezionare i @minutes = 480 * (convertito (int, @endLess1-@startPlus1) /7*5 + conteggio (*))
	dal padrone. .spt_values
	dove type='P e numero fra 0 e datediff (d,
		@startPlus1+convert (int, @endLess1-@startPlus1) /7*7, @endLess1)
		e datename (dw, @startPlus1+number)! = “S„
	-- controllare quante feste di non-fine settimana esistono in questa gamma
	selezionare i @minutes = i @minutes - conteggio (*)
	dai web_holidays
	dove HolidayDate fra @startPlus1 e @endless1
	  ed andato (datename (dw, HolidayDate), 1)! = “S„
	-- registrare i periodi per in primo luogo/ultimi giorni
	se @endTime 17 del datepart (hh, < 9="" set="">@startTime) = = datediff stabiliti (dd, 0, @endTime) +17.0/24
	se il ritorno del @endTime del >= del @startTime si unisce (@minutes, 0);
	-- se la data di inizio non è una festa e non un fine settimana, aggiungere i minuti
	selezionare i @minutes = i @minutes +
		datediff (MI, @startTime, datediff (dd, 0, @startTime) +17.0/24)
	dove non esiste (
		selezionare * a partire dai web_holidays
		dove HolidayDate = datediff (dd, 0, @startTime))
		ed andato (datename (dw, @startTime), 1)! = “S„
	-- se la data di estremità non è una festa e non un fine settimana, aggiungere i minuti
	selezionare i @minutes = i @minutes +
		datediff (MI, datediff (dd, 0, @endTime) +9.0/24, @endTime)
	dove non esiste (
		selezionare * a partire dai web_holidays
		dove HolidayDate = datediff (dd, 0, @endTime))
		ed andato (datename (dw, @endTime), 1)! = “S„
	-- se lo start=end, noi conti due volte il giorno, eliminare 480
	selezionare i @minutes = i @minutes - 480
	dove non esiste (
		selezionare * a partire dai web_holidays
		dove HolidayDate = datediff (dd, 0, @endTime))
		ed andato (datename (dw, @endTime), 1)! = “S„
		e datediff (d, @startTime, @endTime) = 0 -- lo stesso giorno
   rinviare si uniscono (@minutes, 0);
estremità
ANDARE
Altre soluzioni  
 
programming4us programming4us