CREATE PROC p_MakeRequest 
@roomid char(20),
@week char(7),
@dayofweek char(7),
@period char(10),
@submittime varchar(50),
@person char(20),
@phone char(20),
@reason varchar(50),
@priority int 
AS
declare @cnt intBEGIN
select @cnt=count(1)--看看有没有高优先级的申请
from RoomRequest 
where R_ID=@roomid 
and R_OccupyWeek=@week
and R_OccupyDayofWeek=@dayofweek
and R_OccupyPeriod=@period 
and R_Priority>=@priorityif(@cnt>0)--有,则返回
return -1 --sqlserver默认自动返回0。
else--没有删除低优先级的,并插入新的申请
BEGIN
delete RoomRequest 
where R_ID=@roomid 
and R_OccupyWeek=@week
and R_OccupyDayofWeek=@dayofweek
and R_OccupyPeriod=@period 
--and R_Priority<@priority insert into RoomRequest 
values (@roomid,@week,@dayofweek,@period,
     @submittime,@person,@phone,
@reason,@priority)
return 1
END
END
GO
程序执行老是返回0.但是相应的操作都进行了。
不知道为什么?

解决方案 »

  1.   

    存储过程的返回值通过output参数来取
      

  2.   

    --参考一下这个:
    declare @num int
    select @num=1
    declare @bian1 varchar(12) 
    select @bian1='sss'
    --这个@num才是返回值。
    exec @num=cccc 'rrr',@bian1 output
    select @num as num , @bian1 as bian1
      

  3.   

    set @return=exec p_MakeRequest 'k','k',@return output
    类似这种
      

  4.   

    create proc t_pro @in int,@out int output
    as
     if(@in>0) 
       set @out=1
     else
      set @out=-1godeclare @out int
    exec t_pro -3,@out output
    select @out/**
                
    ----------- 
    -1(所影响的行数为 1 行)
    **/
      

  5.   

    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GOALTER  procedure p_Test @Value varchar(20)='1',@rt varchar(4) output 
    as 
     if @value=1 set @rt='对'
     else set @rt='错'
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
    DECLARE @Value varchar(20) 
    EXEC [a].[dbo].[p_Test] '1', @Value output
    print @value
      

  6.   

    output 是output,return是return,两码事。
      

  7.   

    declare @cnt int 
    --add 
    set @cnt=0
    --************************
    BEGIN 
    select @cnt=count(1)--看看有没有高优先级的申请 
    from RoomRequest 
    where R_ID=@roomid 
    and R_OccupyWeek=@week 
    and R_OccupyDayofWeek=@dayofweek 
    and R_OccupyPeriod=@period 
    and R_Priority>=@priority 
    --add
    print @cnt
      

  8.   

    那为什么下面的存储过程就可以返回不同的值?
    CREATE PROC p_Login
    @name    char(20),
    @passwd  char(20)
    AS
    DECLARE @t_pwd char(20)
    BEGIN
    SELECT @t_pwd=U_Password 
    FROM Login 
    WHERE U_Name=@name
    IF @passwd = @t_pwd
       return  1
    ELSE
       return  0
    END
    GO
      

  9.   

    return 一定要用变量返回吗?
    否则程序里不能获得?
      

  10.   

    那是不是我就错在直接用if判断@cnt了?还是?
    您写的代码我试了,可以正确的获取@cnt
      

  11.   

    应该没问题,这样试试。
    BEGIN 
    --add
    set nocount on 
    select @cnt=count(1)--看看有没有高优先级的申请 
      

  12.   

    感谢您的耐心指导,我改用output传值就没这个问题了!