Database-存储过程学习[1]

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]

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据