Database-存储过程学习[1]
最近在做项目的过程中遇到了存储过程的编写,在之前的数据库开发中,还从来没有接触过Stored Procedure,所以打算开一个专题来记录一下我学习存储过程的过程(好拗口)。
存储过程
存储过程是由一个或多个 Transact-SQL 语句或对 Microsoft .NET Framework 公共语言运行时 (CLR) 方法的引用构成的一个组。按照我目前的理解,Stored Procedure是一群SQL的集合,放在一个方法中。某些业务逻辑可以交给数据库开发人员,将某一个存储/取值的过程建立一个方法,利用方法完成一系列的SQL操作,减轻业务开发人员的负担。我认为这样的优势在于:
- 多个SQL语句的集合完成某一存储过程,将部分需要调用大量SQL的业务逻辑交给数据库完成。
- 由于存储过程是一次编译,在之后的执行中,比使用ODBC调用多条SQL会有更高的性能。
- 面向对象的方法处理SQL存储过程
下面举个例子:
USE AdventureWorks2012; GO CREATE PROCEDURE HumanResources.uspGetEmployeesTest2 --建立存储过程HumanResources.uspGetEmployeesTest2 @LastName nvarchar(50), --参数1,LastName @FirstName nvarchar(50) --参数2,FirstName AS SET NOCOUNT ON; --存储过程不返回记数 SELECT FirstName, LastName, Department FROM HumanResources.vEmployeeDepartmentHistory WHERE FirstName = @FirstName AND LastName = @LastName AND EndDate IS NULL; --存储过程中需要执行的SQL语句 GO
这是MSDN上最简单的Stored Procedure,包含一个SQL语句。执行这一个步骤与SQL语句:
SELECT FirstName, LastName,Department FROM HumanResources.vEmployeeDepartmentHistory WHERE FirstName = ? AND LastName = ?;
效果几乎等同,但使用存储过程的好处是,我们不需要业务开发人员额外开发DAO来获取FirstName和LastName信息。DBA就像编写脚本一样编写存储过程,业务开发人员只需要执行存储过程存取数据即可。
调用存储过程
在上一个例子中,在数据库HumanResources中建立了useGetEmployeesTest2这个存储过程,将存储过程编译之后,我们可以在SQL Server Management Studio中数据库=>可编程性=>存储过程
中找到编译后的存储过程useGetEmployeesTest2.
执行存储过程的SQL是:
USE [DBName]; EXEC [ProcedureName] @param1 = [paramValue1], @param2 [paramValue2] ... ; GO;
那么,执行useGetEmployeesTest2这个存储过程的SQL可以这么写:
USE HumanResources; GO; EXEC useGetEmployeesTest2 @LastName = 'Wu', @FirstName = 'Richard';
这样就找到了姓名’Richard Wu’的FirstName, LastName, Department
。
修改存储过程
此时,存储过程已经编译完毕,假如说某一天业务需求发生变化,或是数据库发生变化,需要修改存储过程逻辑怎么办?这时候我们可以选择再新建一个符合业务需求的存储过程。当然,修改原来的存储过程会更好。
变更useGetEmployeesTest2的需求,此时,我们不仅仅要找出Department,还需要找出Age。
USE AdventureWorks2012; ALTER PROCEDURE HumanResources.uspGetEmployeesTest2 --修改存储过程HumanResources.uspGetEmployeesTest2 @LastName nvarchar(50), --参数1,LastName @FirstName nvarchar(50) --参数2,FirstName AS SET NOCOUNT ON; --存储过程不返回记数 SELECT FirstName, LastName, Department, Age FROM HumanResources.vEmployeeDepartmentHistory WHERE FirstName = @FirstName AND LastName = @LastName AND EndDate IS NULL; --存储过程中需要执行的SQL语句 GO
可以看到,存储过程也是一个实体,用ALTER语句修改其内容。
后面的任务
在熟悉了存储过程的编写,编译,执行后,接下来的步骤就是熟悉存储过程的基本语法啦。在这里~~挖坑~~……等下一篇
One thought on “Database-存储过程学习[1]”