2013-07-25 52 views
12

我有一個存儲過程,它根據4個參數從表中提取信息。如果參數爲空,SQL將忽略WHERE部分

我想獲取基於參數的值,但如果參數爲NULL,則不檢查該參數。所以如果所有4個參數都是空的,我會顯示整個表格。

這是我的SP(你可以看到,1個參數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 

是否有某種方式來做到這一點沒有有每一個可能的組合IF(15倍的IF )?

+1

Erland Sommarskog的[T-SQL中的動態搜索條件](http://www.sommarskog.se/dyn-search.html)將是通常的起始位置。 –

+0

可能的重複[存儲過程與可選的「WHERE」參數](http://stackoverflow.com/questions/697671/stored-procedure-with-optional-where-parameters) – GSerg

回答

21

如何在這種特殊情況下類似

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

,你可以也用

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

但一般而言,您可以嘗試像

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

請注意。 'IS NULL'導致完整的掃描表訪問。 –

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 

這應該幫助

問候

Ashutosh說阿里亞

1

如果你的意思@參數1是COL1參數,@ param2的是COL2參數,...等等 你可以試試這個:

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

你可以在SQL服務器中使用使用COALESCE()函數。您的陳述中不需要使用IF- ElseCASE。這裏是你如何使用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) 

SQL中的COALESCE函數返回其參數中的第一個非NULL表達式。例如,如果@param1等於null,則函數將返回col1,這將導致where語句中的col1 = col1與1 = 1相同,這意味着條件將始終爲真。