2013-07-25 3 views
12

Ho una stored procedure che recupera informazioni da una tabella in base a 4 parametri.SQL ignora parte del WHERE se il parametro è nullo

Voglio ottenere valori basati sui parametri, ma se un parametro è NULL, quel parametro non viene controllato. Quindi se tutti e 4 i parametri sono nulli mostrerei l'intera tabella.

Questo è il mio SP (come si può vedere, questo funziona solo per 1 parametro atm):

CREATE PROCEDURE myProcedure 
    @Param1 nvarchar(50), 
    @Param2 nvarchar(50), 
    @Param3 nvarchar(50), 
    @Param4 nvarchar(50) 
AS 
BEGIN 
    IF(@Param1 IS NULL) 
     BEGIN 
      SELECT Id, col1, col2, col3, col4 FROM myTable 
     END 
    ELSE 
     BEGIN 
      SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%' 
     END 
END 

C'è qualche modo per fare questo senza avere una IF per ogni possibile combinazione (15 FI)?

+1

Le condizioni di ricerca dinamica in T-SQL di Erland Sommarskog (http://www.sommarskog.se/dyn-search.html) sarebbero il solito punto di partenza. –

+0

possibile duplicato di [Stored procedure con parametri "WHERE" facoltativi] (http://stackoverflow.com/questions/697671/stored-procedure-with-optional-where-parameters) – GSerg

risposta

21

ne dite qualcosa come

SELECT Id, col1, col2, col3, col4 
FROM myTable 
WHERE col1 LIKE @Param1+'%' 
OR  @Param1 IS NULL 

in questo caso specifico si potrebbe avere utilizzato anche

SELECT Id, col1, col2, col3, col4 
FROM myTable 
WHERE col1 LIKE ISNULL(@Param1,'')+'%' 

Ma in generale si può provare qualcosa di simile

SELECT Id, col1, col2, col3, col4 
FROM myTable 
WHERE (condition1 OR @Param1 IS NULL) 
AND  (condition2 OR @Param2 IS NULL) 
AND  (condition3 OR @Param3 IS NULL) 
... 
AND  (conditionN OR @ParamN IS NULL) 
+3

Attenzione. 'IS NULL' porta a un accesso completo alla tabella di scansione. –

2
CREATE PROCEDURE myProcedure 
    @Param1 nvarchar(50), 
    @Param2 nvarchar(50), 
    @Param3 nvarchar(50), 
    @Param4 nvarchar(50) 
AS 
BEGIN 
    IF(@Param1 IS NULL) 
     BEGIN 
      SELECT Id, col1, col2, col3, col4 FROM myTable 
     END 
    ELSE 
     BEGIN 
      SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%' OR @Param1 is Null 
     END 
END 

Questo dovrebbe aiutare

riguarda

Ashutosh Arya

1

Se vuoi dire @ param1 è il parametro per col1, @ param2 è il parametro per col2, ... ecc Si può provare questo:

CREATE PROCEDURE myProcedure 
@Param1 nvarchar(50), 
@Param2 nvarchar(50), 
@Param3 nvarchar(50), 
@Param4 nvarchar(50) 
AS 
BEGIN 
declare @query nvarchar(4000) 
SET @query='SELECT Id, col1, col2, col3, col4 FROM myTable '+ 
    (case when ((@Param1 is null) and (@Param2 is null) and (@Param3 is null) and (@Param4 is null)) 
    then '' 
    else 
     'where '+ 
     (case when @Param1 is not null 
     then ' col1 like '''[email protected]+'%'''+ 
      (case when @param2 is not null then ' AND ' else '' end) 
     else '' end)+ 
     (case when @Param2 is not null 
     then ' col2 like '''[email protected]+'%'''+ 
      (case when @param3 is not null then ' AND ' else '' end) 
     else '' end)+ 
     (case when @Param3 is not null 
     then ' col3 like '''[email protected]+'%'''+ 
      (case when @param4 is not null then ' AND ' else '' end) 
     else '' end)+ 
     (case when @Param4 is not null 
     then ' col4 like '''[email protected]+'%''' 
     else '' end) 
    end) 

exec sp_sqlexec @query 
0

È possibile utilizzare la funzione COALESCE() nel server SQL. Non è necessario utilizzare IF- Else o CASE nelle dichiarazioni. Ecco come utilizzare la funzione COALESCE.

SELECT Id, col1, col2, col3, col4 FROM myTable where col1 = COALESCE(NULLIF(@param1, ''), col1) and col2 = COALESCE(NULLIF(@param2, ''), col2) and col3 = COALESCE(NULLIF(@param3, ''), col3) and col4= 
COALESCE(NULLIF(@param4, ''), col4) 

La funzione COALESCE in SQL restituisce la prima espressione non-NULL tra i suoi argomenti. Qui per esempio se @ param1 è uguale a null la funzione restituirà col1 che porterà a col1 = col1 nell'istruzione where che è come 1 = 1 che significa che la condizione sarà sempre vera.