首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

====== 关于多"查询参数"存储过程 ======,该怎么处理

2012-03-24 
关于多查询参数存储过程 关于多 查询参数 存储过程比如有一学生表学号姓名年龄年级-----

====== 关于多"查询参数"存储过程 ======
关于多 "查询参数 "存储过程

比如有一学生表

学号         姓名         年龄         年级
---------------------------------
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(@年级,年级)=年级

热点排行