|
|
Subject: SP @filtro,@filtro,@filtro,@filtro, @Colonna/e DaEstrarre con filtro e ColonneDaEstrarre che lavorano su piu' tabelle
From: AlessandroD
Date: 4/30/2007 7:36:28 PM
"Manuel Meinardi" <info@qdistudio.com> ha scritto nel messaggio
news:1177945941.688556.240340@h2g2000hsg.googlegroups.com...
> Esatto so che è semplice ma sono alle prime armi, mi servirebbe un
> picclo spunto, poi credo di potermi arrangiare anche da solo.
>
Prima regola: creare stored procedure troppo generiche è un male, perché sei
costretto a ricorrere al T-SQL dinamico e questo è molto male :-)
Facendo pratica capirai, e più in la' la scelta di ricorrere al T-SQL
dinamico in certi particolari casi sarà più consapevole e chiara, ma fidati
che la risposta non sarà mai: "il T-SQL dinamico serve per creare stored
procedure generiche".
Tornando alla tua esigenza oltre a leggere con attenzione un po' dei post
che ti ha suggerito Marcello, io ti proporrei una soluzione che comunque
dovrebbe andarti bene e che non prevede l'uso di stored procedure e nemmeno
di T-SQL dinamico.
Praticamente sfrutto una user function con parametri in sostituzione della
stored procedure.
Questo ti permette di creare lato client una select sulla user function
specificando di volta in volta i campi di cui hai realmente bisogno oltre
che ad un probabile elenco di campi per l'ordinamento del resulset.
Il pseudo codice non testabile della user function che si basa sulle info
generiche che hai passato è questo:
create function ufnCocktailsRic (
@ID_Cocktail varchar (32),
@Code varchar (64),
@Valutazione int,
@Categoria varchar (64),
@Base varchar (64)
)
returns table
as
return (
select
c.ID_Cocktail, c.Code, c.Valutazione, c.ID_Categoria, c.ID_Base,
t.Code as Categoria,
b.Code as Base
from
t_Ap_Cocktails c inner join t_Ap_Categorie t
on c.ID_Categoria= t.ID_Categoria
inner join t_Ap_Base b
on c.ID_Base= b.ID_Base
where
c.ID_Cocktail= isnull (@ID_Cocktail, c.ID_Cocktail) and
c.Code like '%' + isnull (@Code, '') + '%' and
c.Valutazione= isnull (@Valutzione, c.Valutazione) and
t.Code= isnull (@Categoria, t.Code) and
b.Code= isnull (@Base, b.Code)
)
Con questa funzione in mano, lato client ti basterà eseguirci sopra le tu
select con i campi che potranno variare di volta in volta, ritornando ai
tuoi esempi:
> se voglio tutti i Code dei cocktail dove il Code contiene 'ca' --
> >sp_Procedura 'ca', null, null, null, null,'t_Ap_Cocktails.Code'
select distinct Code from ufnCocktailsRic (null, 'ca',null,null,null) order
by Code
> se voglio tutti i Code cocktail dove il Code contiene 'ca' e sono a
> base di rum -->sp_Procedura 'ca', null, null, null,
> 'rum','t_Ap_Cocktails.Code cocktail'
select distinct Code as cocktail from ufnCocktailsRic (null, 'ca', null,
null, 'rum') order by cocktail
> se voglio sapere la base e la categoria con la quale è fatto il
> cocktail con ID = '123kjbhu22h35jh25342hv5jh3425hju' -->
> sp_Procedura null, null, null, '123kjbhu22h35jh25342hv5jh3425hju',
> null,'t_Ap_Base.Code Base, t_Ap_Categorie.Code Categoria'
>
select distinct Base, Categoria from ufnCocktailsRic
('123kjbhu22h35jh25342hv5jh3425hju',null,null,null,null) order by Base,
Categoria
Occhio alla necessità di usare o meno la clausola distinct nella select per
evitare righe duplicate.
E tieni presente che, se non sbaglio, lato client puoi acceedere alla user
function come fosse una sp con i suoi parametri.
Praticamente non devi comporre una banale stringa con la select finale che
ti serve (quella degli esempi), ma devi definire un command con 5 parameter
e nel text dell'ogetto command ci piazzi ad esempio:
"select distinct Code from ufnCocktailRic (@ID_Cocktail, @Code,
@Valutazione, @Categoria, @Base order by Code"
Valorizzi quindi i 5 parameter che sono referenziati nel text e poi generi
dal command il tuo bel recordset che andrai ad usare secondo le tue
necessità. Questo è necessario per non incorrere nei problemi derivanti da
quello che si chiama SQL-injection.
Mega riassunto finale: non usare il T-SQL dinamico, ne' lato server, ne'
lato client.
Quando ti sarai fatto le ossa caso mai potrai decidere diversamente, ma per
adesso no! :-)
Ciao, Alessandro
|