我正在创建一个存储过程来通过表进行搜索。我有许多不同的搜索列,所有这些都是可选的。有没有一种方法可以创建存储过程来处理呢?假设我有一个包含四个列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在2行中包含A,所以输出应为2,但上面的查询提供了7。如果未指定参数,则需要忽略该参数并传递休息一下。
答案 0 :(得分:1)
我认为您需要AND
每个单独的输入条件,例如
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+'%')
请注意别名,这是避免在整个查询中重复长表名的最佳实践方法。
答案 1 :(得分:0)
尝试从存储过程查询中删除以下条件:
buttonClicked() {
return alert("clicked")
}
@n12 IS NULL
@n22 IS NULL
由于上述条件在返回调用过程时始终为true。
修改后的存储过程代码:
@n32 IS NULL
现在执行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
时,输出将是2而不是7
答案 2 :(得分:0)
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
变量都将被忽略。