ALTERPROCEDURE P_STUDENT AS BEGIN SELECTNAME,AGE,SEX FROM dbo.STUDENT WHERE AGE>13 END
删除
示例:
1
DROPPROCEDURE dbo.P_STUDENT
执行多步操作的存储过程
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
USE SCHOOL GO IF OBJECT_ID('P_COURSE02') ISNOTNULL DROPPROCEDURE P_COURSE02 GO CREATEPROCEDURE P_COURSE02 AS BEGIN INSERTINTO COURSE01 SELECT * FROM dbo.COURSE UPDATE COURSE01 SETNAME='高数'WHERENAME='.NET CORE' DELETEFROM dbo.COURSE01 WHERENAME='JAVA' SELECT * FROM dbo.COURSE01 END GO
带输入参数的存储过程
概念
输入参数:调用方将数据值传递给存储过程
输出参数:存储过程将数据值返回给调用方
变量:可以在存储过程内部存储和传递数据值,不能将数据从外部传递到存储过程内部
创建
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
USE SCHOOL GO IF OBJECT_ID('P_STUDENT') ISNOTNULL DROPPROCEDURE P_STUDENT GO CREATEPROCEDURE P_STUDENT @sex CHAR(2), --注意:定义参数位置在存储过程名称粥,参数要以@符号开始 @age INT = 18--这里是将age参数的默认值设定为18,当参数由默认值的时候,调用方如果没传该参数的值过来,则使用默认值进行执行 AS BEGIN SELECTID,NAME,AGE,SEX FROM dbo.STUDENT WHERE SEX=@sex AND AGE>@age END GO
执行
示例:
1
EXEC dbo.P_STUDENT @sex='女',@age=15
带通配符的存储过程
示例:
创建
1 2 3 4 5 6 7 8 9 10 11 12
USE SCHOOL GO IF OBJECT_ID('P_STUDENT','P') ISNOTNULL DROPPROCEDURE P_STUDENT GO CREATEPROCEDURE P_STUDENT @nameNVARCHAR(100) --参数定义方法不变 AS BEGIN SELECTNAME,AGE,SEX FROM dbo.STUDENT WHERENAMELIKE @name--通配符查询得使用LIKE END GO
执行
示例:
1
EXEC dbo.P_STUDENT @name = N'王%'
带输出参数的存储过程
创建
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
USE SCHOOL GO IF OBJECT_ID('P_STUDENT','P') ISNOTNULL DROPPROCEDURE P_STUDENT GO CREATEPROCEDURE P_STUDENT @nameNVARCHAR(100), @age INTOUTPUT--OUTPUT或OUT都表示为输出参数 AS BEGIN SELECT @age=AGE FROM dbo.STUDENT WHERENAME=@name END GO
USE SCHOOL GO -- 创建表类型 IF OBJECT_ID('TYPE01','TT') ISNOTNULL DROPTYPE TYPE01 GO CREATETYPE TYPE01 ASTABLE ( NAMENVARCHAR(100) NOTNULL, SEX CHAR(2) NOTNULL, AGE INTNOTNULL ) GO -- 创建存储过程 IF OBJECT_ID('P_INSERT_STUDENT','P') ISNOTNULL DROPPROCEDURE P_INSERT_STUDENT GO CREATEPROCEDURE P_INSERT_STUDENT @DATA TYPE01 READONLY --定义输入参数类型为上面定义的TYPE01类型 AS BEGIN INSERTINTO STUDENT(NAME,SEX,AGE) SELECTNAME,SEX,AGE FROM @DATA END GO
执行
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
-- 执行存储类型 -- 先定义表类型的变量@MyData DECLARE @MyData AS TYPE01 -- 然后往变量@MyData里添加数据 INSERTINTO @MyData SELECT'Jame','男',12UNIONALL SELECT'Alice','女',23 -- 执行存储过程,将上面定义的变量传入存储过程 EXEC dbo.P_INSERT_STUDENT @DATA = @MyData GO -- 查看执行结果 SELECT * FROM dbo.STUDENT GO
SELECT 局部变量名=字段名 FROM 表名 ORDER BY 字段名,若SELECT返回值有多个,则数据库引擎会分配最后一个值给变量
局部变量的作用域:在DECLARE变量开始至脚本或存储过程结束
创建
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
USE SCHOOL GO IF OBJECT_ID('P_STUDENT','P') ISNOTNULL DROPPROCEDURE dbo.P_STUDENT GO CREATEPROCEDURE P_STUDENT @NAMENVARCHAR(100) AS BEGIN DECLARE @AGE INT--注意:参数的定义位置在AS前面,变量的定义位置在AS后面 SELECT @AGE=AGE FROM dbo.STUDENT WHERENAME=@NAME--通过查询结果给变量复制 SELECT * FROM dbo.STUDENT WHERE AGE=@AGE --使用变量进行查询 END GO
USE SCHOOL GO IF OBJECT_ID('P_STUDENT','P') ISNOTNULL DROPPROCEDURE dbo.P_STUDENT GO CREATEPROCEDURE P_STUDENT @IDCHAR(10), @NAMEVARCHAR(10), @SEX CHAR(2) AS BEGIN BEGIN TRY INSERTINTO STUDENT(ID,SEX,NAME) --这里模拟个异常 SELECT @ID,@NAME,@SEX END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ERROR_NUM, ERROR_PROCEDURE() AS ERROR_PROC, ERROR_SEVERITY() AS ERROR_SEVE, ERROR_MESSAGE() AS ERROR_MSG END CATCH END GO
USE SCHOOL GO IF OBJECT_ID('P_STUDENT','P') ISNOTNULL DROPPROCEDURE P_STUDENT GO CREATEPROCEDURE P_STUDENT @NAMEVARCHAR(10) WITH ENCRYPTION,RECOMPILE AS BEGIN DECLARE @AGE INT SELECT @AGE=AGE FROM dbo.STUDENT WHERENAME=@NAME SELECT * FROM dbo.STUDENT WHERE AGE=@AGE END GO