京公网安备 11010802034615号
经营许可证编号:京B2-20210330
但也不是说学不会,今天就给大家好好恶补一下存储过程的一些常规用法,一些非常规用法实在是太多了,这里就不一一列举了。
作者:丶平凡世界
来源: SQL数据库开发
创建存储过程
create proc | procedure procedure_name
[{@参数数据类型} [=默认值] [output],
{@参数数据类型} [=默认值] [output],
....
]
as
SQL_statements
go
示例
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';
存储过程其他功能
这部分是选修内容,有兴趣的可以了解一下
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
执行完的效果如图:
以上就是存储过程的详细用法了。还有不明白或有疑问的地方,欢迎留言讨论。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
【核心关键词】统计学、互联网、知识、课程、学生、数学、软件、招聘、数据分析、实习经历、机器学习、理论基础、业务思维、统 ...
2026-07-10在互联网运营、产品设计、市场营销与商业数据分析领域,所有转化、成交、复购行为的底层逻辑,都依托于用户决策流程。用户从产生 ...
2026-07-10 很多数据分析师能熟练地计算指标、搭建标签体系,但当被问到“画像到底在解决什么问题”“画像和标签是什么关系”“画像如何 ...
2026-07-10数据透视表是数据分析中最常用、最高效的汇总分析工具,具备快速分组、聚合计算、维度拆解、数据可视化等优势,能够轻松完成求和 ...
2026-07-09在统计学、CDA数据分析、机器学习与商业数据研究中,正态分布是最基础、最重要的数据分布形态。绝大多数参数检验、数据建模、指 ...
2026-07-09 很多分析师在设计标签时思路清晰,但真到落地环节却面临“数据在手,不知如何转化为可用标签”的困境:或因加工方式选择不当 ...
2026-07-09【核心关键词】采购、周期、原材料、企业、产品、成本、要素、库存、供应商、数据分析、生产计划、生产制造、加工制造、技术工 ...
2026-07-08在数据分析、特征工程、机器学习建模的工作流程中,原始数据往往包含多个不同维度的数值指标,例如客户交易数据中的消费金额、交 ...
2026-07-08 很多分析师每天和数据打交道,但当被问到“标签是什么”“标签和指标有什么区别”“标签体系如何设计”时,却常常答不上来。 ...
2026-07-08商业谈判是企业采购合作、渠道签约、价格议价、项目合作、客户签约的核心关键环节,直接决定企业的合作成本、利润空间与经营风险 ...
2026-07-07在数据分析、业务效果验证、AB 测试、学术研究等场景中,T 检验是假设检验体系里最基础、应用最广泛的统计方法,也是均值差异分 ...
2026-07-07 很多数据分析师每天都在写SQL,但当被问到“数据查询语言(DQL)的本质是什么”“SELECT语句中各子句的书写顺序与实际执行顺 ...
2026-07-07【核心关键词】转化率、企业、策略、岗位、互联网、拆分、产品、运营、分析师、指标体系、数据分析、用户画像、数据诊断、产品 ...
2026-07-06在数据分析工作中,文本数据处理是高频刚需场景,用户评论、客服工单、日志信息、调研问卷、商品文案等数据都包含大量文本内容。 ...
2026-07-06 很多数据分析师写过无数个SELECT查询,但当被问到“如何新建一张表来固化中间数据”“创建视图和创建物理表有什么区别”“视 ...
2026-07-06在 CDA 数据分析师能力体系中,透视分析是数据探索、多维度汇总、业务复盘的核心基础技能。无论是 Excel 数据透视表,还是 Power ...
2026-07-03在市场竞争日趋激烈、获客成本持续攀升的当下,企业粗放式的“广撒网”获客模式早已无法适配经营需求。企业经营的核心逻辑,已经 ...
2026-07-03 很多数据分析师精通Excel函数和数据透视表,但当被问到“数据从哪里来”“表和视图有什么区别”“数据库管理系统和SQL是什么 ...
2026-07-03【核心关键词】运营、企业、核心、客户、新技术、数字化运营、数据分析、传统企业、人工录入、生产系统、技术人员、数据安全、 ...
2026-07-02在产品开发、项目立项、业务拓展、运营优化的工作中,市场调查、竞品分析、需求调研是三大核心基础工作。很多从业者容易将三者混 ...
2026-07-02