日期:2014-05-18  浏览次数:20401 次

存储过程默认参数问题
创建一个存储过程,实现获取指定学号的所有课程成绩,输出为:学号、姓名、课程名、成绩,如果不指定学号,则输出所有学生的上述几个字段信息。
SQL code

create procedure query(@xh char(6)=xh)
as
if not exists(select * from xsb where xh=@xh)
print '学号不存在'
else
begin
select * from(select xsb.xh,xm,kcm,cj from xsb join cjb join kcb
on cjb.kch=kcb.kch
on xsb.xh=pcjb.xh)
as temp(xh,xm,kcm,cj) where xh=@xh
end


execute query '081102'



xsb表字段:xh char(6),xm char(8),xb bit,cssj datetime
kcb表字段:kch char(3),kcm char(20)
cjb表字段:xh char(6),kch char(3),cj int


问题:当不输入参数时,居然输出了"学号不存在"的提示,于是我猜想可能是@xh为null,于是更成判断@xh是否为null,可是结果显示表明在不带参数时@xh不是null啊!这个让我很困惑啊!各位大仙帮帮我啊!

------解决方案--------------------
SQL code

--默认*为全部
create procedure query(@xh char(6) = '*')
as
if isnull(@xh,'*') = '*'
begin
    select xsb.xh,xsb.xm,kcb.kcm,cjb.cj 
    from xsb,cjb,kcb
    where cjb.kch = kcb.kch
    and xsb.xh = cjb.xh
end
else
begin
    select xsb.xh,xsb.xm,kcb.kcm,cjb.cj 
    from xsb,cjb,kcb
    where cjb.kch = kcb.kch
    and xsb.xh = cjb.xh
    and xsb.xh = @xh
end