SQL Server 中的存储过程2025年3月17日 | 阅读 10 分钟 存储过程是**一组预编译的 SQL 语句**,被组合成一个逻辑单元。它作为对象存储在数据库服务器内部。在通用计算语言中,它是一个子程序或子程序,已在数据库中创建并存储。SQL Server 中的每个过程总是**包含名称、参数列表和 Transact-SQL 语句**。SQL 数据库服务器将存储过程存储为**命名对象**。我们可以使用触发器、其他过程和应用程序(如 Java、Python、PHP 等)来调用过程。它几乎支持所有关系数据库系统。 SQL Server 在存储过程首次调用时构建执行计划,并将其存储在缓存内存中。SQL Server 在后续执行存储过程时会重用该计划,从而使其运行得更快、更高效。 SQL Server 中存储过程的特点以下是 SQL Server 中存储过程的特点
存储过程的类型SQL Server 主要将存储过程分为两类
用户定义的存储过程用户定义的存储过程由数据库开发人员或数据库管理员构建。这些过程提供一个或多个 SQL 语句,用于从数据库表中选择、更新或删除数据。用户指定的存储过程接受输入参数并返回输出参数。DDL 和 DML 命令在用户定义的过程中一起使用。 我们可以将此过程进一步分为两类
系统存储过程服务器的管理任务主要依赖于系统存储过程。安装 SQL Server 时,它会创建系统过程。系统存储过程可防止管理员直接查询或修改系统和数据库目录表。开发人员通常会忽略系统存储过程。 SQL Server 存储过程语法以下是在 SQL Server 中创建存储过程的基本语法 参数解释存储过程语法具有以下参数 Schema_name:这是你的数据库或模式的名称。默认情况下,过程与当前数据库相关联,但我们也可以通过指定 DB 名称将其创建到另一个数据库中。 Procedure_Name:它代表你的存储过程的名称,应该是易于识别的名称,以便你能够快速识别它们。它不能是系统保留关键字。 Parameter_Name:它代表参数的数量。根据用户要求,可以为零个或多个。我们必须确保使用了合适的数据类型。例如,@Name VARCHAR(50)。 存储过程中的 SET NOCOUNT ON在某些情况下,我们在存储过程中使用 SET NOCOUNT ON 语句。此语句会阻止显示 SQL 查询受影响行数的提示。NOCOUNT 表示计数已关闭。这意味着如果设置了 SET NOCOUNT ON,将不会出现任何指示受影响行数的提示。 如何执行/调用存储过程?我们可以使用 **EXEC 命令** 来调用/执行 SQL Server 中的存储过程。以下语法说明了存储过程的执行 如果我们使用 SSMS,我们需要使用以下步骤来执行存储过程
存储过程简单示例我们可以通过两种方式在 SQL Server 中创建存储过程
我们将使用一个**学生表**来演示存储过程示例。此表具有以下数据 ![]() 下面的示例使用 **CREATE PROCEDURE SQL 语句** 创建一个存储过程,该过程按 STUDENT 表中选定数据库的工资递增顺序显示学生列表 在此语法中,**studentList** 是存储过程的名称,**AS** 关键字区分存储过程的头部和主体。对于存储过程中的单个语句,**BEGIN** 和 **END** 关键字是可选的。但是,最好包含它们以使代码更易于理解。 当我们运行此语句时,如果一切正确,将出现以下消息:“**命令已成功完成**。”这表明存储过程已成功编译并保存到数据库系统。 我们可以使用以下命令执行此过程 它将返回如下输出: ![]() 如果我们使用 SSMS,请使用以下步骤创建存储过程 步骤 1:选择数据库 -> 可编程性 -> 存储过程。 ![]() 步骤 2:右键单击“存储过程”文件夹以打开菜单,然后选择“新建” -> “存储过程”选项,如下所示 ![]() 步骤 3:当我们选择“新建存储过程”选项时,我们将获得一个包含默认存储过程模板的新查询窗口。在这里,我们可以添加过程名称、参数(如果存在)以及我们想要使用的 SQL 查询。 如何在 SQL Server 中重命名存储过程?SQL Server 不允许我们更改存储过程的名称。因为重命名存储过程不会更改 **sys.sql_modules** 中相应对象的名称。因此,如果我们想更改现有的存储过程,只需将其删除,然后用新名称重新创建它。 如何在 SQL Server 中修改存储过程?我们需要在一段时间内更新或修改存储过程。SQL Server 允许我们通过两种方式更新或修改现有的存储过程
使用 SSMS 修改存储过程以下步骤有助于了解我们如何修改或更改存储过程 步骤 1:导航到数据库 -> 可编程性 -> 存储过程。 步骤 2:展开“存储过程”文件夹,右键单击要修改的存储过程,然后选择“修改”选项,如下所示 ![]() 步骤 3:单击“修改”选项后,我们将获得一个包含自动生成的 **ALTER PROCEDURE** 代码的新查询窗口。在这里,我们可以根据需要进行更改。 使用 T-SQL 查询修改存储过程SQL Server 提供了 ALTER PROCEDURE 语句来修改现有的存储过程。如果我们想修改上面创建的存储过程,我们可以写 ALTER PROCEDURE 语句如下 让我们运行该过程以检查我们是否成功更新了 **studentList** 过程。使用 EXECUTE 语句,我们将得到以下输出,其中我们可以看到我们的存储过程已成功修改。 ![]() 如何在 SQL Server 中列出所有存储过程?当我们有多个过程时,列出所有过程非常重要。因为有时许多数据库中的过程名称是相同的。在这种情况下,此查询非常有用。我们可以按如下方式列出当前数据库中的所有存储过程 列出数据库中所有用户定义存储过程的最佳方法是使用 **ROUTINES** 信息架构视图,如下所示 或, 返回存储过程列表的另一种方法是查询 **sys.objects** 系统目录视图。 如何删除/丢弃 SQL Server 中的存储过程?我们可以永久删除 SQL Server 中的存储过程。SQL Server 以两种方式删除存储过程
使用 SSMS 丢弃存储过程以下步骤有助于了解我们如何删除存储过程 步骤 1:转到数据库 -> 可编程性 -> 存储过程。 步骤 2:展开“存储过程”文件夹,右键单击要删除的存储过程,然后选择“删除”选项,如下所示 ![]() 步骤 3:单击“删除”选项后,我们将得到一个“删除对象”窗口。我们可以通过单击“显示依赖项”按钮来检查依赖项,然后单击“确定”删除存储过程。 ![]() 使用 T-SQL 查询删除存储过程SQL Server 提供了 DROP PROCEDURE 语句来删除现有的存储过程。我们可以按如下方式编写 DROP PROCEDURE 语句 注意:最好使用 IF OBJECT ID ('procedure name', 'P') IS NOT NULL 来查看存储过程是否存在于数据库中。存储过程中的输入参数SQL Server 允许我们创建输入参数存储过程。这种类型的存储过程可以使我们传递一个或多个参数以获得过滤后的结果。让我们通过示例来理解它。考虑以下“**客户**”表 ![]() 下面的语句创建了一个带输入参数的存储过程 如果我们想执行此存储过程,我们需要为 **@States** 参数传递值。我们可以通过以下任何一种方式传递参数值 我们将得到以下输出: ![]() ![]() 存储过程中的输出参数SQL Server 使我们能够在存储过程中提供多个输出参数。这些输出参数可以是任何有效的数据类型,例如整数、日期或字符。我们可以使用以下语法在存储过程中创建输出参数 让我们通过示例了解如何在存储过程中使用输出参数。下面的语句将创建一个名为 **countStudent** 的过程,在该过程中,我们将声明一个整数类型的变量 **@StudentCount** 并使用 **OUTPUT** 关键字。该过程使用 **COUNT** 函数查找 STUDENT 表中的学生数量,然后将该值分配给输出参数。 现在,我们将执行存储过程。在这里,我们需要按如下方式传递输出参数 **@StudentaCouns** 我们将得到以下输出 ![]() 临时存储过程我们可以像创建临时表一样创建临时过程。tempdb 数据库用于创建这些过程。我们可以将临时过程分为两类
本地临时存储过程:我们可以使用 # 作为前缀来创建这种类型的过程,并且只能在创建它们时所在的会话中访问。当连接关闭时,此过程会立即终止。 这是一个创建本地临时过程的示例 全局临时存储过程:我们可以使用 ## 作为前缀来创建这种类型的过程,并且可以从任何会话访问。当用于创建过程的连接关闭时,此过程会自动终止。 这是一个创建全局临时过程的示例 存储过程的缺点以下是 SQL Server 中存储过程的限制 调试:由于调试存储过程从不简单,因此不建议使用它们编写和执行复杂的业务逻辑。因此,如果我们不能妥善处理,它可能会导致失败。 依赖性:我们知道,专业 DBA 和数据库开发人员在大型组织中处理大量数据集。应用程序开发人员必须依赖他们,因为任何微小的更改都必须引用 DBA,DBA 可以修复现有过程中的错误或构建新过程。 昂贵:存储过程在 DBA 方面管理成本很高,因为组织需要为专业 DBA 支付额外费用。DBA 更胜任处理复杂的数据库过程。 特定于供应商:在一个平台中编写的存储过程无法在另一个平台中运行。由于 Oracle 中编写的过程更复杂,因此我们需要为 SQL Server 重写整个过程。 下一主题SQL Server 中的触发器 |
我们请求您订阅我们的新闻通讯以获取最新更新。