8 messaggi dal 03 febbraio 2011
Ciao a tutti, ho una stored procedure che calcola attraverso una funzione piuttosto complessa un costo. Avrei la necessità di riutilizzare il risultato della funzione una seconda volta all'interno della SP e mi piacerebbe riuscire a farlo senza fargli ricalcolare tutta la funzione:

la stored per capirci è la seguente:

ALTER PROCEDURE dbo.PRE2_GetElencoMateriale
(
@preventivo int,
@durata int
)
AS

SELECT TPre.chiave, TPre.quantita, TPre.stampa, TCat.tipo, TCat.costofisso, 
TCat.costoscalare, TCat.costoweek, TCat.descrizione, TCat.codice, TCat.catInt, TCat.giorni, 
dbo.PRE2_CostoMateriali(@durata, TCat.giorni, TCat.costoweek, TCat.costoscalare, TCat.costofisso) as costoUnita, 
(costoUnita * TPre.quantita) as costoTotale
FROM        TPreventiviMateriale2 as TPre INNER JOIN
            TCatalogo as TCat ON TPre.chiaveCatalogo = TCat.chiave
where    TPre.preventivo = @preventivo
ORDER BY  TCat.catInt, TCat.codice

RETURN


come circa si dovrebbe capire il costoUnita restituito dalla funzione vorrei moltiplicarlo per la quantità e avere il costo totale.

L'unico problema è che

(costoUnita * TPre.quantita) as costoTotale


mi da errore di "Invalid Column Name costoUnita"...

sbaglio qualcosa o proprio non si può fare?
grazie mille
Modificato da gnecco il 08 febbraio 2011 21.13 -
1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
Così come l'hai esposto non puoi riutilizzare un alias appena definito nella stessa select list dove l'hai appena dichiarato.
La soluzione può essere quella di utilizzare una tabella derivata in maniera simile a

SELECT a.c1, a.c2, a.cf, a.cf * c2
FROM (SELECT c1, c2, dbo.f(c3) AS cf
FROM dbo.MyTable) AS a

In questo modo la tabella derivata viene elaborata per prima e l'alias esiste già quando utilizzi quel campo risultato dell'alias nella select list più esterna.
Ti faccio tuttavia notare che utilizzare una udf in una select list equivale a richiamarla tante volte quante saranno le righe restituite dalla query e ciò rappresenta sempre un onere più o meno marcato in funzione del peso della udf stessa. Prova a riscrivere la query includendo nel corpo stesso della query la logica presente nella udf e ti renderai conto di quanto onerosa sia la soluzione basata sulla udf. Il risultato potrebbe essere trascurabile a tutto vantaggio della leggibilità se la query restituisse solo una decina di righe, ma già fossero centinaia apprezzeresti il benefit anche ad occhio relativamente ai tempi di esecuzione.

Bye
8 messaggi dal 03 febbraio 2011
Ciao Luca,
grazie mille per la risposta, ora provo ad includere la funzione direttamente nella SP. In effeti la SP lavora su una tabella con migliaia di righe, però a seconda del preventivo dovrebbe restituire massimo 150 voci. Prima tutti questi calcoli li facevo nel codebehind della pagina aspx ma volevo vedere se facendoli direttamente nella selezione dei dati velocizzavo un po' il tutto. O dici che è un ulteriore rallentamento?

Questa e la funzione, grazie ancora per l'aiuto!

Niente da fare... non mi consente di incollare la funzione, se la metto il forum va in errore e mi dice "pagina non trovata"

la metto qui se interessa: www.wildsoup.com/fun.txt


Modificato da gnecco il 09 febbraio 2011 14.18 -
Modificato da gnecco il 09 febbraio 2011 14.22 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.