PDA

View Full Version : [SQL SERVER 2005] Non riconosce una parola chiave nella clausola "OPTION"


Koroner
13-03-2007, 10:17
Ciao a tutti... Sono ai miei primi passi con SQL e sono incappato in un problema.

Sto programmando in ASP.NET con Visual Studio e ho definito all'interno del database SQL una funzione che richiama se stessa in maniera ricorsiva.
Poi ho creato una query semplice per vedere i risultati della funzione, confidando che andasse tutto bene, ma con mio grande dispiacere è apparso un errore che dice che in misura preventiva SQL Server impedisce di fare "troppe" chiamate ricorsive.

Ho cercato nel web e il limite imposto dipende dalla variabile MAXRECURSION che si può specificare nella clausola OPTION da apporre a fine query.

Il problema è che non la riconosce. Ovvero scrivo OPTION (MAXRECURSION <numero>) a fondo query e salvando la funzione Visual Studio mi dice che ci sono errori di sintassi nei pressi di OPTION. Errori di sintassi non ce ne sono, è che non vede MAXRECURSION. :muro:

Ancora più frustrante, se aggiungo OPTION (MAXRECURSION <numero> alla fine del SELECT di una query o di una vista tutto viene riconosciuto e funziona.

Spero qualcuno mi sappia dire qualcosa a riguardo. :(

RaouL_BennetH
13-03-2007, 11:29
puoi postare la parte di codice incriminata?

In teoria per le query ricorsive e il numero massimo di ricorsioni basta aggiungerl dopo qualsiasi group o order , per es.:

SELECT blabla
......
......

order by qualcheValore

OPTION (MAXRECURSION 2);

Quindi, da quello che tu dici sembra essere tutto corretto, ma forse c'è la possibilità che ci sia un piccolo errore di sintassi prima della 'OPTION'

Koroner
13-03-2007, 12:29
Ti faccio vedere il codice della funzione con dei nomi resi generali e con condizioni semplificate al massimo.

ALTER FUNCTION dbo.Funz1(@P1 int, @P2 int)
RETURNS bit
AS
BEGIN
RETURN
(
SELECT
CASE COUNT(*)
WHEN 0 THEN 'False'
ELSE 'True'
END
FROM Tab1
WHERE Tab1.Campo1 = @P2
AND (dbo.Funz2(@P1, Tab1.Campo2) = 'True' OR dbo.Funz1(@P1, Tab1.Campo2) = 'True')
OPTION (MAXRECURSION 0)
)
END

Puoi vedere che sono un niubbo totale di SQL dal fatto che per far ritornare alla funzione un bool che indichi se ci sono stati o meno dei record uso quell'orrido CASE...
So che c'è la parola chiave EXISTS ma sto semplicemente facendo esperimenti e fintanto che riesco a produrre codice funzionante per me è ok, poi raffino. :D

L'unica condizione che ho scritto qui collega @P2 al valore equivalente che ha nella tabella Tab1.
Cioè Tab1 ha due campi int, Campo1 che accoglie valori come P1 e Campo2 che accoglie valori come P2.

Ciò che conta (e spero si capisca) è che questa funzione restituisce 'True' se per i due input è verificata un'altra funzione (in tutto simile a questa, ma senza chiamate ricorsive) oppure questa stessa ma chiamate sui nuovi parametri estrapolati dalla tabella Tab1 (uno in realtà è uguale, cioè @P1).

MAXRECURSION è impostato a 0 perché dovrebbe levare proprio il check, da quello che ho letto. Comunque l'importante è che funzioni, poi lo posso mettere anche a un numero alto.

Rimango dell'impressione che Visual Studio non mi "veda" proprio la parola chiave MAXRECURSION (cioè non la permetta) all'interno di funzioni.
Non è nemmeno colorata in blu. :\