CREATE  PROCEDURE ADDSTUDENT

    @姓名 VARCHAR(50),  
    @性别 VARCHAR(50),
    @专业 VARCHAR(50),
    @出生年月 DATETIME,  
    @课程名 VARCHAR(50),
    @所属专业 VARCHAR(50),
    @学分 INT,
    @Result INT OUTPUT
)
ASBEGINSET @Result =0DECLARE @学号 intDECLARE @课程号 intBEGIN  TRAN  INSERT_T_ACCEPT  SET @Result =1     
   --  插入学生表  -- 
   INSERT INTO  学生表
   (
    姓名,
    性别,
    专业,
    出生年月
   )   
   VALUES
   (
    @姓名,  
    @性别,
    @专业,
    @出生年月
    )    
set @学号 =@@identityIF @@ERROR <> 0  GOTO E_EXCEPTION   -- 插入课程表  -- 
  INSERT INTO 课程表
  (
   课程名,
   所属专业,
   学分
   )
  VALUES
  (
    @课程名,
    @所属专业,
    @学分
   )
set @课程号 =@@identity
IF @@ERROR <> 0  GOTO E_EXCEPTION   -- 选课表  --     INSERT INTO 选课表
  (
   学号,
    课程号
  )
  VALUES
  (
    @学号,
    @课程号    
   )
  COMMIT IF @@ERROR <> 0  GOTO E_EXCEPTION  ELSE GOTO E_SUCESSE_EXCEPTION:
BEGIN 
  SET @Result = 1
  ROLLBACK 
ENDE_SUCESS:
begin
  SET @Result = 0  
end  
END
GOdeclare @i INT 
set @i =10while (@i>0)
begin declare      @姓名 VARCHAR(50),  
    @性别 VARCHAR(50),
    @专业 VARCHAR(50),
    @出生年月 DATETIME,  
    @课程名 VARCHAR(50),
    @所属专业 VARCHAR(50),
    @学分 INTset    @姓名=left(newid(),5)   --获得随机字符串
set    @性别=left(newid(),5)
set    @专业=left(newid(),5)
set    @出生年月=getdate()     --获得当前时间
set    @课程名=left(newid(),5)
set    @所属专业=left(newid(),5)
set    @学分=cast(ceiling(rand() * 100) as int)  --获得随机整数declare @Result int   exec  ADDSTUDENT
 @姓名,  
     @性别,
     @专业,
         @出生年月,  
         @课程名,
         @所属专业,
         @学分, 
         @Result outputdeclare @stuNo int, @conNo int select @stuNo= count(*) from  学生表 where 姓名=@姓名 and 性别=@性别 and 专业=@专业select @conNo = count(*) from 课程表 where 课程名=@课程名 and 所属专业=@所属专业 and 学分=@学分print @Result
if(@Result=0 and @stuNo=1 and @stuNo=@conNo)
print 'pass'
else if (@stuNo=1 and @stuNo=@conNo)
print 'pass---存储过程输出参数错误'
else if(@stuNo=1 and @conNo=0)
print 'error   事务没有回滚'
else if(@conNo=1 and @stuNo=0)
print 'error   事务没有回滚'
else if (@stuNo=0 and @stuNo=@conNo)
print 'error  添加失败'set @i=@i-1
end----------------------------pass---------------------------declare @i INT 
set @i =10while (@i>0)
begin declare      @姓名 VARCHAR(50),  
    @性别 VARCHAR(50),
    @专业 VARCHAR(50),
    @出生年月 DATETIME,  
    @课程名 VARCHAR(50),
    @所属专业 VARCHAR(50),
    @学分 INTset    @姓名=left(newid(),5000000000)   --获得随机字符串
set    @性别=left(newid(),5)
set    @专业=left(newid(),5)
set    @出生年月=getdate()--获得当前时间
set    @课程名=left(newid(),5)
set    @所属专业=left(newid(),5)
set    @学分=cast(ceiling(rand() * 100) as int) declare @Result int   exec  ADDSTUDENT
 @姓名,  
     @性别,
     @专业,
         @出生年月,  
         @课程名,
         @所属专业,
         @学分, 
         @Result outputdeclare @stuNo int, @conNo intselect @stuNo= count(*) from  学生表 where 姓名=@姓名 and 性别=@性别 and 专业=@专业select @conNo = count(*) from 课程表 where 课程名=@课程名 and 所属专业=@所属专业 and 学分=@学分print @stuNo
if(@Result=1 and @stuNo=0 and @stuNo=@conNo)
print 'pass'
else if(@stuNo=0 and @stuNo=@conNo)
print 'pass---存储过程输出参数错误'
else if(@stuNo=1 and @conNo=0)
print 'error1   事务没有回滚'
else if(@conNo=1 and @stuNo=0)
print 'error2   事务没有回滚'
set @i=@i-1
end
------------------error------------------------------------

解决方案 »

  1.   

    重点分析下这几句
    if(@Result=0 and @stuNo=1 and @stuNo=@conNo)
    print 'pass'
    else if (@stuNo=1 and @stuNo=@conNo)
    print 'pass---存储过程输出参数错误'
    else if(@stuNo=1 and @conNo=0)
    print 'error 事务没有回滚'
    else if(@conNo=1 and @stuNo=0)
    print 'error 事务没有回滚'
    else if (@stuNo=0 and @stuNo=@conNo)
    print 'error 添加失败'还有
    if(@Result=1 and @stuNo=0 and @stuNo=@conNo)
    print 'pass'
    else if(@stuNo=0 and @stuNo=@conNo)
    print 'pass---存储过程输出参数错误'
    else if(@stuNo=1 and @conNo=0)
    print 'error1 事务没有回滚'
    else if(@conNo=1 and @stuNo=0)
    print 'error2 事务没有回滚'
      

  2.   

    if
     else if 
    else 
    ...+ print 语句 利用@变量进行判断 分别输出不同内容 
      

  3.   

    建议楼主,碰到这样的代码的时候,先根据go分成几段一段一段来看
    这个代码分成两个部分
    第一部分 定义存储过程,用于添加学生数据第二部分 随机初始化一个学生数据,再利用上面定义好的存储过程,添加到表里面通过检查@Result output 变量,看是否执行成功
    @result必须是0,
    同时还有一个select count 语句,用于检查表中是否真有刚才添加进去的学生数据
    以学生姓名,性别,专业为条件
    如果确有,那@stdNo必须是1同时,这里还涉及到一个 课程表学生成功添加的时候,会同时在课程表中添加数据其它细节,楼主自己细看吧
     
      

  4.   

    为什么(@Result=0 and @stuNo=1 and @stuNo=@conNo)时可以pass
    而(@stuNo=1 and @stuNo=@conNo)时也pass但存储过程输出参数错误,
    既然已经成功了,@Result的值怎么还会等于1