在存储过程中构建动态WHERE子句

问题描述

尝试以下方法

WHERE 1 = 1
AND (@what     IS NULL OR [companies_SimpleList].[Description] Like @What )
AND (@keywords IS NULL OR companies_SimpleList.Keywords        Like @Keywords)
AND (@where    IS NULL OR companies_SimpleList.FullAdress      Like @Where)
...

如果任何参数的@what@where被发送到存储过程NULL值,那么所述条件将被忽略。您可以使用0而不是null作为测试值,这将类似于@what = 0 OR ...

解决方法

我正在使用SQL Server 2008
Express,并且具有一个存储过程,该存储过程SELECT基于参数执行from表。我有nvarchar参数和int参数。

这是我的问题,我的where子句如下所示:

WHERE [companies_SimpleList].[Description] Like @What 
    AND companies_SimpleList.Keywords Like @Keywords
    AND companies_SimpleList.FullAdress Like @Where
    AND companies_SimpleList.ActivityId = @ActivityId
    AND companies_SimpleList.DepartementId = @DepartementId
    AND companies_SimpleList.CityId = @CityId

此参数是我的ASP.NET MVC
3应用程序的用户设置的筛选器值,并且int可能未设置参数,因此它们的值将为0。这是我的问题,存储过程将搜索具有0asCityId值的项例如,为此,它将返回错误的结果。因此,基于int参数的值是否大于0,能够有一个动态的where子句会很好。

提前致谢