Создание динамического предложения 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) + '%'