适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

本文介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中执行存储过程。

有两种不同方法执行存储过程。 第一种方法和最常见的方法供应用程序或用户调用过程。 第二种方法是将过程设置为在启动 SQL Server 实例时自动运行。 当应用程序或用户调用过程时,调用中显式声明了 Transact-SQL EXECUTE 或 EXEC 关键字。 如果过程是 Transact-SQL 批处理中的第一条语句,那么不使用关键字 EXEC 也可调用并执行此过程。

限制和局限

与系统过程名称匹配时使用调用数据库排序规则。 因此,在过程调用中始终使用系统过程名称的正确大小写形式。 例如,如果在具有区分大小写排序规则的数据库上下文中执行,则此代码将失败:

EXEC SP_heLP; -- Will fail to resolve because SP_heLP does not equal sp_help  

若要显示确切的系统过程名称,请查询 sys.system_objectssys.system_parameters 目录视图。

如果用户定义的过程与系统过程同名,则可能不会执行用户定义的过程。

执行系统存储过程

系统过程以前缀 sp_ 开头。 因为从逻辑意义上讲,这些过程出现在所有用户定义的数据库和系统定义的数据库中,所以可以从任何数据库执行这些过程,而不必完全限定过程名称。 但是,建议使用 sys 架构名称对所有系统过程名称进行架构限定,以防止名称冲突。 以下示例说明调用系统过程的推荐方法。

EXEC sys.sp_who;  

执行用户定义存储过程

当执行用户定义的过程时,我们建议使用架构名称限定过程名称。 这种做法使性能得到小幅提升,因为 数据库引擎 不必搜索多个架构。 如果某个数据库在多个架构中具有同名过程,则这还可以防止执行错误的过程。

以下示例说明执行用户定义过程的推荐方法。 请注意,此过程接受一个输入参数。 有关指定输入参数和输出参数的信息,请参阅 指定参数

USE AdventureWorks2019;  
EXEC dbo.uspGetEmployeeManagers @BusinessEntityID = 50;
EXEC AdventureWorks2019.dbo.uspGetEmployeeManagers 50;  

如果指定了非限定的用户定义过程,则 数据库引擎 按以下顺序搜索此过程:

  • sys 架构。

  • 调用方的默认架构(如果它在批处理或动态 SQL 中执行)。 或者,如果非限定的过程名称出现在另一个过程定义的主体中,则接着搜索包含后一过程的架构。

  • 当前数据库中的 dbo 架构。

    自动执行存储过程

    在每次启动 SQL Server 时将执行标记为自动执行的过程,并在启动过程期间中恢复 master 数据库。 将这些过程设置为自动执行对执行数据库维护操作或使这些过程作为后台进程连续运行很有用。 自动执行的另一个用途是使该过程执行 tempdb 中的系统或维护任务,如创建一个全局临时表。 这将确保在 SQL Server 启动过程中重新创建 tempdb 时,始终存在这样一个临时表。

    自动执行的过程使用与固定服务器角色 sysadmin 的成员相同的权限进行操作。 该过程生成的所有错误消息都将写入 SQL Server 错误日志。

    虽然对启动过程的数目没有限制,但是请注意,在执行时每个启动过程将占用一个工作线程。 如果必须在启动时执行多个过程,但不需要并行执行,则可以指定一个过程作为启动过程,让该过程调用其他过程。 这样就只占用一个工作线程。

    请勿从自动执行的过程中返回任何结果集。 因为该过程是由 SQL Server 而不是由应用程序或用户执行的,所以结果集将无处可去。

    设置、清除和控制自动执行

    只有系统管理员 (sa) 可以将过程标记为自动执行。 另外,该过程必须在 sa 拥有的 master 数据库中,而且不能有输入或输出参数。

    使用 sp_procoption 可以:

  • 将现有过程指定为启动过程。

  • 阻止过程在 SQL Server 启动时执行。

    有关详细信息,请参阅 EXECUTE AS (Transact-SQL)EXECUTE AS 子句 (Transact-SQL)

    有关详细信息,请参阅 EXECUTE (Transact-SQL) 中的“权限”部分。

    使用 SQL Server Management Studio

    始终使用最新版本的 SQL Server Management Studio (SSMS)

    执行存储过程

  • “对象资源管理器” 中,连接到 SQL Server 数据库引擎的实例,再依次展开该实例、 “数据库”

  • 展开所需的数据库,然后依次展开 “可编程性”“存储过程”

  • 右键单击所需的用户定义存储过程,然后选择“执行存储过程”。

  • “执行过程” 对话框中,为每个参数指定一个值以及它是否应传递 Null 值。

    Parameter
    指示参数的名称。

    指示参数的数据类型。

    指示是否为输出参数。

    将 NULL 作为参数值传递。

    在调用过程时键入参数的值。

  • 若要执行存储过程,请选择“确定”。

    使用 Transact-SQL

    执行存储过程

  • 连接到 数据库引擎。

  • 在“标准”工具栏中,选择“ 新建查询”。

  • 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。 此示例演示如何执行应有一个参数的存储过程。 该示例使用指定为 @EmployeeID 参数的值6执行uspGetEmployeeManagers存储过程。

    USE AdventureWorks2019;  
    EXEC dbo.uspGetEmployeeManagers 6;  
    

    设置或清除自动执行的过程

    启动过程必须位于 master 数据库中,并且不能包含 INPUT 或 OUTPUT 参数。 所有数据库恢复后将开始执行存储过程,并在开始时记录“恢复已完成”消息。

    有关详细信息,请参阅 sp_procoption (Transact-SQL)

  • 连接到 数据库引擎。

  • 在“标准”工具栏中,选择“ 新建查询”。

  • 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。 此示例演示如何使用 sp_procoption 设置过程自动执行。

    EXEC sp_procoption @ProcName = N'<procedure name>'   
        , @OptionName = 'startup'   
        , @OptionValue = 'on';
    

    阻止过程自动执行

  • 连接到 数据库引擎。

  • 在“标准”工具栏中,选择“ 新建查询”。

  • 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。 此示例说明如何使用 sp_procoption 阻止过程自动执行。

    EXEC sp_procoption @ProcName = N'<procedure name>'      
        , @OptionName = 'startup'
        , @OptionValue = 'off';
    
  • EXECUTE (Transact-SQL)
  • CREATE PROCEDURE (Transact-SQL)
  • 存储过程(数据库引擎)
  • sp_procoption (Transact-SQL)
  • 配置 scan for startup procs 服务器配置选项
  •