Gestione della Where....

lunedì 02 agosto 2010 - 11.58
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  .NET 4.0  |  Windows 7  |  Visual Studio 2010  |  Visual Studio 2008  |  SQL Server 2008 R2  |  SQL Server 2008  |  Office 2010  |  Internet explorer 8.0  |  Internet Explorer 7.0  |  VBScript  |  XHTML 2.0  |  Crystal Reports 2008

trinity Profilo | Guru

Ciao raga,
io ho una select nella quale vi è una where del genere: where a.codtipologia=@idtipologia and a.idcategoria=@idcategoria
ora dovrei gestire oppure no la colonna idcategoria ossia se il valore di @idcategoria è =0 la where deve essere composta così: where a.codtipologia=@idtipologia, altrimenti deve essere intera come scritta all'inizio del post.

E' possibile gestire nella where il case when e se si nel mio caso come perchè ho fatto delle prove ma mi escono errori di sintassi...oppure che consiglio mi date?

Grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>E' possibile gestire nella where il case when e se si nel mio
>caso come perchè ho fatto delle prove ma mi escono errori di
>sintassi...oppure che consiglio mi date?
No, non è possibile.
In questo thread troverai una soluzione di Itzik basata sull'uso oculato del Dynamic SQL oppure l'elegante soluzione di Marcello basata su una UDF inline:
http://groups.google.it/group/microsoft.public.it.sql/browse_thread/thread/59359884f3bc01d8/

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

ho scritto così:

where a.codtipologia=@idtipologia + case when @idcategoria=-1 then '' else @idcategoria End

e se passo il valore -1 alla variabile @idcategoria il risultato che desidero esce invece se gli passo il valore 0 non funziona mi da sempre gli stessi risultati invece dovrebbe restituirmi un solo record..

ho interpretato male il Dynamic SQL ?


Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>ho interpretato male il Dynamic SQL ?
Si. Puoi postare un esempio completo con la struttura della tabella (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il result set desiderato con quei dati?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

in pratica nella where della select il parametro @idtipologia è quello basilare mentre il parametro @idcategoria può essere utilizzato oppure no.

Esempio

se voglio sapere tutti gli alberghi allora passo solo il parametro @idtipologia quindi:

select * from albergo where idtipologia=0

se voglio sapere tutti gli alberghi a 4 stelle allora passo il parametro @idtipologia e @idcategoria quindi:

select * from albergo where idtipologia=0 and idcategoria=1

e così via...

io vorrei creare una where che mi esegue a seconda dei dati che gli passo la selezione dei record che desidero senza ricorrere a scrivere n stored.

Spero di averti dato tutto il necessario..

grazie e ciao


Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Spero di averti dato tutto il necessario..
In realtà anch'io ti avevo fornito tutto il necessario dato che nel thread indicato trovi ben 2 soluzioni a questo problema.
Mi limiterò ad indicarti quella di Marcello che oltre ad essere elegante è estremamente efficiente:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

>grazie e ciao
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

Funziona grazie mille, che poi alla fine era un metodi che avevo adottato ma che erravo in sintassi...senti una piccola info ed un tuo parere, a me capita di avere nel mio progetto tante stored che hanno tanti parametri ossia se devo passare due parametri posso anche creare 2 stored e scelgo quali utilizzare da vb oppure creo una sola stored e all'interno con una if in base al filtro che gli passo da vb scelgo quale codice eseguire ma stavo però vedendo una ocsa che prima di ora nn avevo pensato, potrei per rendere il codice + leggibile (qui chiedo il tuo giudizio) creare delle funzioni dove dentro eseguo il codice della stored e poi creare una semplice stored in cui richiamo la funzione...in questa stored gestisco i vari filtri e parametri che passo attraverso vb..Se nn erro è vero che creo una funzione in più ma è anche vero che rendo il codice più leggibile o sbaglio? e cmq perderei velocità e stabilità se dovessi adottare questo sistema?

ciao e grazie infinitamente
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>a me capita di avere nel mio progetto tante stored
>che hanno tanti parametri ossia se devo passare due parametri
>posso anche creare 2 stored e scelgo quali utilizzare da vb oppure
>creo una sola stored e all'interno con una if in base al filtro
>che gli passo da vb scelgo quale codice eseguire
Questo significa che in base ai parametri passati verrà generato un nuovo piano di esecuzione... non mi sembra una soluzione "bella" ed efficiente.

>ma stavo però
>vedendo una ocsa che prima di ora nn avevo pensato, potrei per
>rendere il codice + leggibile (qui chiedo il tuo giudizio) creare
>delle funzioni dove dentro eseguo il codice della stored
Occhio che le UDF hanno molte limitazioni in più rispetto alle SP, pertanto verifica se il codice può essere eseguito in una UDF.

>e poi
>creare una semplice stored in cui richiamo la funzione...
A che pro?

>in questa
>stored gestisco i vari filtri e parametri che passo attraverso
>vb..
Cosa intendi con "gestisco i vari filtri e parametri"?

Se nn erro è vero che creo una funzione in più ma è anche
>vero che rendo il codice più leggibile o sbaglio?
Boh.

>e cmq perderei
>velocità e stabilità se dovessi adottare questo sistema?
No.

>ciao e grazie infinitamente
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

Quindi se non erro mi consigli sempre di scrivere una sp e al suo interno gestire i parametri che gli passo da vb...è la soluzione migliore alla fine
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Quindi se non erro mi consigli sempre di scrivere una sp e al
>suo interno gestire i parametri che gli passo da vb
Dove ho scritto questo?!

>...è la soluzione migliore alla fine
Assolutamente no.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

Scusa e te cosa faresti nel caso in cui ti trovi di fronte alla situazione in cui devi gestire non 1 o 2 parametri ma bensì a volte anche + di 4 in una stored?
Io ho sempre scritto le stored per gestire le query sql e le richiamavo da vb passandogli i vari parametri...

C'è di meglio?

dammi un cosiglio :)

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Scusa e te cosa faresti nel caso in cui ti trovi di fronte alla
>situazione in cui devi gestire non 1 o 2 parametri ma bensì a
>volte anche + di 4 in una stored?

Dipende, o ti scrivi n store e lato client decidi quale richiamare oppure ti affidi a soluzioni come quelle proposte da Itzik e Marcello.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

Aspetta stai dicendo che le soluzioni potrebbero:

la prima è che in sql server scrivo tante stored in base alla mie esigenze e le richiamo a seconda di quelle che mi servono da vb (ma così però mi andrei a ritrovare sotto l'apposita cartella di sql tantissime stored)
la seconda è che creo 1 stored e gestisco bene la where come mi hai fatto vedere te e marcello, al massimo potrei creare 2 o 3 stored distinte, al loro interno gestire bene la where e, richiamarle poi da vb...

o sbaglio?

scusami se ti pongo queste domande ma ho letto diversi libri di sql ma i dubbi mi vengono sempre, voglio sempre avere il miglior codice possibile per avere ottimi risultati e prestazioni...

:)

grazie mille
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Aspetta stai dicendo che le soluzioni potrebbero:
>
>la prima è che in sql server scrivo tante stored in base alla
>mie esigenze e le richiamo a seconda di quelle che mi servono
>da vb (ma così però mi andrei a ritrovare sotto l'apposita cartella
>di sql tantissime stored)
E quindi?

>la seconda è che creo 1 stored e gestisco bene la where come
>mi hai fatto vedere te e marcello, al massimo potrei creare 2
>o 3 stored distinte, al loro interno gestire bene la where e,
>richiamarle poi da vb...
>
>o sbaglio?
Se con "gestire bene" ti riferisci alle 2 soluzioni proposte, allora va bene.

>scusami se ti pongo queste domande ma ho letto diversi libri
>di sql ma i dubbi mi vengono sempre, voglio sempre avere il miglior
>codice possibile per avere ottimi risultati e prestazioni...
Allora sei sul forum giusto

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

>>Aspetta stai dicendo che le soluzioni potrebbero:
>>
>>la prima è che in sql server scrivo tante stored in base alla
>>mie esigenze e le richiamo a seconda di quelle che mi servono
>>da vb (ma così però mi andrei a ritrovare sotto l'apposita cartella
>>di sql tantissime stored)
>E quindi?

giustamente te dici qual'è il problema ad avere tantissime stored sotto sql l'importante è fare la cosa giusta, mi per caso c'è la possibilità di creare sotto la cartella stored procedure in sql management una sottocartella nella quale vi salvo le stored in base alla loro natura, ossia esempio una cartella stampa dove all'interno trovo le stored che mi servono per creare le stamep in mdo tale che diventa tutto + leggibile ed ordinato.

>>la seconda è che creo 1 stored e gestisco bene la where come
>>mi hai fatto vedere te e marcello, al massimo potrei creare 2
>>o 3 stored distinte, al loro interno gestire bene la where e,
>>richiamarle poi da vb...
>>
>>o sbaglio?
>Se con "gestire bene" ti riferisci alle 2 soluzioni proposte,
>allora va bene.
>
>>scusami se ti pongo queste domande ma ho letto diversi libri
>>di sql ma i dubbi mi vengono sempre, voglio sempre avere il miglior
>>codice possibile per avere ottimi risultati e prestazioni...
>Allora sei sul forum giusto

GRANDEEEEE!!!!! :)



ah quando ti parlavo di un'unica stored e all'interno diversi parametri mi riferivo ad una cosa dele genere per esempio:

CREATE PROCEDURE [dbo].[GetAlb_5_new] ( @NomeStruttura Varchar(250)=Null, @TypeSearch Int, @codcomune Int=0 ) AS If @TypeSearch=0 BEGIN SELECT IsNull(alb.codalb,'0') As codalb, IsNull(alb.descrizione,'NESSUNA STRUTTURA') As Nome_Struttura, alb.Citta, alb.codcomune, IsNull(dep.coddep,'0')as coddep, IsNull(dep.descrizione,'')as descrizione_dep, IsNull(dep.citta,'')as Citta_dep, IsNull(dep.codcomune,'0')as codcomune FROM dbo.albergo as alb full join dbo.dependance as dep on alb.coddependance=dep.coddep and alb.codcomune=dep.codcomune Order By alb.CodComune,alb.Codcategoria,alb.Descrizione END If @TypeSearch=1 BEGIN SELECT IsNull(alb.codalb,'0') As codalb, IsNull(alb.descrizione,'NESSUNA STRUTTURA') As Nome_Struttura, alb.Citta, alb.codcomune, IsNull(dep.coddep,'0')as coddep, IsNull(dep.descrizione,'')as descrizione_dep, IsNull(dep.citta,'')as Citta_dep, IsNull(dep.codcomune,'0')as codcomune FROM dbo.albergo as alb full join dbo.dependance as dep on alb.coddependance=dep.coddep and alb.codcomune=dep.codcomune Where alb.Descrizione like '%' + @NomeStruttura + '%' Order By alb.codcomune,alb.Codcategoria,alb.Descrizione END END

ossia in base al parametro che passo da vb alla fine all'interno della stored stabilisco se eseguire una parte di codice oppure l'altro...

Questo metodo è errato? secondo quello detto nei post precedenti dovrei scrivere 2 stored oppure gestire 1 sola stored ma migliore la sintassi della Where...
Ma secondo te utilizzare le If come ho fatto in questo esempio è errato da un punto di vista di prestazioni?

ciao

>
>Ciao!
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>http://blogs.dotnethell.it/lorenzo/
>http://italy.mvps.org

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5