本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中执行存储过程。
可通过两种不同的方法来执行存储过程。 第一种最常见的方法是让应用程序或用户调用该过程。 第二种方法是设置在 SQL Server 实例启动时自动运行的过程。 当应用程序或用户调用过程时,调用中显式声明了 Transact-SQL EXECUTE 或 EXEC 关键字。 或者,如果过程是 Transact-SQL 批处理中的第一个语句,则可以在没有关键字的情况下调用和执行该过程。
本主题内容
准备工作:
若要执行存储过程,请使用:
在您开始之前
局限性与限制
匹配系统过程名称时,将使用调用数据库排序规则。 因此,始终在过程调用中使用系统过程名称的确切大小写。 例如,如果代码是在具有区分大小写排序规则的数据库上下文中执行的,则此代码将失败:
EXEC SP_heLP; -- Will fail to resolve because SP_heLP does not equal sp_help若要显示确切的系统过程名称,请查询 sys.system_objects 和 sys.system_parameters 目录视图。
如果用户定义过程的名称与系统过程相同,则用户定义过程可能永远不会执行。
建议
执行系统存储过程
系统过程会以前缀 sp_ 开头。 由于它们逻辑上存在于所有用户和系统定义的数据库中,因此可以在任何数据库中执行,而无需完整地限定过程名称。 但是,我们建议使用 sys 架构名称限定所有系统过程名称,以防止名称冲突。 以下示例演示了调用系统过程的建议方法。
EXEC sys.sp_who;执行用户定义的存储过程
执行用户定义的过程时,建议使用架构名称限定过程名称。 这种做法可提高性能,因为数据库引擎不必搜索多个架构。 如果数据库的多个架构中存在同名的过程,它还会防止执行错误的过程。
以下示例演示了执行用户定义的过程的建议方法。 请注意,该过程接受一个输入参数。 有关指定输入和输出参数的信息,请参阅 “指定参数”。
USE AdventureWorks2012; GO EXEC dbo.uspGetEmployeeManagers @BusinessEntityID = 50;-或-
EXEC AdventureWorks2012.dbo.uspGetEmployeeManagers 50; GO如果指定了非限定的用户定义过程,数据库引擎将按以下顺序搜索该过程:
当前数据库的 sys 架构。
当调用方在批处理或动态 SQL 中执行时,其默认架构。 或者,如果未限定的过程名称出现在另一个过程定义的正文中,则接下来将搜索包含该其他过程的架构。
当前数据库中的 dbo 架构。
自动执行存储过程
每次 SQL Server 启动时都会执行标记为自动执行的过程,并在该启动过程中恢复 master 数据库。 设置自动执行的过程对于执行数据库维护作或让过程作为后台进程连续运行非常有用。 自动执行的另一个用途是让过程在 tempdb 中执行系统或维护任务,例如创建全局临时表。 这可确保在 SQL Server 启动时重新创建 tempdb 时,始终存在此类临时表。
自动执行的过程使用与 sysadmin 固定服务器角色的成员相同的权限进行操作。 该过程生成的任何错误消息将写入 SQL Server 错误日志。
可以拥有的启动过程数没有限制,但请注意,每个启动过程在执行时都会使用一个工作线程。 如果在启动时必须执行多个过程,但不需要并行执行它们,请使一个过程成为启动过程,并让该过程调用其他过程。 这只使用一个工作线程。
小窍门
不要从自动执行的过程返回任何结果集。 由于过程由 SQL Server 而不是应用程序或用户执行,因此结果集没有地方去。
设置、清除和控制自动执行
只有系统管理员(sa)才能标记自动执行的过程。 此外,该过程必须位于 master 数据库中,由 sa 拥有,并且不能具有输入或输出参数。
使用 sp_procoption 可以:
将现有过程指定为启动过程。
停止在 SQL Server 启动时执行的过程。
安全
有关详细信息,请参阅 EXECUTE AS(Transact-SQL)和 EXECUTE AS 子句(Transact-SQL)。
权限
有关详细信息,请参阅 EXECUTE(Transact-SQL)中的“权限”部分。
使用 SQL Server Management Studio
执行存储过程
在 对象资源管理器中,连接到 SQL Server 数据库引擎的实例,展开该实例,然后展开 “数据库”。
展开所需的数据库,展开 可编程性,然后展开 存储过程。
右键单击所需的用户定义的存储过程,然后单击“ 执行存储过程”。
在“ 执行过程 ”对话框中,为每个参数指定一个值,以及它是否应传递 null 值。
参数
指示参数的名称。数据类型
指示参数的数据类型。输出参数
判断这是否是输出参数。传递空值
将 NULL 作为参数的值传递。价值
调用过程时键入参数的值。若要执行存储过程,请单击“ 确定”。
使用 Transact-SQL
执行存储过程
连接到数据库引擎。
在标准栏中,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。 此示例演示如何执行需要一个参数的存储过程。 该示例将值
6作为参数@EmployeeID来执行uspGetEmployeeManagers存储过程。
USE AdventureWorks2012;
GO
EXEC dbo.uspGetEmployeeManagers 6;
GO
设置或清除自动执行的步骤
连接到数据库引擎。
在标准栏中,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。 此示例演示如何使用 sp_procoption 设置自动执行的过程。
USE AdventureWorks2012;
GO
EXEC sp_procoption @ProcName = '<procedure name>'
, @OptionName = ] 'startup'
, @OptionValue = 'on';
停止自动执行过程
连接到数据库引擎。
在标准栏中,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。 此示例演示如何使用 sp_procoption 来停止自动执行过程。
USE AdventureWorks2012;
GO
EXEC sp_procoption @ProcName = '<procedure name>'
, @OptionValue = 'off';
示例 (Transact-SQL)
另请参阅
指定参数
配置 scan for startup procs 服务器配置选项
EXECUTE (Transact-SQL)
CREATE PROCEDURE(Transact-SQL)
存储过程(数据库引擎)