Хранимая процедура с двумя параметрами Like - PullRequest
0 голосов
/ 05 августа 2020

Я хочу использовать хранимую процедуру для фильтрации моего datagridview путем ввода пользователем имени части в txtPartName или MRPID в txtMRPID. Однако это не фильтрация, как ожидалось, а просто показывает все результаты из таблицы частей независимо от. утверждения в одной процедуре возможно? В любом случае может кто-нибудь указать мне в правильном направлении, как правильно выполнить эту процедуру.

CREATE PROCEDURE Parts_ViewAllOrSearch
    @PartNameSearch nvarchar(255),
    @MRPIDSearch nvarchar(255)
AS
BEGIN
    SELECT *
    FROM Parts
    WHERE @PartNameSearch = ''
       OR PartName LIKE '%' + @PartNameSearch + '%'
      AND @MRPIDSearch = ''
       OR MRP_ID LIKE '%' + @MRPIDSearch + '%'
END

1 Ответ

3 голосов
/ 05 августа 2020

Обычно вам нужны круглые скобки вокруг условия OR:

SELECT *
FROM Parts
WHERE 
    (@PartNameSearch = ''  OR  PartName LIKE '%' + @PartNameSearch + '%')
    AND (@MRPIDSearch = '' OR MRP_ID LIKE '%' + @MRPIDSearch + '%')

Почему вам это нужно, потому что AND имеет более высокий логический приоритет, чем OR. Таким образом, без круглых скобок предложение WHERE эквивалентно:

WHERE 
    @PartNameSearch = ''  
    OR (PartName LIKE '%' + @PartNameSearch + '%' AND @MRPIDSearch = '')
    OR MRP_ID LIKE '%' + @MRPIDSearch + '%'

... что явно не то, что вам нужно.

Наконец, обратите внимание, что в его нынешнем виде ваш код просто не похож на эти OR выражений. Если параметр является пустой строкой, то, будучи окруженным подстановочными знаками, он будет соответствовать всем возможным значениям (кроме null значений). Вы могли бы просто написать это как:

WHERE 
    PartName LIKE '%' + @PartNameSearch + '%'
    AND MRP_ID LIKE '%' + @MRPIDSearch + '%'
...