SQL Server

Procedure

----------------------存储过程相关-------------------------------

----------------------创建存储过程-------------------------------
-------------------------方法一----------------------------------
--或者在简写成,
--create proc usp_TwoNumSum
create procedure usp_TwoNumSum
@num1 int,
@num2 int
as 
begin
   print @num1 + @num2
end
--调用1
exec usp_TwoNumSum 10,30
--调用2
declare @n1 int = 10, @n2 int = 98
exec usp_TwoNumSum @num1= @n1, @num2 = @n2
-------------------------方法二----------------------------------
create proc usp_TwoNumSub
@num1 int,
@num2 int,
@result int output --此变量用于返回执行结果
as
begin
    set @result = @num1 - @num2 
end 
--调用
declare @s int
exec usp_TwoNumSub 6, 2, @s output
select @s  
----------------------创建存储过程结束-----------------------------
--案例一☆☆☆☆☆☆
--创建一个过程,当用户输入姓名、科目,返回其成绩
create proc usp_GetEnglishScoreByName
@name varchar(10),         --姓名
@catogory nvarchar(10),     --科目
@englishScore int output --英语分数
as
begin
    declare @count int = 0;    --用来存储此人有无该科目的记录
    set @count = (select count(*) from Student t, Scores tt where t.StdUserName = tt.Name and tt.Catogory = @catogory and t.StdUserName = @name);
    --判断一下
    if(@count > 0)
    begin
        --有记录时,返回该科目对应的分数
        set @englishScore= (select tt.Score from Student t, Scores tt where t.StdUserName = tt.Name and tt.Catogory = @catogory and t.StdUserName = @name);
    end
    else
    begin
        --无记录时,返回-1
        set @englishScore = -1;    
    end;
end;
--调用过程
declare @score int = 0
exec usp_GetEnglishScoreByName 'Jeremy Wu','English',@score output
select @score
--删除过程
drop proc usp_GetEnglishScoreByName

--案例二☆☆☆☆☆☆
--创建一个过程
--1.需要3个参数
--参数1:及格分数线:60
--参数2:每次提分的分数:2
--参数3:输出循环提分的次数 output参数
--2.编写循环提分的存储过程,要求提分后,不及格的人数小于总人数的一半
--3.分数表ScoreTest
select * from ScoreTest
--创建过程
create proc usp_GetRiseScoreTimes
@limitScoreLine int,    --及格分数线
@perScore int,            --每次提分的分数
@times int =0 output    --循环次数
as
begin
    --总人数
    declare @allCount int = 0;
    --不及格的人数
    declare @lowCount int = 0;
    --获取总人数
    set @allCount=(select count(*) from ScoreTest t);
    --获取不及格的人数
    set @lowCount=(select count(*) from ScoreTest t where t.score < @limitScoreLine);
    --不及格的人数小于总人数的一半
    while(@lowCount > (@allCount/2))
    begin
        --给小于及格线的进行提分操作
        update ScoreTest set score = score + @perScore where score < @limitScoreLine;
        --更新提分次数
        set @times = @times + 1;
        --获取不及格的人数
        set @lowCount=(select count(*) from ScoreTest t where t.score < @limitScoreLine);
    end;
    --打印提分的次数
    print @times
end;

--调用过程
declare @times int = 0
exec usp_GetRiseScoreTimes 50, 2, @times output
--删除表
drop proc usp_GetRiseScoreTimes

  作者:Jeremy.Wu
  出处:https://www.cnblogs.com/jeremywucnblog/
  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/jeremywucnblog/p/12467935.html