布条百科 - 专业百科知识分享的网站 手机版
首页 > 百科 >

sql存储过程执行哪些操作(一文读懂SQL存储过程的简单用法)

90次浏览     发布时间:2024-04-24 09:00:20    

存储过程其实就是已预编译为可执行过程的一个或多个SQL语句。 通过调用和传递参数即可完成该存储过程的功能。

前面有介绍过存储过程的一些语法,但是没有详细示例,今天我们来一起研究一下存储过程。

一、创建存储过程语法

create proc | procedure procedure_name [{@参数数据类型} [=默认值] [output], {@参数数据类型} [=默认值] [output], .... ]as SQL_statementsgo

示例

create proc sp_test
@param1 int,
@param2 varchar(16)
as
select * from test 
where id=@param1 
and t_no=@param2;
go

上面就是一个简单的示例。

存储过程在创建阶段可以带参数或不带参数,不带参数的一般是执行一些不需要传递参数的语句就可以完成的功能,带参数那就是需要传递参数的SQL语句,就像上面的示例,传递了两个参数给SQL语句。带参数的一定要定义参数类型,是字符型的还要定义长度,给参数加默认值是可选的。


二、存储过程的优点和缺点

优点:

1提高性能

SQL语句在创建过程时进行分析和编译。 存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划,这样,在执行过程时便可节省此开销。

2降低网络开销

存储过程调用时只需用提供存储过程名和必要的参数信息,从而可降低网络的流量。

3便于进行代码移植

数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。

4更强的安全性

1)系统管理员可以对执行的某一个存储过程进行权限限制,避免非授权用户对数据的访问

2)在通过网络调用过程时,只有对执行过程的调用是可见的。 因此,恶意用户无法看到表和数据库对象名称、嵌入自己的 Transact-SQL 语句或搜索关键数据。

3)使用过程参数有助于避免 SQL 注入攻击。 因为参数输入被视作文字值而非可执行代码,所以,攻击者将命令插入过程内的 Transact-SQL 语句并损害安全性将更为困难。

4)可以对过程进行加密,这有助于对源代码进行模糊处理。

劣势:

1逻辑处理吃力

SQL本身是一种结构化查询语言,但不是面向对象的的,本质上还是过程化的语言,面对复杂的业务逻辑,过程化的处理会很吃力。同时SQL擅长的是数据查询而非业务逻辑的处理,如果如果把业务逻辑全放在存储过程里面,违背了这一原则。

2修改参数复杂

如果需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新调用,等等,这时候估计会比较繁琐了。

3开发调试复杂

由于IDE的问题,存储过程的开发调试要比一般程序困难。

4无法应用缓存

虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。

5不支持群集

数据库服务器无法水平扩展,或者数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。

三、具体应用

基础应用

1创建不带参数的存储过程

示例:查询订单表中订单总数

--查询存储过程
IF OBJECT_ID (N'PROC_ORDER_COUNT', N'P') IS NOT NULL
 DROP procedure PROC_ORDER_COUNT;
GO
CREATE procedure PROC_ORDER_COUNT
AS 
 SELECT COUNT(OrderID) FROM Orders;
GO
--执行上述存储过程:
EXEC PROC_ORDER_COUNT;


2创建带参数的存储过程

示例:根据城市查询订单数量

--查询存储过程,根据城市查询总数
IF OBJECT_ID (N'PROC_ORDER_COUNT', N'P') IS NOT NULL
 DROP procedure PROC_ORDER_COUNT;
GO
CREATE procedure PROC_ORDER_COUNT(@city nvarchar(50))
AS
 SELECT COUNT(OrderID) FROM Orders WHERE City=@city
GO
--执行上述存储过程:
EXEC PROC_ORDER_COUNT N'GuangZhou';


进阶应用

3参数带通配符

--查询订单编号头两位是LJ的订单信息,含通配符
IF OBJECT_ID (N'PROC_ORDER_INFO', N'P') IS NOT NULL
 DROP procedure PROC_ORDER_INFO;
GO
CREATE procedure PROC_ORDER_INFO
 @OrderID nvarchar(50)='LJ%' --默认值
AS 
 SELECT OrderID,City,OrderDate,Price FROM Orders 
 WHERE OrderID like @OrderID;
GO
--执行上述存储过程:
EXEC PROC_ORDER_INFO;
EXEC PROC_ORDER_INFO N'LJ%';
EXEC PROC_ORDER_INFO N'%LJ%';


4带输出参数

--根据订单查询的信息,返回订单的城市及单价
IF OBJECT_ID (N'PROC_ORDER_INFO ', N'P') IS NOT NULL
 DROP procedure PROC_ORDER_INFO ;
GO
CREATE procedure PROC_ORDER_INFO 
 @orderid nvarchar(50), --输入参数
 @city nvarchar(20) out, --输出参数
 @price float output --输入输出参数
AS 
 SELECT @city=City,@price=Price FROM Orders 
 WHERE OrderID=@orderid AND Price=@price;
GO
--执行上述存储过程:
declare @orderid nvarchar(50),
 @city nvarchar(20),
 @price int;
set @orderid= N'LJ0001';
set @price = 35.21;
exec PROC_ORDER_INFO @orderid,@city out, @price output;
select @city, @price;

上面两个在平时工作中遇到的较少,需要的时候知道怎么用即可,1,2个是必须掌握的操作。

四、存储过程进行增删改

1新增

--新增订单信息
IF OBJECT_ID (N'PROC_INSERT_ORDER', N'P') IS NOT NULL
 DROP procedure PROC_INSERT_ORDER;
GO
CREATE procedure PROC_INSERT_ORDER
 @orderid nvarchar(50),
 @city nvarchar(20),
 @price float
AS 
 INSERT INTO Orders(OrderID,City,Price) 
 VALUES(@orderid,@city,@price)
GO
--执行
EXEC PROC_INSERT_ORDER N'LJ0001',N'GuangZhou',35.21;


2修改

--修改订单信息

IF OBJECT_ID (N'PROC_UPDATE_ORDER', N'P') IS NOT NULL

DROP procedure PROC_UPDATE_ORDER;

GO

CREATE procedure PROC_UPDATE_ORDER

@orderid nvarchar(50),

@city nvarchar(20),

@price float

AS

UPDATE Orders SET OrderID=@orderid,City=@city,Price=@price;

GO

--执行

EXEC PROC_UPDATE_ORDER N'LJ0001',N'ShangHai',37.21;

3删除

--修改订单信息
IF OBJECT_ID (N'PROC_DELETE_ORDER', N'P') IS NOT NULL
 DROP procedure PROC_DELETE_ORDER;
GO
CREATE procedure PROC_DELETE_ORDER
 @orderid nvarchar(50),
AS 
 DELETE FROM Orders WHERE OrderID=@orderid; 
GO
--执行
EXEC PROC_DELETE_ORDER N'LJ0001';


5其他功能


这部分是选修内容,有兴趣的可以了解一下

1重复编译存储过程

--重复编译
IF OBJECT_ID (N'PROC_ORDER_WITH_RECOMPILE', N'P') IS NOT NULL
 DROP procedure PROC_ORDER_WITH_RECOMPILE;
GO
CREATE procedure PROC_ORDER_WITH_RECOMPILE
with recompile --重复编译
AS 
 SELECT * FROM Orders;
GO


2加密存储过程

--查询存储过程,进行加密,加密后不能查看和修改源脚本
IF OBJECT_ID (N'PROC_ORDER_WITH_ENCRYPTION', N'P') IS NOT NULL
 DROP procedure PROC_ORDER_WITH_ENCRYPTION;
GO
CREATE procedure PROC_ORDER_WITH_ENCRYPTION
with encryption --加密
AS 
 SELECT * FROM Orders;
GO
--执行上述存储过程:
EXEC PROC_ORDER_WITH_ENCRYPTION

执行完的效果如图:

相关文章

物业为什么要装修巡查(物业管家日常巡查查什么?)

一楼宇巡查(一)楼宇巡查的必要性1、通过有效的巡查,将治安、消防等隐患消除,防患于未然;2、杜绝违章装修,将违章装修施工消除于萌芽状态;3、确保公共设施设备处于良好状态;4、检查小区清洁、绿化情况;5、对空置房的管理;6、增加与住户的沟通。(二)楼宇巡查内容1、治安隐患的巡查;2、公共设施设备安全完

2025-02-25 02:31:32

为什么不能去别人家住(为什么最好禁止小孩去别人家过夜?)

在现代社会中,随着人们生活方式的多样化,小孩去朋友家过夜已经成为一种常见的社交活动。然而,这种 seemingly harmless tradition 实际上潜藏着不少风险,特别是对于儿童的安全和心理健康。本文将探讨为什么家长最好禁止小孩去别人家过夜,并提供一些保护儿童的建议。一、安全问题1. 未

2025-02-25 02:18:54

为什么墙体脏怎么清洗(墙面脏了怎么办?)

很多人家里的墙面经常弄脏,不是灰尘、脚印、油污,就是小孩乱涂乱画,大大影响了墙面的美观,而打理起来又难免要沾水清洁,因此容易引发霉菌问题,尤其是墙布、乳胶漆防不胜防,令人头疼不已。那么面对墙面脏污时,我们该如何处理呢?面对墙面脏污,我们分情况来处理。如果你家是乳胶漆墙面,那么我们可以用水+清洁剂擦拭

2025-02-25 02:13:36

墙布为什么臭怎么办(墙纸有味道怎么办?)

现在用墙纸来装饰新居的墙面已经不是什么稀罕的事情了,很多人都喜欢用这些图案多样,颜色绚丽的墙纸来装点我们的室内墙面。但是墙纸有时候也总有那么一股味道,感觉非常的不好闻,下面就随小编看看墙纸有味道怎么办,如何去除壁纸的味道,以供大家参考。墙纸有味道怎么办1、开窗通风壁纸有味只要来自生产壁纸的生产源,壁

2025-02-25 02:04:57

锁为什么用钥匙打不开(钥匙正常使用可就是打不开锁怎么办?)

钥匙能正常转动可就是打不开门该怎么办?你家的门锁如果出现了这种情况该怎么办?反锁以后钥匙把它打开,结果什么?看一下下面侧锁点没有回去,再看上面,上面可以动,下面没有动,这就说明天地杆已经脱钩了。哪一个天地杆?看一下这个杆子已经拉出来了,但是拉出来以后下面还是不动的,就证明这个位置已经脱钩了。这时候该

2025-02-25 02:02:20

瓷砖为什么鼓起来一点点(瓷砖空鼓的原因是什么?)

瓷砖空鼓是家庭装修中常见的问题,它不仅影响美观,还可能造成安全隐患。了解瓷砖空鼓的原因以及如何有效预防,对于每一个准备装修或正在装修的人来说都至关重要。一、瓷砖空鼓的原因基层处理不当瓷砖铺贴前,基层的处理非常重要。如果基层表面有灰尘、油污或者不平整,都会影响水泥砂浆与基层的粘结力,从而导致瓷砖空鼓。

2025-02-25 01:42:54