Il mio problema (o almeno il messaggio di errore) è molto simile al Query Processor a corto di risorse interne - query sql estremamente lunga .
Il mio cliente sta lavorando con una query di selezione SQL, contenente una clausola where con esattamente 100.000 voci.
La query non riesce con errore 8632 e messaggio di errore
Errore interno: è stato raggiunto un limite di servizi di espressione. Cerca espressioni potenzialmente complesse nella tua query e prova a semplificarle.)
Trovo molto singolare che questo messaggio di errore venga lanciato, esattamente a 100.000 voci, quindi mi chiedo se questo sia un valore configurabile. È questo il caso e in caso affermativo, come posso aumentare questo valore a uno più alto?
Su MSDN , c'è la proposta di riscrivere la query, ma vorrei evitarlo.
Nel frattempo ho scoperto che l'elenco delle voci di cui sto parlando contiene numeri naturali, alcune di esse sembrano essere sequenziali (qualcosa del tipo (1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20).
Questo rende la clausola where SQL qualcosa di simile a:
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
Potrei trasformarlo in:
where (entry between 1 and 3) OR
(entry between 6 and 10) OR
(entry between 12 and 13) OR
(entry between 15 and 20)
Questo può essere abbreviato da:
where entry in (1,...,3,6,...,10,12,13,15,...,20)
... o qualcosa di simile? (So che è un colpo lungo, ma renderebbe gli aggiornamenti del software più facili e più leggibili)
Per tua informazione: i dati nella clausola where sono il risultato di un calcolo, fatto su un'altra tabella: prima le voci di quella tabella vengono lette e filtrate all'inizio, quindi viene eseguita un'elaborazione aggiuntiva (che è impossibile fare usando SQL), il risultato di tale elaborazione aggiuntiva è più filtrante e il risultato viene utilizzato nella clausola where. Poiché era impossibile scrivere il filtro completo in SQL, è stato utilizzato il metodo menzionato. Ovviamente il contenuto della clausola where potrebbe cambiare ad ogni elaborazione, quindi la necessità di una soluzione dinamica.
WHERE IN
non supporta questo tipo di sintassi dell'intervallo. Inoltre, non dovrebbe essereWHERE () OR () OR ()
AND. Ma per usare il suggerimento di Brent, in realtà non devi cambiare l'intera query, puoi semplicemente farloWHERE IN (SELECT myID FROM #biglist)
. E#biglist
potrebbe essere un vero tavolo (permanente) o un tavolo temporaneo che si crea al volo.