使用存储过程

该部分将向你介绍如何创建和使用你自己的存储过程。在SQL Server中存储过程是和传统的计算机应用程序最相近的事物，并具有如下的优点：

> 假如你有一套复杂的SQL语句需要在多个Active Server Pages中执行。你可以把他们放入一个存储过程，然后执行该存储过程。这能够减少你Active Server Pages的大小。同时还能确保在每一页上执行的SQL语句都相同。

> 当你执行一个SQL的批处理时。服务器首先必须编译在批处理中的所有语句。这不但需要时间，还要花费服务器资源。相比较而言，在存储过程第一次执行后，它就不需要重新编译了。通过使用存储过程，你可以跨过编译这一步，更快地执行SQL语句集合。从一个Active Server页中执行一个存储过程比执行一个SQL语句的集合更有效。

> 你可以对存储过程输入输出值。这意味着存储过程非常的灵活，相同的存储过程可以根据不同的输入值返回不同的信息。

> 当你向数据库服务器传递一个SQL语句集合时，必须传递其中的每一个独立语句，而当你执行存储过程时，相反的，仅仅传递一个简单的语句。通过使用存储过程，你可以减少在网络上的阻塞。

> 你可以配置表的权限，比如用户只能通过使用存储过程来修改表。这就能增加在你数据库中表的安全性。

> 你可以在其他的存储过程内部执行你的存储过程。这种策略就允许你在非常小的存储过程上建立非常复杂的存储过程。这也意味着你可以为许多不同的编程任务使用相同的存储过程。

当你在Active Server页中添加SQL语句时，你必须仔细考虑能否把这些语句放置到存储过程中。上面提到的优点都是实质性的。如下一部分所示，存储过程是非常容易创建的。

使用CREATE PROCEDURE创建存储过程

你可以使用CREATE PROCEDURE来创建一个存储过程。下面就是一个非常简单的存储过程的一个例子：

CREATE PROCEDURE retrieve_authors AS SELECT * FROM Authors

当你创建存储过程时，你必须给它指定一个名称。在本例子中，存储过程的名称为retrieve_authors。你可以给存储过程赋予任何你想要的名称，但最好你能够使该名称在一定程度上描述存储过程的功能。

每一个存储过程都包括一个或多个SQL语句。为了指明是存储过程一部分的SQL语句，你只需简单地在关键词AS后面包含它们。在前面例子中的存储过程只包含一个SQL语句。当该存储过程执行时，它返回在Authors表中所有的记录。

你可以使用EXECUTE语句来执行一个存储过程。比如，为了执行retrieve_authors存储过程，你可以使用如下的语句：

EXECUTE retrieve_authors

当你执行该存储过程时，所有包括在其中的SQL语句都会执行，在上面的例子中，会返回所有在Authors表中的记录。

当在批处理中的第一个语句是调用存储过程时，你并不需要使用EXECUTE语句。你可以简单地提供存储过程的名称来执行存储过程。比如在ISQL/W中，可以象下面所示来执行存储过程：

retrieve_authors

这起同样的作用。存储过程会被执行，并会返回结果。然而如果在该存储过程之前还有其他的任何语句，你就会收到错误信息（一般地，语法错误）。

当你创建和执行一个存储过程时，这仅仅是在某一个数据库的范围内完成。假设你在数据库MyDatabase内创建了存储过程retrieve_authors。如果没有指明过程调用，你就不能在另一个数据库比如MyDatabase2中调用存储过程retrieve_authors。假如你需要在Mydatabase2中执行存储过程retrieve_authors，你必须使用如下的语句（注意下面的两个点号）：

EXECUTE Mydatabase..retrieve_authors

一旦你已经创建了一个存储过程，你就能使用系统存储过程sp_helptext来观看在该存储过程的的SQL语句。比如，如果你输入命令sp_helptext retrieve_authors，就会显示下面的结果：

text

……………………………………………

CREATE PROCEDURE retrieve_authors AS SELECT * FROM Authors

注意

你可能感到奇怪的是，

sp_helptext系统过程本身就是一种存储过程类型。它是一种系统的存储过程。（系统存储过程存储在Master数据库中，能够被所有的数据库访问。）为了满足你的好奇心，你可以使用命令sp_helptext sp_helptext来观看组成sp_helptext本身的SQL语句。

你在创建完存储过程后，不能对其进行修改。假如你需要修改一个存储过程。你必须首先破坏它，然后重新构建之。为了破坏一个存储过程。你可以使用DROP PROCEDURE语句，例如下面的语句删除retrieve_authors存储过程：

DROP PROCEDURE retrieve_authors

注意

你可以使用系统存储过程sp_help来观看在当前数据库中所有存储过程的列表。假如你不加任何修改地执行了sp_help。该过程会显示在当前数据库中所有的存储过程、触发器和表。假如在sp_help后面跟上指定的存储过程，sp_help会仅仅显示那个存储过程的信息。