Sql 存储过程忽略空值并仅获取输入参数的结果
我正在创建一个存储过程来搜索表。我有许多不同的搜索列,所有这些都是可选的。有没有办法创建一个存储过程来处理这个问题?假设我有一个表,有四列ID,N1,N2和N3。我可以这样做: 表: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'), (
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
保留为空,您将得到未过滤的结果?