Member 12336474 Ответов: 2

Игнорировать параметры, которые являются нулевыми


Я пытаюсь запустить сохраненный proc из веб-приложения. У меня есть несколько параметров с условием или, но я хочу, чтобы параметры, оставленные пользователем пустыми, игнорировались при выполнении запроса.

Что я уже пробовал:

Вот что я пытаюсь сделать

ALTER Proc [dbo].[spStatusReport]
@CUST_NAME varchar(20),
@CUST_CODE   varchar(10) = NULL 
as 
SELECT  CUST_CODE, DEPT_CODE,EMPLOYEE_CODE, EST_SCRAP, EXCH_RATE,
F_G_, LINE4, LOCATION
FROM Status_Report 
WHERE 
((@CUST_NAME IS NULL OR [LOCATION] LIKE '%' + @CUST_NAME + '%') OR
(@CUST_CODE IS NULL OR [CUST_CODE] LIKE '%' + @CUST_CODE + '%'))


Но когда я бегу
EXEC spStatusReport 'ABC',''


Я получаю все, а не только расположение ABC

2 Ответов

Рейтинг:
2

#realJSOP

Наблюдения:

0) зачем вообще указывать значение по умолчанию null, если код в хранимой процедуре ее обрабатывает?

2) указание пустой строки для 2-го параметра-это не то же самое, что указание NULL.

Попробуйте изменить его на следующий:

EXEC spStatusRepport @CUST_NAME='ABC', @CUST_CODE=NULL


Рейтинг:
0

Richard Deeming

Взгляните еще раз на свой WHERE пункт:

    (@CUST_NAME IS NULL OR [LOCATION] LIKE '%' + @CUST_NAME + '%')
OR
    (@CUST_CODE IS NULL OR [CUST_CODE] LIKE '%' + @CUST_CODE + '%')

Вы использовали OR чтобы объединить фильтры для обоих параметров. Поэтому, если любой параметр есть NULL, то все записи будут возвращены.

Я подозреваю, что вы собираетесь использовать And вместо:
    (@CUST_NAME IS NULL OR [LOCATION] LIKE '%' + @CUST_NAME + '%')
AND
    (@CUST_CODE IS NULL OR [CUST_CODE] LIKE '%' + @CUST_CODE + '%')


Вы также должны оценить разницу между NULL и пустая строка. В вашем примере вы передаете пустую строку, так что @CUST_CODE IS NULL это будет ложь. В результате любые строки, где CUST_CODE является NULL будут исключены из ваших результатов, так как они не пройдут LIKE '%%' тест.

Поэтому я подозреваю, что вам нужно:
    (@CUST_NAME IS NULL OR @CUST_NAME = '' OR [LOCATION] LIKE '%' + @CUST_NAME + '%')
AND
    (@CUST_CODE IS NULL OR @CUST_CODE = '' OR [CUST_CODE] LIKE '%' + @CUST_CODE + '%')