2013-07-25 9 views
12

Mam procedurę składowaną, która pobiera informacje z tabeli na podstawie 4 parametrów.SQL ignoruje część WHERE, jeśli parametr ma wartość null

Chcę uzyskać wartości na podstawie parametrów, ale jeśli parametr ma wartość NULL, to parametr ten nie jest sprawdzany. Więc jeśli wszystkie 4 parametry mają wartość null, pokażę całą tabelę.

To moja SP (jak widać, to działa tylko dla 1 parametru 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 

Czy jest jakiś sposób, aby to zrobić bez mający IF dla każdej możliwej kombinacji (15 FI)?

+1

Erland Sommarskog [Dynamiczne warunki wyszukiwania w T-SQL] (http://www.sommarskog.se/dyn-search.html) będzie zwykłym miejscem początkowym. –

+0

możliwy duplikat [procedury składowanej z opcjonalnymi parametrami "WHERE"] (http://stackoverflow.com/questions/697671/stored-procedure-with-optional-where-parameters) – GSerg

Odpowiedz

21

Jak o czymś takim

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

w tym konkretnym przypadku można również stosować

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

Ale w ogóle można spróbować czegoś podobnego

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

Uwaga. 'IS NULL' prowadzi do pełnego dostępu do tabeli skanowania. –

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 

ten powinien pomóc

pozdrowienia

Ashutosh Arya

1

Jeśli masz na myśli @ param1 jest parametrem col1 @ param2 jest parametrem col2, ... itd Można spróbować:

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

You można użyć funkcji COALESCE() w serwerze SQL. Nie musisz używać IF- Else lub CASE w swoich wyciągach. Oto, jak można korzystać z funkcji 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) 

COALESCE funkcja SQL zwraca pierwszy niezerowe wyraz wśród swoich argumentów. Tutaj na przykład, jeśli @ param1 jest równe null, funkcja zwróci col1, co doprowadzi do col1 = col1 w instrukcji where, która jest równa 1 = 1, co oznacza, że ​​warunek będzie zawsze prawdziwy.

Powiązane problemy