Создание динамического предложения WHERE в хранимой процедуре

Я использую 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. Это моя проблема, хранимая процедура будет искать для элементов, которые имеют 0 как CityId, например, и для этого он возвращает неверный результат. Так что было бы хорошо, чтобы иметь динамическое предложение where, основанное на том, что значение параметра int больше, чем 0, или нет.

Заранее спасибо

Ответ 1

Попробуйте это вместо:

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 вместо нуля в качестве тестового значения, тогда это будет что-то вроде @what = 0 OR ...

Ответ 2

попробуйте что-то вроде

AND companies_SimpleList.CityId = @CityId or @CityID = 0

Ответ 3

Вот еще одно легко читаемое решение для 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) + '%'