2013-07-10 52 views
2

我想創建一個存儲過程,它將基於輸入返回記錄。如果所有的輸入參數爲null,則返回整個表,否則使用的參數和返回的記錄:建立where子句基於空/非空參數在sql

create procedure getRecords @parm1 varchar(10) = null, @parm2 varchar(10) = null, @parm3 varchar(10) = null 
as 
declare @whereClause varchar(500) 
set @whereClause = ' where 1 = 1 ' 

if (@parm1 is null and @parm2 is null and @parm3 is null) 
    select * from dummyTable 
else 
    begin 
     if (@parm1 is not null) 
     set @whereClause += 'and parm1 = ' + '' + @parm1 + '' 
     if (@parm2 is not null) 
     set @whereClause += 'and parm2 = ' + '' + @parm2 + '' 
     if (@parm3 is not null) 
     set @whereClause += 'and parm3 = ' + '' + @parm3 + '' 

     select * from dummyTable @whereClause <-- Error 
    end 

錯誤而創造這個過程是「在上下文中指定的非布爾類型的表達式,其中一個條件「

請評論如果我的方法是錯誤的建立where子句?

由於

+0

爲什麼你會想到'SELECT * FROM dummyTable 'WHERE 1 = 1''是在所有同查詢'SELECT * FROM dummyTable其中1 = 1'?一個人在最後做了什麼?你會期望'SELECT'* FROM dummyTable''做什麼不同於'SELECT'Hello World''嗎? – MatBailie

+0

請指定您的引擎。 – Sebas

回答

5

整個查詢應該是在一個varchar,並且可以使用「EXEC」的功能被執行。

SET @query = "SELECT * FROM dummyTable WHERE 1=1 " 

... your IF clauses ... 

EXEC(@query) 

HTH。

0

嘗試這樣的事:

create procedure getRecords @parm1 varchar(10) = null, @parm2 varchar(10) = null, @parm3 varchar(10) = null 
as 
declare @whereClause varchar(500) 
declare @sql varchar(500) 

set @sql = 'select * from dummyTable ' 
set @whereClause = ' where 1 = 1 ' 

if (@parm1 is null and @parm2 is null and @parm3 is null) 
    set @sql = @sql + @whereClause 
else 
    begin 
set @sql = @sql + @whereClause 
     if (@parm1 is not null) 
     set @sql = @sql + ' and parm1 = ' + '' + @parm1 + '' 
     if (@parm2 is not null) 
     set @sql = @sql + ' and parm2 = ' + '' + @parm2 + '' 
     if (@parm3 is not null) 
     set @sql = @sql + ' and parm3 = ' + '' + @parm3 + '' 
    end 

exec (@sql) 
7
select * from dummyTable 
where (parm1 = @parm1 OR @parm1 IS NULL) 
    and (parm2 = @parm2 OR @parm2 IS NULL) 
    and (parm3 = @parm3 OR @parm3 IS NULL) 
    ; 
+0

謝謝,我正在尋找。 – VivekDev

+0

我可以使用(@ param1爲null或param1 = @ param1)嗎? –