|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Feb 2007
Messaggi: 122
|
[SQL SERVER 2005] Non riconosce una parola chiave nella clausola "OPTION"
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. 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. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
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'
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Feb 2007
Messaggi: 122
|
Ti faccio vedere il codice della funzione con dei nomi resi generali e con condizioni semplificate al massimo.
Codice:
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
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. 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. :\ Ultima modifica di Koroner : 13-03-2007 alle 14:01. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:20.



















