第12章 存储过程的应用
🎉学习指引
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储过程时数据库中的一个重要对象,它代替了传统的逐条执行SQL语句的方式。本章就来介绍数据库的存储过程,主要内容包括创建、调用、查看、修改、删除存储过程等。
12.1存储过程概述
存储过程可以重复调用,当存储过程执行一次后,可以将语句缓存,这样下次执行的时候直接使用缓存中的语句,就可以提高存储过程的性能。
12.1.1 什么是存储过程
存储过程是一组为了完成特定功能的SQL语句的集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。存储过程中可以包含逻辑控制语句和数据操作语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。
由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行比单个的SQL语句块要块。同时由于在调用时只需要提供存储过程名称和必要的参数信息,所以在一定程度上也可以减少网络流量、减轻网络负担。
12.1.2 存储过程的优点
相对于直接使用SQL语句,在应用程序中直接调用存储过程具有以下好处。
- 存储过程允许标准组件式编程
存储过程创建后可以在程序中被多次调用执行,而不必重新编写相同的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大地提高了程序的可移植性。
- 存储过程能够实现较快的执行速度
如果操作包含大量的SQL代码,分别被多次执行,那么存储过程要比批处理的执行速度更快。因为存储过程时预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。
- 存储过程减轻网络流量
对于同一个针对数据库对象的操作,如果这易操作所涉及的SQL语句被组织称一存储过程,那么挡在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句,从而减轻了网络流量,降低了网络负载。
- 存储过程可被作为一种安全机制来充分利用
系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。
12.1.3 存储过程的缺点
任何一个事物都不是完美的,存储过程也不例外,除了上述的优点外,它还具有以下缺点。
- 数据库移植不方便,存储过程依赖于数据库管理系统,SQL Server存储过程中封装的操作代码不能直接移植到其他的数据库管理系统中。
- 不支持面向对象的设计,无法采用面向对象的方式将逻辑业务进行封装,甚至形成通用的可支持服务的业务逻辑框架。
- 代码可读性差,不易维护。
- 不支持集群。
12.2 存储过程的类型
在SQL Server中,存储过程主要分为自定义存储过程、扩展存储过程和系统存储过程,在存储过程中可以声明变量、执行条件判断语句等其他编程功能。
12.2.1 系统存储过程
系统存储过程是由SQL Server系统自身提供的存储过程,可以作为命令执行各种操作。
例如,sp_rename系统存储过程,可以更改当前数据库中用户创建对象的名称;
例如,sp_helptext系统存储过程,可以显示规则、默认值或视图的文本信息等;
SQL Server服务器中许多的管理工作都是通过执行系统存储过程来完成的,许多系统信息也可以通过执行系统存储过程来获得。系统存储过程位于数据库服务器中,并且以sp_开头。系统存储过程定义再系统定义和用户定义的数据库中,再调用时不必在存储过程前加数据库限定名。
系统存储过程创建并存放于系统数据库master中,一些系统存储过程只能由系统管理员使用,而有些系统存储过程通过授权可以被其他用户所使用。
12.2.2 自定义存储过程
自定义存储过程即用户为了实现某一特定业务需求,在用户数据库中编写的SQL语句集合。用户存储过程可以接受输入参数,向客户端返回结果和信息,返回输出参数等。
创建自定义存储过程时,存储过程名前加上“##”表示创建了一个全局的临时存储过程;存储过程名前加上“#”时,表示创建局部临时存储过程。局部临时存储过程只能在创建它的会话中使用,会话结束时将被删除。这两种存储过程都存储在系统数据库tempdb中。
用户定义存储过程可分为两类:Transact-SQL和CLR。
- Transact-SQL存储过程是指保存的Transact-SQL语句集合,可以接受和返回用户提供的参数。存储过程也可能从数据库向客户端应用程序返回数据。
- CLR存储过程是指引用Microsoft.NET Framework公共语言方法的存储过程,可以接受和返回用户提供的参数,它们在.NET Framework程序集中是作为类的公共静态方法实现的。
12.2.3 扩展存储过程
扩展存储过程是以在SQL Server环境外执行的动态链接(DLL文件)来实现的,可以加载到SQL Server实列运行的地址空间中执行,扩展存储过程可以用SQL Server扩展存储过程API编程,扩展存储过程以前缀“xp_”来标识,对于用户来说,扩展存储过程和普通存储过程一样,可以用相同方法来执行。
12.3 创建存储过程
存储过程时在数据库服务器端执行的一组SQL语句集合,经编译后存放在数据库服务器中,本节就来介绍如何创建存储过程。
12.3.1 在SSMS中创建存储过程
在SSMS中可以使用向导创建存储过程,具体操作步骤如下。
步骤1:启动SSMS并连接到SQL Server数据库,打开SSMS窗口,选择[数据库]-[mydatabase]-[可编程性]结点。在[可编程性]结点下,右击[存储过程]结点,在弹出的快捷菜单中选择[新建]-[存储过程]菜单命令。
步骤2:打开创建存储过程的代码模板,这里显示了CREATE PROCEDURE语句模板,可以修改要创建的存储过程的名称,然后再存储过程中的BEGIN END代码块中添加需要的SQL语句,最后单击“执行”按钮即可创建一个存储过程。
例:创建一个名称为Proc_emp的存储过程,要求该存储过程实现的功能为:在employee表中查询男员工的姓名、当前职位于基本工资,具体操作步骤如下:
(1)在创建存储过程的窗口中选中[查询]-[指定模板参数的值]菜单命令。
(2)弹出“指定模板参数的值”对话框,将Procedure_Name参数对应的名称修改为“Proc_emp”,点击【确定】按钮,即可关闭此对话框。
(3)在创建存储过程的窗口中,将对应的SELECT语句修改为以下语句
SELECT name,job,salary FROM employee WHERE sex='男'
(4)点击【执行】按钮,即可完成存储过程的创建操作。
12.3.2 创建存储过程的语法格式
使用CREATE PROCEDURE 语句可以创建存储过程,语法如下:
CREATE PROCEDURE [schema_name.] procedure_name [; number]
{@parameter data_type}
[VARYING] [= default] [OUT|OUTPUT] [READONLY]
[WITH <[ENCRYPTION]|[RECOMPILE]|[EXECUTE AS Clause]>]
[FOR REPLICATION]
AS <sql_statement>
主要参数说明:
- proedure_name:新存储过程的名称,并且在架构中必须唯一。可在proedure_name前面使用一个#字符号(#prodeure_name)来创建局部临时过程,使用两个#字符号(##proedure_name)来创建全局临时过程。对于CLR存储过程,不能指定临时名称。
- number:是可选整数,用于对同名的过程分组。使用一个DROP PROEDURE语句可将这些分组过程一起删除。例如:称为orders的应用程序可能使用名为orderproc;1、orderproc;2等过程,DROP PROEDURE orderproc语句将删除整个组。如果名称中包含分隔符标识,则数字不应该包含在标识符中;只应在procedure_name前后使用适当的分隔符。
- @parameter:存储过程中的参数。在CREATE PROCEDURE语句中可以声明一个或多个参数。除非定义了参数的默认值或者将参数设置为等于另一个参数,否则用户必须在调用过程时,为每个声明的参数提供值。存储过程最多可以有2100个参数。如果过程包含表值参数,并且该参数在调用中缺失,则传入空表默认值。通过将“@”符号用作第一个字符来指定参数名称。每个过程的参数仅用于该过程本身;其他过程中可以使用相同的参数名称。默认情况下,参数只能代替常量表达式,而不能用于代替表名、列名或其他数据库对象的名称。如果指定了FOR REPLICATION,则无法声明参数。
- data_type:指定参数的数据类型,所有数据类型都可以用作Transact-SQL存储过程的参数。只能将表值参数指定为输入参数,这些参数必须带有READONLY关键字。cursor数据类型只能用于OUTPUT参数。如果指定了cursor数据类型,则还必须指定VARYING和OUTPUT关键字。可以为cursor数据类型指定多个输出参数。对于CLR存储过程,不能指定char\varchar\text\ntext\image\cursor用户定义表类型和table作为参数。
- default:存储过程中参数的默认值。如果定义了default值,则无须指定此参数值即可执行过程。默认值必须是长廊或NULL。如果过程使用带LIKE关键字的参数,则可包含下列通配符:%、_、[]和[^]。
- OUTPUT:指示参数是输出参数。此选项的值可以返回给调用EXECUTE的语句。使用OUTPUT参数将值返回给过程的调用方。除非是CLR过程,否则text\ntext和image参数不能用作OUTPUT参数。使用OUTPUT关键字的输出参数可以为游标占位符,CLR过程除外。不能将用户定义表类型指定为存储过程的OUTPUT参数。
- READONLY:指示不能再过程的主体中更新或修改参数。如果参数类型为用户定义的表类型,则必须指定READONLY。
- RECOMPILE:表明SQL Server不会保存该存储过程的执行计划,该存储过程每执行一次都要重新编译。在使用非典型值或临时值而不希望覆盖保存在内存中的执行计划时,就可以使用RECOMPILE选项。
- ENCRYPTION:表示SQL Server加密后的syscomments表,该表的text字段是包含CREATE PROCEDURE语句的存储过程文本。使用ENCRYPTION关键字无法通过查看syscomments表来查看存储过程的内容。
- FOR REPLICATION:用于指定不能在订阅服务器上执行为复制创建的存储过程。使用此选项创建的存储过程可以用作存储过程筛选,且只能在复制过程中执行。本选项并不能和WITH RECOMPILE选项一起使用。
- AS:用于指定该存储过程要进行的操作
- sql_statement:是存储过程中要包含的任意数目和类型的Transact-SQL语句。但有一些限制
12.3.3 创建不带参数的存储过程
最简单的一种自定义存储过程就是不带参数的存储过程,下面介绍如何创建一个不带参数的存储过程。
例:创建查看mydatabase数据库中employee表的存储过程
CREATE PROCEDURE proc_emp_01
ASSELECT * FROM employee
GO
存储过程创建完成后,直接调用存储过程即可获得对应数据
EXEC proc_emp_01
另外,存储过程可以是很多语句的复杂组合,其本身也可以调用其他函数,来组成更加复杂的操作
例:创建一个获取employee表记录条数的存储过程,名称为count_emp
CREATE PROCEDURE count_emp
ASSELECT COUNT(*) 记录总数 FROM employee
GO
直接调用存储过程
EXEC count_emp
12.3.4 创建带输入参数的存储过程
在设计数据库应用系统时,可能会需要根据用户的输入信息产生对应的查询结果,这时就需要把用户的输入信息作为参数传递给存储过程,即开发者需要创建带有输入参数的存储过程。
例:创建存储过程proc_emp_02,根据输入的员工编码,查询员工的相关信息,
CREATE PROC proc_emp_02
@code int
ASSELECT * FROM employee WHERE code=@code
GO
执行存储过程即可获得员工信息
EXEC proc_emp_02 104
例:创建带默认参数的存储过程proc_emp_03
CREATE PROC proc_emp_03
@code int = 105
ASSELECT * FROM employee WHERE code=@code
GO
执行存储过程,在无参数输入时,即可获得默认编码员工信息
EXEC proc_emp_03
但当执行存储过程带有参数时,可获得输入参数编码的员工信息
EXEC proc_emp_03 107
12.3.5 ★★创建带输出参数的存储过程★★
存储过程中的默认参数类型是输入参数,如果要为存储过程指定输出参数,还要在参数类型后面加上OUTPUT关键字。
例:定义存储过程proc_emp_04,根据用户输入的部门编号,返回该部门中员工的个数,SQL语句如下:
CREATE PROC proc_emp_04
@deptcode INT = 1,
@count INT OUTPUT
ASSELECT @count=COUNT(employee.code) FROM employee WHERE deptcode=@deptcode
GO
输入完成后,点击【执行】按钮,即可完成带输出参数存储过程的创建。
该段代码将创建一个名称为“proc_emp_04”的存储过程,该存储过程中有两个参数,@deptcode为输入参数,指定要查询的员工部门编码号的deptcode,默认值为1,@count为输出参数,用来返回该部门中员工的个数。
12.3.6 创建带加密选项的存储过程
所谓加密选项并不是对存储过程中查询出来的内容加密,而是将创建存储过程本身的语句加密,通过对创建过程的加密,可以在一定程度上保存存储过程中用到的表信息,同时也能提高数据的安全性。
带加密选项的存储过程使用的是with encryption。
例:定义带加密选项的存储过程proc_emp_05,查询员工姓名,职位,工资
CREATE PROC proc_emp_05
WITH ENCRYPTION
AS
BEGINSELECT name,job,salary FROM employee
END
12.4 执行存储过程
当存储过程创建完毕后,下面就可以执行存储过程了,本节就来介绍执行存储过程的方法。
12.4.1 执行存储过程的语法
在SQL Server中执行存储过程时,需要使用EXECUTE语句,如果存储过程是批处理中的第一条语句,那么不使用EXECUTE关键字也可以执行该存储过程,EXECUTE语法格式如下:
[{EXEC|EXECUTE}]{[@return_status = ]{module_name [; number]|@module_name_var}[[@parameter = ] {value|@variable|[OUTPUT]|[DEFAULT]}][,...n][WITH RECOMPILE]}
主要参数说明:
- @return_status:可选的整型变量,存储模块的返回状态。这个变量在用于EXECUTE语句前,必须在批处理、存储过程或函数中声明过。在用于调用标量值用户定义函数时,它的类型可以定义任意标量数据类型。
- module_name:是要调用的存储过程的完全限定或者不完全限定名称。用户可以执行在另一数据库中创建的模块,只要运行模块的用户拥有此模块或具有在该数据库中执行该模块的适当权限。
- number:可选整数,用于对同名的过程分组。该参数不能用于扩展存储过程。
- @module_name_var:是局部定义的变量名,代表模块名。
- @parameter:存储过程中使用的参数,与在模块中定义的相同。参数名称前必须加上符号@。在与@parameter_name=value格式一起使用时,参数名和常量不必按他们在模块中定义的顺序提供。但是,如果对任何参数使用了@parameter_name=value格式,则对所有后续参数都必须使用此格式。默认情况下,参数可以为空值。
- value:传递给模块或传递命令的参数值。如果参数名称没有指定,参数值必须以在模块中定义的顺序提供。
- @variable:是用来存储参数或返回参数的变量。
- OUTPUT:指定模块或命令字符串返回一个参数。该模块或命令字符串中的匹配参数也必须使用关键字OUTPUT创建。使用游标变量作为参数时使用该关键字。
- DEFAULT:根据模块的定义,提供参数的默认值。当模块需要的参数值没有定义默认值并且缺少参数或制定了DEFAULT关键字时,会出现错误。
- WITH RECOMPILE:执行模块后,强制编译、使用和放弃新计划。如果该模块存在现有查询计划,则该计划将保留在缓存中。如果所提供的参数为非典型参数或者数据有很大的改变,使用该选项。该选项不能用于扩展存储过程。建议尽量少使用该选项,因为它消耗较多的系统资源。
12.4.2 执行不带参数的存储过程
存储过程创建完成后,可以通过EXECUTE语句来执行,该命令可以简写为EXEC。
例:执行不带参数的存储过程proc_emp_01,来查看员工信息
EXEC proc_emp_01
单击【执行】按钮,即可完成执行不带参数存储过程的操作,这里时查询员工信息表。
💡提示:
EXECUTE语句的执行是不需要认可权限的,但是操作EXECUTE字符串内引用的对象是需要相应的权限的,例如,如果要使用DELETE语句执行删除操作,则调用EXECUTE语句执行存储过程的用户必须具有DELETE权限。
12.4.3 执行带输入参数的存储过程
执行带参数的存储过程时,SQL Server提供了如下两种传递参数的方式。
- 直接给出参数的值,当有多个参数时,给出的参数的顺序与创建存储过程的语句中的参数顺序要一致,即参数传递的顺序就是定义的顺序;
- 使用“参数名=参数值”的形式给出参数值,这种传递参数的方式好处是,参数可以按任意顺序给出。
例:执行带输入参数的存储过程Proc_emp_02,根据输入的员工编码,查询员工信息,这里员工编码可以自行定义,如这里定义的员工编码为104,SQL语句如下:
EXEC proc_emp_02 104
例:执行带输入参数的存储过程proc_emp_03,根据输入的员工编码,查询员工信息,这里员工编码可以自定义,如这里定义的员工编码为107,SQL语句如下:
EXEC proc_emp_03 107
💡提示:
执行带有输入参数的存储过程时需要指定参数,如果没有指定参数,系统会提示错误,如果希望不给出参数时存储过程也能正常运行,或者希望为用户提供一个默认的返回结果,可以通过设置参数的默认值来实现。
存储过程proc_emp_03就是这样一个带有默认返回结果的存储过程,其参数的默认值设置为了105,这样在不带任何输入参数的前提下,会返回编码为105的员工信息。
12.4.4 执行带输出参数的存储过程
执行带输出参数的存储过程,既然有一个返回值,为了接收这一返回值,需要一个变量来存放返回参数的值,同时,在执行这个存储过程时,该变量必须加上OUTPUT关键字来声明。
例:执行带输出参数的存储过程proc_emp_04,并将返回结果保存到@my变量中。
declare @dept int =2
declare @my int
exec proc_emp_04 @dept,@my output
select '部门'+str(@dept)+'中总计'+str(@my)+'名员工'
糟糕!!!
输出结果怎么有空格?别急,用我们在第一篇《基础知识》的第5章《SQL函数应用基础》的第5.2.7小节中学习的去除字符串左边空格函数LTRIM()来搞定它。
declare @dept int =3
declare @my int
exec proc_emp_04 @dept,@my output
select '部门'+ltrim(str(@dept))+'中,总计'+ltrim(str(@my))+'名员工'
💡提示:
如果这里输入的部门不存在,则返回的员工数为0;
12.4.5 在SSMS中执行存储过程
除了使用SQL语句执行存储过程之外,还可以在SSMS中以界面方式执行存储过程,具体步骤如下。
- 右击存储过程名称,在弹出的快捷菜单中选中“执行存储过程”菜单命令;
- 打开“执行过程”窗口,在“值”列中输入参数值:@deptcode=3;
- 单击【确定】按钮执行带输入参数的存储过程。
12.5 修改存储过程
修改存储过程可以改变存储过程当中的参数或者语句,可以通过SQL语句中的ALTER PROCEDURE语句来实现,还可以在SSMS中以界面方式修改存储过程。
12.5.1 修改存储过程的语法
使用ALTER PROCEDURE语句可以修改存储过程,在修改存储过程时,SQL Server会覆盖以前定义的存储过程,语法格式如下:
ALTER PROCEDURE [schema_name.] procedure_name[; number]
{@parameter date_type}
[CARYING][=default][OUT|OUTPUT][READONLY]
[WITH <[ENCRYPTION]|[RECOMPILE]|[EXECUTE AS Clause]>]
[FOR REPLICATION]
AS <sql_statement>
💡提示:
除了ALTER关键字外,这里其他的参数与CREATE PROCEDURE中的参数作用相同。
12.5.2 使用SQL语句修改存储过程
使用SQL语句可以修改存储过程,下面给出一个实例,来介绍使用SQL语句修改存储过程的方法。
例:修改存储过程count_emp,按照deptment进行分组。
我们可以已经忘记了存储过程count_emp的代码,我们先一起来复习一下:
- 在存储过程名称上右击,弹出的快捷菜单上选择编写存储过程脚本为(S),再二级菜单中选中ALTER到(A),再三级菜单中选中新查询编辑器窗口;
- 系统读取存储过程的窗口;
- 读取完毕后,将代码展示在查询窗体中;
通过代码可知,该存储过程是一个统计表employee中总共有多少条记录数的这样一段代码,并且没有输入输出参数。
我们运行试试看:
EXEC count_emp
返回结果显示,表中总共有15条记录。
那我们现在需要它的显示结果根据部门来分组,我们应该怎样更改呢?
回到我们查询代码的窗体,直接在select语句最后,加上分组条件,并执行一次,显示成功完成即修改成功。
我们再来执行一次存储过程,查看结果的变化
12.5.3 在SSMS中修改存储过程
💡提示:
直接修改的话,可以右键存储过程名称,直接点击修改即可进入代码编辑界面。无论是SQL代码修改还是SSMS中修改,最后都会到代码界面,直接修改代码。
这里就不再赘述。
12.6 重命名存储过程
重命名存储过程可以修改存储过程的名称,这样可以规避不符合命名规则的存储过程名称,也可以加上同一的前缀方便不同的开发者阅读。
12.6.1 在SSMS中重命名存储过程
重命名存储过程可以在SSMS中以界面方式来轻松完成。
右击存储过程名称,在快捷菜单中选中重命名菜单命令,然后直接在文本框中输入新的名称,按ENTER键确认即可。
💡提示:
除了回车确认修改外,还可以在其他空白处单击鼠标,也能完成对新名称的确认;
修改名称除了上面的方法外,还有以下几个可供选择:
(1)非连贯性的双击,在选中一个存储过程名称后,间隔一小段时间,再次单击该存储过程;
(2)快捷键,在选中一个存储过程名称后,直接按F2键。
12.6.2 使用sp_rename系统存储过程重命名
使用系统存储过程sp_rename也可以重命名存储过程,语法如下:
sp_rename oldObjectName,newObjectName
主要参数:
- oldObjectName:存储过程的旧名称
- newObjectName:存储过程的新名称
例:重命名存储过程proc_emp为“proc_emp_00”
sp_rename proc_emp,proc_emp_00
12.7 查看存储过程
创建完存储过程之后,需要查看修改后的存储过程内容,查询存储过程有两种方法,一种是使用SSMS对象资源管理器查看,一种是使用T-SQL语句查看。
12.7.1 使用SSMS查看存储过程
在SSMS中可以以界面方式查看存储过程信息,具体的操作步骤如下:
- 在SSMS中选择“数据库”结点下创建存储过程的数据库,选择“可编程性”➡“存储过程”结点,右键快捷菜单中选择“属性”命令。
- 弹出“存储过程属性”窗口,用户即可查看存储过程的具体属性。
12.7.2 使用系统存储过程查看信息
许多系统存储过程、系统函数和目录视图都提供有关存储过程的信息,可以使用这些系统存储过程来查看存储过程的定义,即用于创建存储过程的T-SQL语句。可以通过下面三种系统存储过程和目录视图查看存储过程。
12.7.2.1 使用sys.sql_modules查看存储过程的定义
sys.sql_modules为系统视图,通过该视图可以查看数据库中的存储过程。
例:查看存储过程count_emp相关信息
select * from sys.sql_modules
12.7.2.2 使用OBJECT_DEFINITION查看存储过程的定义
返回指定对象定义的T-SQL源文本,语法格式如下:
SELECT OBJECT_DEFINITION(OBJECT_ID)
- OBJECT_ID:为要使用的对象的ID,数据类型为int,并假定表示当前数据库上下文中的对象。
例:使用OBJECT_DEFINITION查看存储过程count_emp的定义
SELECT OBJECT_DEFINITION(OBJECT_ID('count_emp'))
12.7.2.3 使用sp_helptext查看存储过程的定义
显示用户定义规则的定义、默认值、未知值、未加密的T-SQL存储过程、用户定义T-SQL函数、触发器、计算列、CHECK约束、视图或系统对象,语法格式如下:
sp_helptext[@objname=]'name'[,[@columnname=]computed_column_name]
主要参数说明:
- [@objname=]'name':架构范围内的用户定义对象的限定名称和非限定名称。
- [[@columnname=]computed_column_name]:要显示定义信息的计算列的名称,必须将包含列的表指为name。column_name的数据类型为sysname,无默认值。
例:通过sp_helptext系统存储过程查看名为count_emp的相关信息。
EXEC sp_helptext count_emp
12.8 删除存储过程
不需要的存储过程可以删除,删除存储过程有两种方法,一种是通过SSMS,另一种则是通过T-SQL语句。
12.8.1 在SSMS中删除存储过程
删除存储过程可以对象资源管理中轻松完成。具体步骤如下:
- 右键存储过程名称,在快捷菜单中选择“删除”命令;
- 在“删除对象”窗口中,单击“确定”按钮,完成存储过程的删除。
💡提示:
使用SSMS一次只能删除一个存储过程
12.8.2 使用SQL语句删除存储过程
使用DROP PROCEDURE语句可以从当前数据中删除一个或多个存储过程。语法如下:
DROP {PROC|PROCEDURE} {[schema_name.] procedure} [,...n]
主要参数说明:
- schema_name:存储过程所属架构的名称。不能指定服务器名称或数据库名称。
- procedure:要删除的存储过程或存储过程组的名称。
例:删除存储过程count_emp,使用sql语句
DROP PROCEDURE dbo.count_emp
12.9 扩展存储过程
扩展存储过程使用户能够在编程语言(如C\C++)中创建自己的外部程序。扩展存储过程的显示方式和执行方式与常规存储过程一样,可以将参数传递给扩展存储过程,且扩展存储过程也可以返回结果和状态。
扩展存储过程时SQL Server实例可以动态加载和运行的DLL,使用SQL Server扩展存储过程API编写的,可直接在SQL Server实例的地址空间中运行。
SQL Server中常规扩展存储过程如下表:
名称 | 说明 |
xp_enumgroups | 提供Windows本地组列表或在指定Windows域中定义的全局组列表 |
xp_findextmsg | 接受输入的邮件ID并返回输出的邮件ID,需要与xp_processmail配合使用 |
xp_grantlogin | 授予Windows组或用户对SQL Server的访问权限 |
xp_logevent | 将用户定义消息记入SQL Server日志文件和Windows事件查看器 |
xp_loginconfig | 报告SQL Server实例在Windows上运行时的登录安全配置 |
xp_logininfo | 报告账户、账户类型、账户的特权级别、账户的映射登录名和账户访问SQL Server的权限路径 |
xp_msver | 返回有关SQL Server的版本信息 |
xp_revokelogin | 撤销Windows组或用户对SQL Server的访问权限 |
xp_sprintf | 设置一系列字符和值的格式并将其存储到字符串输出参数值。每个格式参数都用相应的参数替换。 |
xp_sqlmaint | 用包含SQLMaint开关的字符串调用SQLMaint实用工具,在一个或多个数据库上执行一系列维护操作 |
xp_sscanf | 将数据从字符串读入每个格式参数所指定的参数位置 |
xp_availablemedia | 查看系统上可用的磁盘驱动器的空间信息 |
xp_dirtree | 查看某个目录下子目录的结构 |
例:执行xp_msver扩展存储过程,查看系统版本信息
EXEC xp_msver