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