sql—具有两个类似参数的存储过程

q3aa0525  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(443)

我希望使用一个存储过程来过滤我的datagridview,用户可以在txtpartname中输入部件名,也可以在txtmrpid中输入mrpid。但是,这并不像预期的那样进行过滤,只显示零件表中的所有结果。
我有一种感觉,这是由于我实现的方式,或者我不能在一个过程中执行两个类似的语句?不管怎样,有人能给我指出正确的方向,如何正确地执行这个程序。

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
2jcobegt

2jcobegt1#

基本上你需要在 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 + '%'

相关问题