Salve,
beh.... di base vedo alcune cosine che "non mi piacciono"
- innanzitutto la concatenazione di stringhe per passare un "parametro", e questo ti puo' eventualmente causare seri problemi di sql injection....
- poi non comprendo bene l'uso della subquery interna...
se ho ben compreso la tua necessita', avrei fatto una rotazione orizzontale su colonna tramite CASE WHEN ... in base a [htype] e [hact] per avere una sola espressione...
-- vedo che referenzi gli oggetti a livello di Tabella/Vista senza specificare lo "schema" di appartenenza, quindi utilizzi chiamate non FULL QUALIFIED. Questo NON permette all'optimizer di SQL Server di riutilizzare il piano di esecuzione della query, che verra' sempre ricompilata ad ogni successiva esecuzione, sprecando quindi molte risorse sia a livello di memoria, di IO, che di mero tempo di esecuzione finale... considera che il tokenizer deve in questo caso anche verificare nell'intero catalogo per tutti gli schemi quale sia l'oggetto referenziato (magari duplicato, e questo sarebbe l'unico caso corretto di non utilizzo di non qualificare completamente l'oggetto) disponibile nelle autorizzazioni dell'esecutore della query...
quindi, brutalmente, utilizzerei innanzitutto un oggetto Command per caricare il parametro di @hact, e trivialmente riscriverei il tutto in
Dim sql as String = "SELECT r.[htype]" _
", SUM( CASE r.[htype] WHEN 0 THEN r.[amt] ELSE 0.00 END ) AS [Dare]" _
", SUM( CASE r.[htype] WHEN 1 THEN r.[amt] ELSE 0.00 END ) AS [Avere]" _
"FROM [nome_dello_schema].[REGISTRY] r" _
"WHERE r.[hact] = @hact"
al di la' di cio', non conoscendo pero' la struttra della base dati, non vedo un filtro di WHERE particolarmente stringente, e la cardinalita' del risultato dovrebbe essere a mio avviso molto alta....
- ultima, ma non ultima, personalmente non amo molto di codice dinamico, sia esso costruito a mano o generato dagli orm... preferisco di gran lunga la chiamata a stored procedure, dove il dba, a conoscenza delle richieste specifiche in quanto probabilmente scrive le query lui stesso, puo' eventualmente affinare ed agevolare l'esecuzione delle query generando indici, statistiche, hint di esecuzione, .... ma capisco che questa affermazione possa anche scatenera flame e guerre di religione, quindi mi fermo
EDIT: scutate, per tutta la parte di qualification ho dato per scontato l'utilizzo di SQL Server, ma ovviamente questo puo' non essere il tuo caso, quindi chiedo venia
saluti
--
Andrea