create proc mzfj_fpsearch          --查找病人发票号4个CHECKBOX,3个RADIOBOTTONS  2002/12/10 CCEO 
@flag int,
@flags int,
@ks varchar(20),
@fpxh varchar(20),
@time0 datetime,
@time1 datetime
as
if @flag =0
begin
 select select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb where ks=@ks
 return
end
if @flag =1
begin
 select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb where fpxh=@fpxh
 return
end
if @flag =2
begin
  if @flags=0
   begin 
        select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb  where yxbz='1'
        return
   end
  if @flags=2
   begin 
         select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb  where fpcdbz='1' 
        return
   end
  if @flags=3
   begin 
         select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb  where yxbz='0'
        return
   end
end
if @flag =3
begin
   select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb where dyrq between @time0 and @time1    
   return
endgo

解决方案 »

  1.   

    把CASE改成IF ...ELSE IF ....

    把CASE放到WHERE后面试试。
      

  2.   

    更正:create proc mzfj_fpsearch          --查找病人发票号4个CHECKBOX,3个RADIOBOTTONS  2002/12/10 CCEO 
    @flag int,
    @flags int,
    @ks varchar(20),
    @fpxh varchar(20),
    @time0 datetime,
    @time1 datetime
    as
    if @flag =0
    begin
     select select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb where ks=@ks
     return
    end
    if @flag =1
    begin
     select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb where fpxh=@fpxh
     return
    end
    if @flag =2
    begin
      if @flags=0
       begin 
            select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb  where yxbz='1'
            return
       end
      if @flags=1
       begin 
             select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb  where fpcdbz='1' 
            return
       end
      if @flags=2
       begin 
             select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb  where yxbz='0'
            return
       end
    end
    if @flag =3
    begin
       select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb where dyrq between @time0 and @time1    
       return
    endgo
      

  3.   

    case when else end 只能返回一个值,不能返回数据集,您的只能用这种结构来换了。要不写动态语句改条件。
    if 
    begin              
    。              
    end              
    else              
    begin
    ......
    end
      

  4.   

    原来可以这样:create proc mzfj_fpsearch          --查找病人发票号4个CHECKBOX,3个RADIOBOTTONS  2002/12/10 CCEO 
    @flag int,
    @flags int,
    @ks varchar(20),
    @fpxh varchar(20),
    @time0 datetime,
    @time1 datetime
    as
     select select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb where (@flag =0 and ks=@ks) 
    or (@flag =1 and fpxh=@fpxh)
    or (@flag =2 and @flags=0 and yxbz='1')
    or (@flag =2 and @flags=1 and fpcdbz='1')
    or (@flag =2 and @flags=2 and yxbz='0')
    or (@flag =3 and dyrq between @time0 and @time1)go
      

  5.   

    case 不是这样用的,不能控制语句执行
    你的情况可以写成下面逻辑表达式的形式,
    结果是对是错你执行看看!create proc mzfj_fpsearch          --查找病人发票号4个CHECKBOX,3个RADIOBOTTONS  2002/12/10 WOLF              
    @flag int,
    @flags int,
    @ks varchar(20),
    @fpxh varchar(20),
    @time0 datetime,
    @time1 datetime
    asselect fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb 
    where ((ks=@ks and @flag=0) or @flag<>0) 
    and ((fpxh=@fpxh and @flag=1) or @flag<>1) 
    and ((yxbz='1' and @flag=2 and @flags=0) or (@flag<>2 and @flags<>0))
    and ((fpcdbz='1' and @flag=2 and @flags=1) or (@flag<>2 and @flags<>1))
    and ((yxbz='0' and @flag=2 and @flags=2) or (@flag<>2 and @flags<>2))
    and ((dyrq between @time0 and @time1 and @flag=3) or @flag<>3) 
      

  6.   

    zxdragon(zxdragon) 
       你的逻辑表达让我看了半天,如果一定要这么表达,应该是:select fpxh as 发票号,brxm as 姓名,dyrq as 结算时间,yxbz as 有效标志,fpcdbz as 重打标志,ssje as 金额 from his_mzfpb 
    where ((ks=@ks and @flag=0) or @flag<>0) 
    and ((fpxh=@fpxh and @flag=1) or @flag<>1) 
    and ((yxbz='1' and @flag=2 and @flags=0) or (@flag<>2 or @flags<>0))
    and ((fpcdbz='1' and @flag=2 and @flags=1) or (@flag<>2 or @flags<>1))
    and ((yxbz='0' and @flag=2 and @flags=2) or (@flag<>2 or @flags<>2))
    and ((dyrq between @time0 and @time1 and @flag=3) or @flag<>3) 
      

  7.   

    CCEO()  呵呵,虽然你的表达式比我简单明了,可是你对我的答案修正却是错的。
    如果这样写 @flag<>2 or @flags<>0
    @flag=2 时,@flag<>2都为true,三个条件都失效了,区分不了@flags值
      

  8.   

    不会吧,你再仔细看看!
    中间是or 怎么会“三个条件都失效了”,用and才会的“两个条件都失效”反正:
    not (@flag=2 and @flags=0) == not(@flag=2) or not (@flags=0) ==(@flag<>2) or (@flags<>0)
      

  9.   

    一个例子:
    @flag=0 
    @flags=0
    ((yxbz='1' and @flag=2 and @flags=0) or (@flag<>2 and @flags<>0))=false
    ((yxbz='1' and @flag=2 and @flags=0) or (@flag<>2 or @flags<>0))=true
      

  10.   

    我的逻辑表达式在@flag=0 @flags=0 情况下结果是错误的,这点没错。可能是我理解错了,我认为他在调用这个SP时,在@flag=0时,不需要输入@flags,所以@flags值为NULL,这样就不可能出现@flag=0 @flags=0
    的情况。但是如果按照你的修改,注意在@flag=2 @flags=?的情况下,
    (@flag<>2 or @flags<>0)) = true 推出
    (********** or (@flag<>2 or @flags<>?))成为永真式!
    是不是三个筛选条件都不起作用了!
    不过我应该考虑到你说的这种情况,将表达式在写的严密一点的。
    谢谢,:)
      

  11.   

    对不起,上面写错了,应该为
    “但是如果按照你的修改,注意在@flag<>2 @flags=?的情况下,”