具有 2 个 Like 参数的存储过程

Stored procedure with 2 Like parameters

我希望通过用户将部件名称输入到 txtPartName 中或将 MRPID 输入到 txtMRPID 中来使用存储过程来过滤我的数据网格视图。然而,这并没有像预期的那样进行过滤,只是显示 table 部分的所有结果。

我觉得这是由于我实现 AND 的方式所致,或者我可能无法在一个过程中执行 2 个 LIKE 语句?无论如何,有人可以指出正确的方向,告诉我如何正确执行此过程。

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

基本上你需要在 OR 条件周围加上括号:

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

为什么需要它是因为 ANDOR 具有更高的逻辑优先级。因此,如果没有括号,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 + '%'