20

我正在使用 SQL Server 2008 Express,并且我有一个SELECT基于参数执行来自表的存储过程。我有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 子句,那就太好了。

提前致谢

4

3 回答 3

46

试试这个:

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 ...

于 2012-07-09T14:22:58.477 回答
4

尝试类似的东西

AND companies_SimpleList.CityId = @CityId or @CityID = 0
于 2012-07-09T14:21:30.943 回答
0

这是 SQL Server >=2008 的另一个易于阅读的解决方案

CREATE PROCEDURE FindEmployee
    @Id INT = NULL,
    @SecondName NVARCHAR(MAX) = NULL
AS 
    SELECT  Employees.Id AS "Id",
            Employees.FirstName AS "FirstName",
            Employees.SecondName AS "SecondName"
    FROM Employees
    WHERE Employees.Id = COALESCE(@Id, Employees.Id)
    AND Employees.SecondName LIKE COALESCE(@SecondName, Employees.SecondName) + '%'
于 2014-08-24T16:07:17.990 回答