伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

SQL存储过程的详细用法,不信你看不懂

来源:本站原创 浏览:96次 时间:2022-08-24

SQL专栏

SQL数据库基础知识汇总

SQL数据库高级知识汇总

最近有不少小伙伴来私信存储过程到底是怎么一回事?之前有详细介绍过,不过时间比较久远,可能不好找。重新给需要的小伙伴介绍一下,语法比较固定,但是写法还是有点灵活,可以先模仿,写多了也就明白了。
存储过程其实就是已预编译为可执行过程的一个或多个SQL语句。通过调用和传递参数即可完成该存储过程的功能。
前面有介绍过存储过程的一些语法,但是没有详细示例,今天我们来一起研究一下存储过程。

1创建存储过程语法

create proc | procedure procedure_name

[{@参数数据类型} [=默认值] [output], {@参数数据类型} [=默认值] [output], ....]

as

SQL_statements

go

示例

create proc sp_test@param1 int,@param2 varchar(16)asselect * from testwhere id=@param1and t_no=@param2;go

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

2存储过程的优点和缺点

优点:

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

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

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

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

2)在通过网络调用过程时,只有对执行过程的调用是可见的。 因此,恶意用户无法看到表和数据库对象名称、嵌入自己的 Transact-SQL 语句或搜索关键数据。
3)使用过程参数有助于避免 SQL 注入***。 因为参数输入被视作文字值而非可执行代码,所以,***者将命令插入过程内的 Transact-SQL 语句并损害安全性将更为困难。
4)可以对过程进行加密,这有助于对源代码进行模糊处理。

劣势:

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

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


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

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

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

3具体应用

基础应用

1创建不带参数的存储过程
示例:查询订单表中订单总数

--查询存储过程IF OBJECT_ID (N'PROC_ORDER_COUNT', N'P') IS NOT NULL   DROP procedure PROC_ORDER_COUNT;GOCREATE procedure PROC_ORDER_COUNTAS   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;GOCREATE procedure PROC_ORDER_COUNT(@city nvarchar(50))AS   SELECT COUNT(OrderID) FROM Orders WHERE City=@cityGO--执行上述存储过程: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;GOCREATE 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 ;GOCREATE 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个是必须掌握的操作。

4存储过程进行增删改
1新增

--新增订单信息IF OBJECT_ID (N'PROC_INSERT_ORDER', N'P') IS NOT NULL   DROP procedure PROC_INSERT_ORDER;GOCREATE procedure PROC_INSERT_ORDER   @orderid  nvarchar(50),   @city nvarchar(20),   @price floatAS   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;GOCREATE procedure PROC_UPDATE_ORDER   @orderid  nvarchar(50),   @city nvarchar(20),   @price floatAS   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;GOCREATE 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;GOCREATE procedure PROC_ORDER_WITH_RECOMPILEwith 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;GOCREATE procedure PROC_ORDER_WITH_ENCRYPTIONwith encryption --加密AS   SELECT * FROM Orders;GO--执行上述存储过程:EXEC PROC_ORDER_WITH_ENCRYPTION

执行完的效果如图:

这就是存储过程的详细用法了。

  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net