Sql 存储过程忽略空值并仅获取输入参数的结果

Sql 存储过程忽略空值并仅获取输入参数的结果,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我正在创建一个存储过程来搜索表。我有许多不同的搜索列,所有这些都是可选的。有没有办法创建一个存储过程来处理这个问题?假设我有一个表,有四列ID,N1,N2和N3。我可以这样做: 表: INSERT INTO [dbo].[Sample] VALUES ('1', 'A,B,C', 'A,B,C', 'A,B,C'), ('2', 'B,D,N', 'B,D,N', 'B,D,N'), ('3', 'A,N,S', 'A,N,S', 'A,N,S'), (

我正在创建一个存储过程来搜索表。我有许多不同的搜索列,所有这些都是可选的。有没有办法创建一个存储过程来处理这个问题?假设我有一个表,有四列ID,N1,N2和N3。我可以这样做:

表:

INSERT INTO [dbo].[Sample]
VALUES ('1', 'A,B,C', 'A,B,C', 'A,B,C'),
       ('2', 'B,D,N', 'B,D,N', 'B,D,N'),
       ('3', 'A,N,S', 'A,N,S', 'A,N,S'),
       ('4', 'S,F,G', 'S,F,G', 'S,F,G'),
       ('5', 'D,F,K', 'D,F,K', 'D,F,K'),
       ('6', 'S,H,Y', 'S,H,Y', 'S,H,Y'),
       ('7', 'Z,B,C', 'Z,B,C', 'Z,B,C')
存储过程:

CREATE PROCEDURE dbo.Sample2
    @n11 varchar(max) = null,  
    @n12 varchar(max) = null,
    @n21 varchar(max) = null,
    @n22 varchar(max) = null,
    @n31 varchar(max) = null,
    @n32 varchar(max) = null
AS        
BEGIN      
    SELECT COUNT(*) 
    FROM Sample
    WHERE 
        (@n11 IS NULL OR Sample.N1 LIKE '%' + @n11 + '%' 
         OR @n12 IS NULL OR Sample.N1 LIKE '%' + @n12 + '%')
        AND (@n21 IS NULL OR Sample.N2 LIKE '%' + @n21 + '%' 
             OR @n22 IS NULL OR Sample.N2 LIKE '%' + @n22 + '%')
        AND (@n31 IS NULL OR Sample.N3 LIKE '%' + @n31 + '%' 
             OR @n32 IS NULL OR Sample.N3 LIKE '%' + @n32 + '%')
END

如果用户输入@n11作为A,并保留其余部分,因为N1在两行中包含A,所以输出应该是2,但上面的查询提供了7。如果未指定参数,我需要忽略该参数,并将其余参数传递到where条件。

我认为您需要
每个单独的输入条件,例如

SELECT count(*)
FROM [Sample] S
WHERE (@n11 IS NULL OR S.N1 LIKE '%'+@n11+'%')
AND (@n12 IS NULL OR S.N1 LIKE '%'+@n12+'%')
AND (@n21 IS NULL OR S.N2 LIKE '%'+@n21+'%')
AND (@n22 IS NULL OR S.N2 LIKE '%'+@n22+'%')
AND (@n31 IS NULL OR S.N3 LIKE '%'+@n31+'%')
AND (@n32 IS NULL OR S.N3 LIKE '%'+@n32+'%')

请注意别名,这是避免在整个查询中重复长表名的最佳做法。

尝试从存储过程查询中删除下一个条件:

@n12为空

@n22为空

@n32为空

因为在调用过程时发送时,上述条件始终返回true

修改后的存储过程代码:

Alter Procedure dbo.Sample2
  @n11 varchar(max) = null,  
  @n12 varchar(max) = null,
  @n21 varchar(max) = null,
  @n22 varchar(max) = null,
  @n31 varchar(max) = null,
  @n32 varchar(max) = null
AS        
BEGIN      
  select count(*)
  from Sample
  where (@n11 IS NULL OR Sample.N1 LIKE '%'+@n11+'%' OR Sample.N1 LIKE '%'+@n12+'%')
  AND (@n21 IS NULL OR Sample.N2 LIKE '%'+@n21+'%' OR Sample.N2 LIKE '%'+@n22+'%')
  AND (@n31 IS NULL OR Sample.N3 LIKE '%'+@n31+'%' OR Sample.N3 LIKE '%'+@n32+'%')
END
现在,当执行exec dbo.Sample2@n11='A'时,输出将是2而不是7

select
  sum(iif(N1 like '%'+@N11+'%',1,0)  
    + iif(N1 like '%'+@N12+'%',1,0) 
    + iif(N2 like '%'+@N21+'%',1,0) 
    + iif(N2 like '%'+@N22+'%',1,0) 
    + iif(N3 like '%'+@N31+'%',1,0) 
    + iif(N3 like '%'+@N32+'%',1,0) 
  )
from Sample

任何
NULL
变量都将被忽略。

工作正常..谢谢lot@VijayKrishnaReddy您意识到,使用此解决方案,如果在中传递值
@n12
,但将
@n11
保留为空,您将得到未过滤的结果?