1.CREATE PROCEDURE (Transact-SQL)
-- Transact-SQL Syntax for Stored Procedures in SQL Server and Azure SQL Database
CREATE [ OR ALTER ] { PROC | PROCEDURE }
[schema_name.] procedure_name [ ; number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ OUT | OUTPUT | [READONLY]
] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
[;]
<procedure_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE AS Clause ]
- schema_namc:架构名。
- procedurc_name:存储过程名。
- number:对同名过程进行分组的选项,使用drop procedure语句可以将这些分组过程一起删除.
- @parameter:存储过程的参数。
- [type_schema name.]data_type:参数的架构及类型。
- VARYING:指定作为输出参数支持的结果集,仅适用于cursor参数。
- default:参数的默认值,如果定义了default值,则无须指定此参数的值也可执行存储
- 过程。
- OUTPUT:输出参数,此选项的值可以返回给调用存储过程的语句.
- ENCRYPTION:加密存储过程。
- RECOMPILE:指明该存储过程在运行时才编译,不预编译。
- EXECUTE_AS_ Clause:指定执行存储过程的安全上下文。
- FOR REPLICATION:不能在订阅服务器上执行为复制创建的存储过程。
- (sql_statement>语法块:存储过程执行的T-SQL语句。
<method\_specifier>
语法块:指定.NET Framework程序集的方法,以便CLR存储过程引用。
--创建存储过程
CREATE PROC ProGetAuthors
AS
SELECT *
FROM authors
go
EXEC progetauthors
2.使用EXECUTE语句调用存储过程
语法格式。
[EXEC[UTE]]
{
[@return_status =]
(procedure_name [ ;number] I @procedure_name_ var
}
[[@parameter=] {value | @variable[OUTPUT] I [DEFAULT]]
[,…n]
[WITH RECOMPILE]
其中,大部分的参数与CREATE PROCEDURE的参数含义相同.
- @return_Btatus:是一个可选的整型变量,保存存储过程的返回状态。这个变量在用于EXECUTE语句前,必须在批处理、存储过程或函数中声明过。
- @procedure_name_ var:是局部定义变量名,代表存储过程名称。
3.创建带输入参数的存储过程
例在test数据库中创建—个名为procGetAvgMaxMin的存储过程.用于查询特定课程的考试成绩平均分、最高分和最低分。使用EXECUTE语句调用该存储过程查询“信息基础“的各项分数
CREATE PROC procGetAvgMaxMin
@course_name char (20)
AS
SELECT AVG(exam) AS 平均分,
MAX(exam) AS 最高分,
MIN(exam) AS 最低分
FROM score AS s
INNER JOIN course AS c
ON s.cno=c.cno
WHERE c.cname=@course_name
GO
/*调用存储过程procGeCAvgMaxMin.查询“信息基础”的各项分数*/
EXEC procGetAvgMaxMin '信息基础'
4.给输入参数设置默认值
CREATE PROC procGetAvgMaxMin
@course_name char (20)=NULL
AS
IF @course_name IS NULL
PRINT '请提供课程名称'
ELSE
SELECT AVG(exam) AS 平均分,
MAX(exam) AS 最高分,
MIN(exam) AS 最低分
FROM score AS s
INNER JOIN course AS c
ON s.cno=c.cno
WHERE c.cname=@course_name
GO
/*调用存储过程procGeCAvgMaxMin.查询“信息基础”的各项分数*/
EXEC procGetAvgMaxMin '信息基础'
5.创建带输出参数的存储过程
例 创建一个存储过程proc2,用于求指定数值的阶乘。
CREATE PROC proc2
@x int,
@Y int OUTPUT /*声明变量y为输出参数*/
AS
/*声明两个局部变量i和t,并为其分别赋值为*/
DECLARE @i int,@t int
SELECT @i=l,@t=l
/*使用循环语句,计算x的阶乘t*/
WHILE @i<@x
BEGIN
SELECT @t=@t*t@i
SELECT @i=@i+l
END
/*将t的值,赋值给了输出参数y*/
SELECT @y=@t
6.创建有多条SQL语句的存储过程
例 创建一个存储过程proc3,能够查询特定课程的平均分、最高分和最低分,同时还能查询高于平均分的所有学生的信息。
CREATE PROC proc3
@course_name char(20)
AS
DECLARE @avg_score int
/*下面的语句用于查询显示平均分,最高分和最低分*/
SELECT AVG(exam) AS 平均分,
MAX(exam) AS 最高分.
MINexam) AS 最低分
INNER JOIN course AS C
ON s.cno=c.cno
WHERE c.cname=@course_name
/*下面的语句用于将考试成绩平均分赋值给变量@avg_score*/
SELECT @avg_score =AVG(exam)
FROM score AS S
INNER JOIN course AS c
ON s.cno=c.cno
WHERE c.cname=@course_name
/*下面的语句用于显示特定课程的分数高于平均分的学生信息*/
SELECT st.sno, st.sname, st.depart, s.exam, s.usually
FROM stu_info AS st
INNER JOIN score AS s
ON st.sno=s.sno
INNER JOIN course AS c
ON s.cno=c.cno
WHERE c.cname=@course_name
AND s.exam>@avg_score