剖析SQLsever之sqlsever存储过程_01

1、前言

以下介绍,大部分来自度娘。
https://baike.baidu.com/item/%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B/1240317?fr=aladdin

1.1、概念

存储过程,Stored Procedure,是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程将常用的或者负责的工作(即完成特定功能)预先用SQL语句集写好存放在数据库中,当日后需要执行此功能时,只需要用execute调用改sql语句集即可自动完成命令。

(是不是有一种定义全局函数的感觉呢?)

1.2、种类

在这里插入图片描述

  • 1系统存储过程
    主要存储再master数据库中,以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。

常见系统存储过程:

exec sp_databases; --查看数据库
exec sp_tables;        --查看表
exec sp_columns student;--查看列
exec sp_helpIndex student;--查看索引
exec sp_helpConstraint student;--约束
exec sp_stored_procedures;
exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句 经常用到这句话来查看存储过程,like sp_helptext sp_getLoginInfo.
exec sp_rename student, stuInfo;--修改表、索引、列的名称
exec sp_renamedb myTempDB, myDB;--更改数据库名称
exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库
exec sp_helpdb;--数据库帮助,查询数据库信息
exec sp_helpdb master;
  • 2本地存储过程
    用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。

  • 3临时存储过程
    分为两种存储过程:

    • 一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;
    • 二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。
  • 4远程存储过程
    在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。

  • 5扩展存储过程
    扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。

.例如:查看数据库所在机器操作系统参数

exec master..xp_msver 

2.基本语法

在这里插入图片描述

2.1、创建存储过程参数讲解

1、procedure_name:
新存储过程的名称,须符合语法规则,对于数据库及其所有者必须唯一。

  • 创建局部临时过程:在前面加上一个#,例如:#procedure_name
  • 创建全局临时过程:在前面加上两个#,例如:##procedure_name

2、;number
可选整数,用来对同名的过程分组。

3、@parameter
过程中的参数,以@开头,每个过程的参数仅用于该过程本身(类似于局部变量),两个@@开头为全局变量。在create创建存储过程时,可以声明一个或多个参数,用户必须在执行过程中提供每个所声明参数的值(除非参数定义了默认值),最多可有2100个参数。

4、data_type
参数的数据类型,包括text、ntext、int、image、nvarchar等等
cursor只能用作output参数,当数据类型为cursor时,必须同时指定varying和output关键字。

5、VARYING
指定作为输出参数支持的结果集,仅适用于游标参数。
6、default
参数的默认值,默认值必须是常量或null,党对参数值使用like关键字时,那么默认值中可以包含通配符(%、_、[ ] 和 [^])。
7、OUTPUT
表明参数是返回参数。可将参数返回给EXEC[UTE] 调用过程。
text、ntext和imag参数可用作OUTPUT参数。使用OUTPUT关键字的输出参数可以是游标占位符
8、,…n
表示可指定n个参数(最多2100个)。
9、
在这里插入图片描述

10、FOR REPLICATION
指定不能在订阅服务器上之行为复制创建的存储过程。
11、AS
制定过程中要执行的操作
12、sql_statement
过程中要包含的任意数目和类型的Transact-SQL语句。

2.2、调用存储过程

存储过程可以在三种环境下被调用:

  • command命令下,基本语法为:exec sp_name [参数名];
EXEC sp_name 参数1,参数2,……

EXEC sp_name 参数1,=1,参数2=2……
  • SQL环境下,基本语法为:call sp_name [参数名];
  • PL/SQL环境下,基本语法为:begin sp_name [参数名] end;

2.3、删除存储过程

  • 1.基本语法:
drop procedure sp_name
  • 2.注意事项
    (1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

2.4、其他常用命令

  • 1.show procedure status
    显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
  • 2.show create procedure sp_name
    显示某一个mysql存储过程的详细信息
  • 3、exec sp_helptext sp_name
    显示你这个sp_name这个对象创建文本

3、变量

以下大多来自于链接:https://www.cnblogs.com/lideng/archive/2013/04/11/3014407.html

3.1、变量声明-declare

在sql中我们使用关键词declare定义变量,并且使用标记符号(@)表示是变量。
局部变量是@开头,全局变量是@@开头的。

Declare @Local_Var data_type

--@Local_Var 是定义的变量名
-- data_type变量的数据类型

--举例子:

-- declare @a=1 varchar(20) --语法错误
declare @b varchar(20)=2
print @b --在窗口中打印出变量
---------
2

3.2、变量赋值–set/select

--2.2.、变量的赋值--set/select
declare @a varchar(20)
set @a=3			--赋值
print 'set='+@a
select @a=4
print 'select='+@a	--赋值

-----------
set=3
select=4

3.3、变量运算–set/select

加减法
--2.3、变量运算
set @a=@a+1
print 'set @a=@a+1='+@a
select @a=@a+1
print 'select @a=@a+1='+@a
--以下两种运算方式仅有select可以
select @a=(select 1+5)
print @a
select @a=(select 1-@a)
print @a

-----------
set @a=@a+1=5
select @a=@a+1=6
6
-5

乘除法
--乘除法
set @a=3
print @a
select @a=2*@a
--set @a=2*@a
print '*='+@a
select @a=@a/2
--set @a=@a/2
print '/='+@a

---------
3
*=6
/=3

模运算
--模%运算
declare @b int
set @b=(10%3)
print @b
select @b=(10%2)
print @b

---------
1
0

3.4、set/select区别

1、表达式返回多个值

--表达式返回多个值时,使用 SET 赋值
declare @name varchar(128)
set @name=(select username from userinfo)
print @name

/*
--出错信息为:
消息 512,级别 16,状态 1,第 79 行
子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
*/

-- 表达式返回多个值时,使用 SELECT 赋值
declare @name varchar(20)
select @name= userName from userinfo
print @name --结果集中最后一个 username 列的值
-----
输出结果:
admin02

2、表达式未返回值

--表达式未返回值时,使用 SET 赋值
declare @name varchar(20)
set @name='jack'
set @name= (select username from userinfo where username='not')
print @name  --Null值

结果
--------

--表达式未返回值时,使用 SELECT 赋值
declare @name varchar(20)
set @name='jack'
select @name=username from userinfo where username='not'
print @name  --jack,保存原来的值

结果
-------
jack

在这里插入图片描述

4、流程控制

例子参考:
https://www.cnblogs.com/BrokenIce/p/5713225.html
https://www.cnblogs.com/lideng/archive/2013/04/12/3016583.html
在这里插入图片描述
关于流程控制我在网上看见的大致分为三类:顺序、选择、循环

顺序的话,类似于我们上面执行的都是顺序结构,即按照语句顺序执行。

4.1、选择

4.1.1、if-[else if]-if

--if
declare @id int
set @id=5
if(@id=1)
	print 'right'
else if(@id=0)
	print 'error'
else
	print 'default'
------
输出结果:
default

4.1.2、case-when-then

declare @today int,@week nvarchar(10)
set @today=3
set @week=case 
	when @today=1 then 'monday'
	when @today=2 then 'Tuesday'
	else 'default'
end

print @week

---
default

4.2、循环-while

计算1到100的和

--计算1到100的和
declare @a int,@sum int
set @a=0
set @sum=0
while @a<=100 --循环开始
begin
	set @sum=@sum+@a
	set @a=@a+1
end
print @sum

-------
5050
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值