====== 关于多"查询参数"存储过程 ======
关于多 "查询参数 "存储过程
比如有一学生表
学号 姓名 年龄 年级
---------------------------------
001 张三 12 5
002 李四 13 6
现在想写一存储过程用于获得学生信息
该存储过程有 @学号,@姓名,@年龄,@年级 4个参数
如参数值不为空就进行匹配
比如: @学号=NULL,@姓名=李四,@年龄=13,@年级=6
就用相当于(SELECT * FROM 学生表 WHERE 姓名=李四 AND ,年龄=13 AND 年级=6)
像这样的存储过程该怎么写?
(不要用动态组合SQL语句的方法.比如:EXEC @SQL)
------解决方案----------------------除了用动态SQL外,还有多种方法:
如:用if else 判断
或用如下SQL,但效率不高:
SELECT *
FROM 学生表
WHERE (@学号 is null or 学号= @学号) AND
(@姓名 is null or 姓名= @姓名) AND
(@年龄 is null or 年龄= @年龄) AND
(@年级 is null or 年级= @年级)
------解决方案--------------------create proc testsp
(
@学号 varchar(10),
@姓名 nvarchar(50),
@年龄 int,
@年级 int
)
as
set nocount on
select *
from 学生表
where @学号=(case when isnull(@学号, ' ')= ' ' then ' ' else 学号 end)
and @姓名=(case when isnull(@姓名, ' ')= ' ' then ' ' else 姓名 end)
and @年龄=(case when isnull(@年龄,0)= ' ' then 0 else 年龄 end)
and @年级=(case when isnull(@年级,0)= ' ' then 0 else 年级 end)
return
)
------解决方案--------------------修改一下
create proc testsp
(
@学号 varchar(10),
@姓名 nvarchar(50),
@年龄 int,
@年级 int
)
as
set nocount on
select *
from 学生表
where @学号=(case when isnull(@学号, ' ')= ' ' then ' ' else 学号 end)
and @姓名=(case when isnull(@姓名, ' ')= ' ' then ' ' else 姓名 end)
and @年龄=(case when isnull(@年龄,0)=0 then 0 else 年龄 end)
and @年级=(case when isnull(@年级,0)=0 then 0 else 年级 end)
return
------解决方案--------------------select *
from 学生表
where isnull(@学号,学号)=学号
and isnull(@姓名,姓名)=姓名
and isnull(@年龄,年龄)=年龄
and isnull(@年级,年级)=年级