Sql Server系列:存储过程
1 存储过程简介
存储过程是使用T-SQL代码编写的代码段。在存储过程中,可以声明变量、执行条件判断语句等其他编程功能。在MS SQL Server 2012中存储过程主要分三类:系统存储过程、自定义存储过程和扩展存储过程。
存储过程的优点:
◊ 存储过程加快系统允许速度,存储过程只在创建时编译,以后每次执行时不需要重新编译。
◊ 存储过程可以封装复杂的数据库操作,简化操作流程。
◊ 可实现模块化的程序设计,存储过程可以多次调用,提供统一的数据库访问接口,改进应用程序的可维护性。
◊ 存储过程可以增强代码的安全性。
◊ 存储过程可以降低网络流量,存储过程代码直接存储在数据库中,在客户端与服务器的通讯过程中,不会产生大量的T-SQL代码流量。
存储过程的缺点:
◊ 数据库移植不方便,存储过程依赖于数据库管理系统,MS SQL Server 2012存储过程中封装的操作代码不能直接移植到其他数据库系统中。
◊ 不支持面向对象的设计,无法采用面向对象的方式将逻辑业务进行封装。
◊ 不易维护
◊ 不支持集群
1.1 系统存储过程
系统存储过程是有MS SQL Server 2012系统自身提供的存储过程,可以作为命令执行各种操作。系统存储过程主要用来从系统表中获取信息,使用系统存储过程完成数据库服务器的管理工作。系统存储过程位于数据库服务器中,并以sp_开头,系统存储过程定义在系统定义和用户定义的数据库中,在调用时不必在存储过程前加数据库限定名。
系统存储过程创建并存储于系统数据库master中。
1.2 自定义存储过程
自定义存储过程即用户使用T-SQL语句编写的、为了实现某一特定业务需求,在用户数据库中编写的T-SQL语句集合,用户存储过程可以接受输入参数、向客户端返回结果和信息、返回输出参数等。
创建自定义存储过程时,存储过程名前面加上##表示创建一个全局的临时存储过程;存储过程名前面加上#表示创建局部临时存储过程。局部临时存储过程只能在创建它的会话中使用,会话结束时,将被删除。这两种存储过程都存储在tempdb数据库中。
1.3 扩展存储过程
扩展存储过程是以在SQL Server 2012环境外执行的DLL来实现的。扩展存储过程以前缀xp_标识。
2 创建及执行存储过程
CREATE PROCEDURE语句的语法格式:
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ OUT | OUTPUT | [READONLY]
] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
[;]
EXECUTE存储过程的语法格式:
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name [ ;number ] | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH <execute_option> [ ,...n ] ]
}
[;]
示例:
CREATE PROCEDURE USP_GetAllProducts
AS
SELECT [ProductID],[ProductName],[UnitPrice],[UnitsInStock],[CreateDate]
FROM [dbo].[Product]
EXECUTE USP_GetAllProducts
带输入参数的存储过程:
CREATE PROCEDURE USP_GetByProductID
(
@ProductID INT
)
AS
SELECT [ProductID],[ProductName],[UnitPrice],[UnitsInStock],[CreateDate]
FROM [dbo].[Product]
WHERE [ProductID] = @ProductID
EXECUTE USP_GetByProductID @ProductID = 1
带输出参数的存储过程:
CREATE PROCEDURE USP_GetTotalRecordsByCategoryID
(
@CategoryID INT,
@TotalRecords INT OUTPUT
)
AS
SELECT @TotalRecords = COUNT(1) FROM [dbo].[Product]
WHERE [CategoryID] = @CategoryID
DECLARE @TotalProducts INT
EXECUTE USP_GetTotalRecordsByCategoryID @CategoryID = 1, @TotalRecords = @TotalProducts OUTPUT
SELECT @TotalProducts
DECLARE @TotalProducts INT
EXECUTE USP_GetTotalRecordsByCategoryID 1, @TotalProducts OUTPUT
SELECT @TotalProducts
3 修改存储过程
修改存储过程语法格式:
ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY]
] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
[;]
4 查看存储过程
查看存储过程结构:
EXEC sp_help USP_GetTotalRecordsByCategoryID
查看存储过程文本:
EXEC sp_helptext USP_GetTotalRecordsByCategoryID
5 删除存储过程
删除存储过程语法:
DROP { PROC | PROCEDURE } { [ schema_name. ] procedure } [ ,...n ]
示例:
DROP PROCEDURE USP_GetTotalRecordsByCategoryID
6 使用WITH RECOMPILE选项
使用WITH RECOMPILE选项可以确保为特定的某次运行创建新的计划,使用该选项的两种方式:
◊ 在运行时包含WITH RECOMPILE
EXECUTE USP_GetAllProducts WITH RECOMPILE
◊ 在存储过程中包含WITH RECOMPILE选项。
在CREATE PROC或ALTER PROC语句中的AS语句前添加WITH RECOMPILE选项。
7 递归存储过程
SQL Server最多可以进行32次递归,超出则会引发错误并停止处理。
CREATE PROC USP_Factorial
(
@ValueIn INT,
@ValueOut INT OUTPUT
)
AS
DECLARE @InWorking INT
DECLARE @OutWorking INT IF @ValueIn >= 1
BEGIN
SELECT @InWorking = @ValueIn - 1
EXEC USP_Factorial @InWorking, @OutWorking OUTPUT
SELECT @ValueOut = @ValueIn * @OutWorking
END
ELSE
SET @ValueOut = 1
DECLARE @ValueOut INT
EXEC USP_Factorial 5, @ValueOut OUTPUT
SELECT @ValueOut
Sql Server系列:存储过程的更多相关文章
- [SQL SERVER系列]存储过程,游标和触发器实例[原创]
自己写的存储过程与游标结合使用的实例,与大家分享,也供自己查阅,仅供参考: --使用游标循环处理,删除重复的记录 declare @UserID int ) ) declare @UnitFlag i ...
- 在sql server中建存储过程,如果需要参数是一个可变集合怎么处理?
在sql server中建存储过程,如果需要参数是一个可变集合的处理 原存储过程,@objectIds 为可变参数,比如 110,98,99 ALTER PROC [dbo].[Proc_totalS ...
- SQL Server 系列文章快速导航(SWF版)
一.前言 在博客园写博客不自不觉已经有5个年头了,一开始只是为了记录工作中遇到的问题和解决办法,后来写的文章不自不觉的侧重在SQL Server方面的技术文章,在2014年1月终于鼓起勇气申请了微软S ...
- 在易语言中调用MS SQL SERVER数据库存储过程方法总结
Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...
- SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过
SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过 存储过程 创建存储过程 use pubs --pubs为数据库 go create proc ...
- SQL Server中存储过程 比 直接运行SQL语句慢的原因
问题是存储过程的Parameter sniffing 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1. 存储过程只在创造时进行编译即可,以后每次执行存储过 ...
- ADO.NET访问SQL Server调用存储过程带回参
1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...
- SQL Server 优化存储过程的七种方法
原文:SQL Server 优化存储过程的七种方法 优化存储过程有很多种方法,下面介绍最常用的7种. 1.使用SET NOCOUNT ON选项 我们使用SELECT语句时,除了返回对应的结果集外,还会 ...
- SQL Server中的CLR编程——用.NET为SQL Server编写存储过程和函数
原文:SQL Server中的CLR编程--用.NET为SQL Server编写存储过程和函数 很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之 ...
随机推荐
- spark 2.0 中 pyspark 对接 Ipython
pyspark 2.0 对接 ipython 在安装spark2.0 后,以往的对接ipython方法失效,会报如下错错误: 因为在spark2.0后对接ipython的方法进行了变更我们只需要在py ...
- [翻译] ORMLite document -- Getting Started
前言 此文档翻译于第一次学习 ORMLite 框架,如果发现当中有什么不对的地方,请指正.若翻译与原文档出现任何的不相符,请以原文档为准.原则上建议学习原英文文档. ----------------- ...
- CentOS 7.x设置自定义开机启动,添加自定义系统服务
Centos 系统服务脚本目录: /usr/lib/systemd/ 有系统(system)和用户(user)之分, 如需要开机没有登陆情况下就能运行的程序,存在系统服务(system)里,即: /l ...
- 【JBOSS】User not found SA
启动JBOSS 发现报User not found: SA 错误, 找了老半天才找到处理方法,异常日志如下: java.sql.SQLException: User not found: SA at ...
- jquery 获取奇数索引的元素
$(".btn-xs:odd").click(function(){ var $buy_num=$(this).prev("#buy_num").val(); ...
- STM32之通用定时器
广大的互联网的大家早上中午晚上..又好..没错了..我又来了..写博客不是定时的..为什么我要提写博客不是定时的呢??聪明的人又猜到我要说什么了吧.有前途.其实我还是第一次听到定时器有通用和高级之分的 ...
- THINKPHP之连接数据库(全局配置)
- 【http代理报文】通过发包实现代理请求网页内容
工作中,我们难免需要通过TCP/IP协议发送报文来直接请求网页内容(比如爬虫工具),有同学问如何通过HTTP代理来请求网页,其实我们只需要把报文稍稍修改下,发送给代理服务器即可实现. 基础不过关的朋友 ...
- JS的面向对象编程一:封装
Javascript是一种基于对象的语言,但它又没有class.这在很长的一段时间里,对JS的面向对象编程的概念很模糊,在编程的时候时有用到,但要说个所以然,却说不出来,所以看了些书,又在网上查了些资 ...
- jQuery中事件与动画的总结
1.加载DOM 1.1.window事件 window.onload=function(){}.... 时机:其他资源都加载完毕后,再执行 $(function(){}) ……:只是 ...