--存储过程--GO--先编译,再执行
--1.GO:批处理语句,GO之前作为一个批次发送服务器编译执行 USE master GO CREATE DATABASE TEST_DB GO USE TEST_DB CREATE TABLE TEST (ID INT,NAME VARCHAR(10)) GO INSERT INTO TEST VALUES (1,'张清瑞'), (2,'柴铭阳') GO --2.存储过程(PROCEDURE) --类似于C#中的方法(封装,重用:编译1次,反复重用) --作用: -- 用来执行复杂的业务功能 --优点: --<1> 效率高,执行速度快(节省了编译时间) --<2> 减少网络流量 --<3> 安全性高 --<4> 允许在数据库中实现模块化开发 --1 sql 1000 (效率高) 一条sql语句只编译一次 --1 sql 1行 1000次 需要编译1000次,效率低--语法 数据库对象
CREATE PROC [EDURE] name @name1 datatype[=默认值] --in 类型参数 默认 .... @name2 datatype OUTPUT --output 向外传值 实现与return相似的功能 AS --分割存储过程的定义和存储过程体(没有软用) 过程体--t_sql GO ---------------------------------------------------------------------案例分析------------------------------------------------------------------------------------- --EG1: 无参的存储过程--查看销售部(sales)的员工信息
--先编译,再调用 CREATE PROCEDURE EmpsInfo --无参 不用写参数 --WITH ENCRYPTION --源代码加密 AS PRINT '销售部(sales)的员工信息如下:' SELECT * FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='sales') GO --执行存储过程 EXEC EmpsInfo--执行存储过程 --查看存储过程源代码 : exec sp_helptext 'EmpsInfo' ALTER PROCEDURE EmpsInfo--修改存储过程/解密 AS PRINT '销售部(sales)的员工信息如下:' SELECT * FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='sales') GO DROP PROCEDURE EmpsInfo--删除存存储过程 --EG2. 带有in类型参数的存储过程 --显示任意部门(参数)的员工信息 CREATE PROCEDURE EmpsInfo @name varchar(20) --参数in,只有in类型参数有默认值 AS PRINT @name+'部门的员工信息如下:' SELECT * FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME=@name) GO --执行存储过程有in类型 EXEC EmpsInfo @name='sales' -----KEY VALUE EXEC EmpsInfo 'ACCOUNTING' --按顺序传参 EXEC EmpsInfo --参数会使用默认值,如果没有默认值会报错 --EG3.带有输入(in)和输出(output)两种类型参数的存储过程 --求和 int sum(int a,int b) CREATE PROC GetSum @a int=0,--in @b int=0, @sum int output --output输出类型参数 AS SET @sum=@a+@b GO --执行过程 --key=value DECLARE @s int EXEC GetSum @b=10,@a=20,@Sum=@s output print @s --思考:存储过程中可以有return 语句吗? --可以 return 中断过程执行 --return val,val只能返回的是整数.(退化很少用) --练习:编写过程,向一个空的测试表插入任意行的数据. --要求,一次插入的数据不能重复 CREATE TABLE DUMP ( ID int, NAME nvarchar(20), PRICE money ) CREATE PROC AddData @rowNum int=100 AS DECLARE @i int=1 WHILE(@i<=@rowNum) BEGIN INSERT INTO DUMP VALUES(@i,NEWID(),@i*0.23+5) SET @i+1