0.存储过程的书写流程

1.连接数据库

USE [database_name]  --database_name:数据库名
GO  --可以理解为将其之前的语句提交给数据库执行(具体的可以百度)

2.设置空值比较

SET ANSI_NULLS ON  --空值的比较运算结果on:UNKNOWN;off:TRUE
GO

3.是否使用双引号( "") 作为分隔符

SET QUOTED_IDENTIFIER ON 
--标示符不符合 SQL SERVER 的命名规则时可以使用 "" 或 [] 作为分隔符
GO

4.创建存储过程名字

CREATE PROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
--修改存储过程:CREATE==》ALTER,修改需要修改的语句,重新执行即可完成修改
--1.IN输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
--2.OUT输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
--3.INOUT输入输出参数:既表示调用者向过程传入值,
--又表示过程向调用者传出值(值只能是变量)

5.添加参数(不需要传参的存储过程可忽略这一步)

@classgrade nvarchar(50), --班级
@name nvarchar(50),  --姓名
@chinese Decimal(24,9),  --语文成绩
@mathematics Decimal(24,9),  --数学成绩
@English Decimal(24,9),  --外语成绩

6.AS,BEGIN,END 添加

这是存储过程过程体的固定语法,你需要执行的SQL功能就写在这中间

AS
BEGIN
-- 这里的写逻辑eg:select * from #Tmp where name = '李一'
END
BEGIN
-- 这里的写逻辑eg:select * from #Tmp where name = '李二'
END

7.添加变量(书写逻辑时可能会用到)

DECLARE @sql nvarchar(max)
Declare @Count INT
Declare @i INT
--数字整型的声明:
--DECLARE   v_ins_id    INT;
--字符串类型的声明:
--DECLARE   v_message    NVARCHAR(128) DEFAULT '';
--时间类型的声明:
--DECLARE v_player_time timestamp DEFAULT NULL;
--为变量赋值:
--SET v_ins_id=30;

8.逻辑添加

SET @i = 1
SELECT * FROM #Tmp WHERE num = @i and classgrade=@classgrade 
	and name = @name and chinese=@chinese 
	and mathematics=@mathematics and english=@english
--选取临时表#Tmp里面字段num等于参数@i的所有数据且各字段与参数一致

9.执行

exec grade @classgrade = '1',@name='李一',
@chinese = 99,@mathematics=98,@english=97

10.下面就是一个最最简单sql存储过程

USE [database_name] --database_name:数据库名
GO  --可以理解为将其之前的语句提交给数据库执行(具体的可以百度)
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [grade](   --存储过程:grade成绩查询
@classgrade nvarchar(50),   --参数:班级
@name nvarchar(50),         --参数:姓名
@chinese Decimal(24,9),      --参数:语文成绩
@mathematics Decimal(24,9),  --参数:数学成绩
@english Decimal(24,9)      --参数:外语成绩
)
AS
BEGIN

BEGIN
SET NOCOUNT ON;
SELECT * FROM #Tmp WHERE num = @i and classgrade=@classgrade 
and name = @name and chinese=@chinese 
and mathematics=@mathematics and english=@english
END
SET NOCOUNT OFF;
create table #Tmp --创建临时表#Tmp,实际使用中查询表即可
(
    num				int IDENTITY(1,1)	not null,
    --创建列num,并且每次新增一条记录就会加1
    classgrade      NVARCHAR(MAX),--班级
	name 			NVARCHAR(MAX),--姓名
	chinese 		Decimal(24,9),--语文成绩
	mathematics 	Decimal(24,9),--数学成绩
	english 		Decimal(24,9)--外语成绩  
);
INSERT INTO #Tmp(classgrade,name,chinese,mathematics,english) VALUES('1','李一',99,98,97);
INSERT INTO #Tmp(classgrade,name,chinese,mathematics,english) VALUES('1','李二',89,88,87);
INSERT INTO #Tmp(classgrade,name,chinese,mathematics,english) VALUES('2','李三',79,78,77);
INSERT INTO #Tmp(classgrade,name,chinese,mathematics,english) VALUES('2','李四',69,68,67);
INSERT INTO #Tmp(classgrade,name,chinese,mathematics,english) VALUES('3','李五',59,58,57);
INSERT INTO #Tmp(classgrade,name,chinese,mathematics,english) VALUES('4','李六',49,48,47);
--执行存储过程
exec grade @classgrade='1',@name='李二',@chinese=89,@mathematics=88,@english=87
END