Salve a tutti,
ho scritto una stored procedure che mi permette di estrarre dati da una tabella.
La sp ammette la possibilità di filtrare su uno o più campi tramite l'uso della funzione COALESCE (che ritorna la prima espressione non null tra quelle passate in argomento).
Posto il codice di una sp di esempio:
codice:
CREATE PROCEDURE [PRF].[Utenti_READ]
@Id int = NULL,
@IdSocieta int = NULL,
@Username varchar(MAX) = NULL,
@Password varchar(MAX) = NULL,
@Nome varchar(MAX) = NULL,
@Cognome varchar(MAX) = NULL
AS BEGIN
SET NOCOUNT ON;
SELECT * FROM PRF.Utenti WHERE 1=1
AND Id = COALESCE(@Id, Id)
AND IdSocieta = COALESCE(@IdSocieta, IdSocieta)
AND Username = COALESCE(@Username, Username)
AND Password = COALESCE(@Password, Password)
AND Nome = COALESCE(@Nome, Nome)
AND Cognome = COALESCE(@Cognome, Cognome)
END
Utilizzata in questo modo la funzione COALESCE mi permette di filtrare su un campo solo se il relativo parametro è diverso da Null.
Se invece il parametro è Null la funzione ritorna il valore della colonna stessa, disabilitando così il filtro.
In questo modo posso chiamare la stored procedure ad esempio passando solo il parametro @Nome ed estraendo così tutti i record con nome ex: "Vattelapesca".
Fin qui tutto benone!
Il problema sorge nel momento in cui ci sono valori Null in tabella.
Se ad esempio ho un record con campo Nome = Null, e chiamo la stored procedure specificando solo il parametro @Id, il risultato della funzione COALESCE per il campo Nome sarà:
codice:
WHERE Nome = NULL
Questo perchè la funzione COALESCE torna Null quando tutti i suoi parametri sono Null (ovviamente) e SqlServer non ammette la sintassi scritta sopra poichè quella corretta sarebbe
codice:
WHERE Nome IS NULL
Dunque i record che presentano valori null per i quali non è stato specificato un valore di ricerca mandano la stored procedure in errore!!
Qualcuno ha idea di come io possa risolvere questo problema?
Posso eventualmente inserire degli IF o dei CASE all'interno della query in modo da valutare la COALESCE e cambiare l'operatore di confronto se questa torna un Null?
Se si qualcuno può farmi un esempio di sintassi perchè io ci ho già provato ma senza successo.
Tenete presente che voglio evitare di creare la query dinamicamente dentro ad una stringa ogni volta perchè il programma che sto scrivendo ha delle criticità a livello di performance e quindi devo spingere al massimo da questo punto di vista.
Vi ringrazio tutti!
citrus