SQL sever中的存储过程
在Oracle的专篇中我也有仔细总结了存储过程的相关内容,
文章链接:http://t.csdnimg.cn/Z8AnH
尽管Oracle和SQL sever之间是存在一些区别,但许多基本的概念和原则在Oracle和SQL Server之间是通用的。它们之间有一些常见的区别,如下所述:
语法差异:两个数据库系统在存储过程的语法方面存在差异。例如,存储过程的声明、变量声明、控制结构和异常处理等方面可能会有不同的语法。
参数传递方式:在Oracle中,存储过程可以使用IN、OUT和IN OUT类型的参数来进行数据传递。而在SQL Server中,可以使用输入参数、输出参数和表值参数来实现类似的功能。
游标处理:Oracle和SQL Server在游标处理方面也有一些差异。例如,在Oracle中,可以使用隐式游标或显式游标来处理结果集。而在SQL Server中,使用游标需要显式声明和操作。
系统函数和特性:每个数据库系统都有自己特定的系统函数和特性,这些函数和特性可以在存储过程中使用。因此,在编写存储过程时,可能需要根据目标数据库系统的要求来选择合适的函数和特性。
下面内容我将总结描述下在SQL sever2008版本数据库中的存储过程,可以对比参照Oracle的内容进行理解掌握。
目录
一、存储过程概念
二、存储过程组成
三、存储过程优缺
3.1优点:
3.2缺点:
四、创建存储过程
4.1使用向导创建存过
4.2使用CREATE PROC语句创建存储过程
五、管理存储过程
5.1执行存储过程
5.2查看存储过程
5.2.1.使用sys.sql_modules查看存储过程的定义
5.2.2.使用OBJECT_DEFINITION查看存储过程的定义
5.2.3.使用sp_helptext查看存储过程的定义
5.3修改存储过程
5.3.1.ALTER PROCEDURE语句
5.4重命名存储过程
5.4.1.手动操作重新命名存储过程
5.4.2.执行sp_rename系统存储过程重新命名存储过程
5.5删除存储过程
5.5.1手动删除存储过程
5.5.2.执行DROP PROCEDURE语句删除存储过程
六、存过创建与调试步骤
一、存储过程概念
存储过程(Stored Procedure)是预编译SQL语句的集合,这些语句存储在一个名称下并作为一个单元来处理。存储过程代替了传统的逐条执行SQL语句的方式。一个存储过程中可包含查询、插入、删除、更新等操作的一系列SQL语句,当这个存储过程被调用执行时,这些操作也会同时执行。
存储过程与其他编程语言中的过程类似,它可以接受输入参数并以输出参数的格式向调用过程或批处理返回多个值;包含用于在数据库中执行操作(包括调用其他过程)的编程语句:向调用过程或批处理返回状态值,以指明成功或失败(以及失败的原因)。通过输入参数和输出参数与应用程序进行交互。
SQL Server提供了3种类型的存储过程,各类型存储过程如下:
- ☑系统存储过程:用来管理SOL Server和显示有关数据库和用户信息的存储过程。
- ☑自定义存储过程:用户在SQL Server中通过采用SQL语句创建存储过程。
- ☑扩展存储过程:通过编程语言(如C语言)创建外部例程,并将这个例程在SQL Server中作
- 为存储过程使用。
实际上,存储过程几乎为所有的SQL Server应用提供了支持以及数据库接口。它们被保存在数据库中并分配一个名称,以供以后重复使用,提供了一种有效的方式来组织和重复使用SQL代码,以及实现更复杂的业务逻辑。
二、存储过程组成
存储过程通常由以下几个部分组成:
- 1. **头部(Header)**:
存储过程的头部包含了定义存储过程的名称、参数和返回值类型。它以`CREATE PROCEDURE`语句开始,后面紧跟着存储过程的名称和参数列表。这些参数可以是输入参数、输出参数或者既是输入又是输出的参数。
- 2. **参数(Parameters)**:
存储过程可以接受零个或多个参数。参数是可选的,用于传递输入值给存储过程并返回输出结果。每个参数都有一个名称、数据类型和方向(输入、输出或输入/输出)。
- 3. **主体(Body)**:
存储过程的主体是实际执行的代码块,它包含了存储过程的逻辑操作和SQL语句,用于实现具体的功能。主体部分位于`BEGIN`和`END`关键字之间,并且可以包含条件语句、循环结构、异常处理和事务控制等控制流程和业务逻辑。可以在主体中使用流程控制语句(例如IF、WHILE)和SQL查询语句(例如SELECT、UPDATE)等。
- 4. **局部变量(Local Variables)**:
存储过程可以声明局部变量,这些变量只在存储过程内部有效。局部变量用于存储中间结果、临时数据或计算结果,并可以在存储过程的主体部分使用。
- 5. **异常处理(Exception Handling)**:
存储过程可以使用异常处理机制来捕获和处理可能发生的错误或异常情况。通过使用`TRY...CATCH`语句块,可以在存储过程中定义一组处理异常的操作。
- 6. **事务控制(Transaction Control)**:
存储过程可以使用事务来确保一系列操作的原子性,并在必要时进行回滚或提交。通过使用`BEGIN TRANSACTION`、`COMMIT`和`ROLLBACK`等语句,可以在存储过程中控制事务的边界。
- 7. **权限和安全性(Permissions and Security)**:
存储过程可以被授予特定用户或角色的执行权限。数据库管理员可以根据需求设置存储过程的访问权限,以确保数据的安全性和合规性。
三、存储过程优缺
3.1优点:
-
提高性能:存储过程是预编译的,一旦创建,其执行计划会被缓存,从而提高了查询的执行速度。存储过程的编译结果被缓存,以便在后续执行中重复使用。这可以减少每次执行存储过程时的开销,从而提高查询和数据操作的性能。
-
代码复用:存储过程使得可以将常用的业务逻辑封装在一个可重用的单元中。这样可以避免重复编写相同的SQL代码,并更方便地进行维护和修改。这样存储过程可以在多个应用程序中重复使用,从而减少代码的冗余并提高开发效率。那么就可以减少错误和维护成本,并促进代码的一致性和可维护性。
-
安全性:存储过程可以通过权限控制来限制用户对数据的访问和操作。只有具有足够权限的用户才能执行存储过程,从而保护敏感数据和防止未经授权的访问。
-
简化复杂查询:存储过程可以包含多个SQL语句和逻辑操作,使得对复杂查询的处理更加简单和可维护。它们可以将复杂的业务逻辑封装在一个单独的存储过程中,使代码更具可读性和可管理性。
-
减少网络流量:通过将SQL语句封装在存储过程中,可以减少与数据库服务器之间传输的数据量。因为只需传递存储过程的名称和参数,而不是完整的SQL查询语句。存储过程可以在远程客户端上执行,并仅将结果返回给客户端,从而减少了网络流量。
-
事务控制:存储过程可以使用事务控制语句(如BEGIN TRANSACTION、COMMIT TRANSACTION和ROLLBACK TRANSACTION)来确保数据的一致性和完整性。通过将多个数据库操作放在同一个存储过程中,可以更好地管理和控制事务。
3.2缺点:
-
学习和开发成本:编写和维护存储过程需要一定的学习和开发成本。因为存储过程是使用特定的编程语言(如T-SQL)编写的,开发人员需要熟悉该语言的语法和特性。编写和调试存储过程可能需要更多的时间和努力,特别是对于不熟悉存储过程的开发人员。
-
难以维护:存储过程的复杂性增加了维护的难度。由于存储过程通常包含大量的代码和逻辑,因此当需要进行更改或修复时,可能需要花费更多的时间和精力来理解和修改存储过程。特别当出现问题时,调试可能会更加困难。
-
版本控制:存储过程的版本控制可能比较困难。如果多个开发人员同时对存储过程进行更改,那么很容易出现冲突和合并问题。因此,必须采取适当的版本控制策略和实践来管理存储过程的演变和改变。
-
数据库依赖:存储过程通常直接依赖于数据库结构和对象。存储过程的语法和功能可能会因不同的数据库版本而有所变化。如果数据库结构发生变化,可能需要相应地修改和更新存储过程。这种紧密的耦合可能导致维护的复杂性和风险。存储过程是特定于数据库管理系统(DBMS)的,因此在将应用程序从一个DBMS迁移到另一个DBMS时,可能需要重写或调整存储过程。在升级或迁移数据库时,存储过程可能需要进行更新或调整。
四、创建存储过程
存储过程(Stored Procedure)是在数据库服务器端执行的一组T-SQL语句的集合,经编译后存放
在数据库服务器中。下面主要介绍如何通过企业管理器和Transact-.SQL语句创建存储过程。
4.1使用向导创建存过
在SQL Server2008中,使用向导创建存储过程的步骤如下:
(1)启动SQL Server Management Studio,并连接到SQL Server2008中的数据库。
(2)在“对象资源管理器”中选择指定的服务器和数据库,展开数据库的“可编程性”节点,右
击“存储过程”,在弹出的快捷菜单中选择“新建存储过程”命令,如图所示。
(3)在弹出的“连接到数据库引擎”窗口中,单击“连接”按钮,便出现创建存储过程的窗口,
如图所示。
在存储过程窗口的文本框中,可以看到系统自动给出了创建存储过程的格式模板语句,可对工具
模板格式进行修改来创建新的存储过程。
注释:
ANSI_NULLS 和 QUOTED_IDENTIFIER 选项。它们具有以下含义:
SET ANSI_NULLS ON
:将 ANSI_NULLS 设置为 ON,表示启用 ANSI 标准中关于 NULL 值的比较规则。当此选项打开时,NULL 的比较会被认为是未知的,并且在 WHERE 子句中使用 "column_name = NULL" 时不会返回任何结果。相反,应该使用 "column_name IS NULL" 来检查是否为 NULL 值。
SET QUOTED_IDENTIFIER ON
:将 QUOTED_IDENTIFIER 设置为 ON,表示启用标识符引号的使用。当此选项打开时,可以使用双引号(")来引用标识符,例如表名或列名,而不仅限于方括号([])。这样可以避免某些情况下的歧义和错误,尤其是在使用保留字或特殊字符作为标识符时。使用
GO
关键字将这些命令分隔成多个批处理。每个批处理在执行时都会单独运行,并且在一个批处理之间会存在一定的上下文切换。注意:这两个语句的解析并不涉及实际的逻辑操作或查询。它们只是用于设置数据库的选项和配置,以确保在后续的存储过程或脚本中使用正确的规则和行为。
-- ============================================= -- Author: <Author,,Name> --存过创建编辑人员 -- Create date: <Create Date,,> --创建日期 -- Description: <Description,,> --描述错过的作用 -- =============================================
提示:编写存过一定要培养好的习惯,对自己编写的代码做好注释,描述关键的代码逻辑信息,为后续代码修改维护提供良好的帮助。
【例】创建一个名称为Proc_Stu的存储过程,要求完成以下功能:在Student表中查询男生的Sno、Sex、Sage这几个字段的内容。具体的操作步骤如下:
提前准备student表,语句如下:
use SJCX ;-- 创建 Student 表
CREATE TABLE Student (Sno INT PRIMARY KEY,Sname NVARCHAR(50),Sex NVARCHAR(10),Sage INT,Grade NVARCHAR(20)
);-- 向 Student 表插入5条数据
INSERT INTO Student (Sno, Sname, Sex, Sage, Grade)
VALUES(1, 'Amy', 'Female', 20, 'A'),(2, 'Ben', 'Male', 22, 'B'),(3, 'Chris', 'Male', 21, 'A'),(4, 'Diana', 'Female', 19, 'C'),(5, 'Eric', 'Male', 20, 'B');SELECT Sno,Sname,Sex,Sage
FROM Student
WHERE Sex = 'Male';
(1)在创建存储过程的窗口中选择“查询”菜单中的“指定模板参数的值”命令,弹出“指定模板参数的值”对话框,如图所示。
(2)在“指定模板参数的值”对话框中将Procedure_Name参数对应的名称修改为Proc_Stu,单击“确定”按钮,关闭此对话框。
(3)在创建存储过程的窗口中,将对应的SELECT语句修改为以下语句:
SELECT Sno,Sname,Sex,Sage
FROM Student
WHERE Sex = 'Male';
(4)然后进行分析并执行, 调用存过查看结果:
完整存储过程代码如下:
-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: CL
-- Create date: 2023/10/21
-- Description: 查询学生表中男生的信息
-- =============================================
CREATE PROCEDURE Proc_stu -- Add the parameters for the stored procedure here@p1 int = 0, @p2 int = 0
AS
BEGIN-- SET NOCOUNT ON added to prevent extra result sets from-- interfering with SELECT statements.SET NOCOUNT ON;-- Insert statements for procedure hereSELECT Sno,Sname,Sex,SageFROM StudentWHERE Sex = 'Male';
END
GO
使用了之前提到的 SET ANSI_NULLS ON
和 SET QUOTED_IDENTIFIER ON
的设置,并且定义名为 Proc_stu
的存储过程。
存储过程 Proc_stu
接受两个参数 @p1
和 @p2
,并设置它们的默认值为 0。在存储过程的主体部分,通过 SELECT
语句从 Student
表中选择学号(Sno
)、姓名(Sname
)、性别(Sex
)和年龄(Sage
)字段,并根据性别为男性进行筛选。
使用 SET NOCOUNT ON
可以防止额外的结果集干扰 SELECT
语句。
最后的 GO
命令用于将整个存储过程的定义分隔为一个单独的批处理。
通过执行 EXEC Proc_stu
来调用该存储过程,并获取满足条件的男生的学号、姓名、性别和年龄信息。
4.2使用CREATE PROC语句创建存储过程
在SQL语言中,可以使用CREATE PROCEDURE语句创建存储过程,其语法格式如下:
CREATE PROCEDURE procedure_name[ @parameter1 datatype [ = default_value ] [ OUT | OUTPUT ], ... ]
AS
BEGIN-- 在此处编写存储过程的主体代码
END
关键字和符号的含义如下:
CREATE PROCEDURE
:用于创建存储过程的关键字。procedure_name
:指定存储过程的名称。遵循标识符的命名规则。@parameter1
:可选项,指定存储过程的输入或输出参数名称。遵循标识符的命名规则。datatype
:参数的数据类型。可以是任何有效的SQL Server数据类型。default_value
:可选项,指定参数的默认值。OUT
或OUTPUT
:可选项,用于指定参数是输出参数。AS
:开始定义存储过程的主体部分。BEGIN
和END
:用于定义存储过程的主体代码块。
【例1】使用CREATE PROCEDURE语句创建一个存储过程,用来根据学生编号查询学生信
息。
SQL语句如下:
Create Procedure Proc_Student
@Proc_Sno int
as
select *from Student where Sno = @Proc_Sno
调用该存储过程:
DECLARE @StudentNo INT
SET @StudentNo = 1 -- 设置要查询的学生编号EXEC Proc_Student @Proc_Sno = @StudentNo
结果如图所示:
【例2】创建一个名为GetstudentDetails的存储过程,接受一个输入参数@sno和一个输出参数@sname。存储过程的主体部分包含了查询学生信息的SQL语句,并将学生的姓名赋值给输出参数@sname ,具体语句如下:
CREATE PROCEDURE GetstudentDetails@sno INT,@sname NVARCHAR(50) OUTPUT
AS
BEGINSELECT @sname = SnameFROM StudentWHERE Sno = @sno
END
定义了名为 GetstudentDetails
的存储过程,它接受一个输入参数 @sno
和一个输出参数 @sname
。
在存储过程的主体部分,使用 SELECT
语句从 Student
表中选择学生的姓名(Sname
),并将其赋值给输出参数 @sname
。查询条件是学号等于输入参数 @sno
的记录。
这样,当调用存储过程时,可以传递一个学号作为输入参数,并且存储过程会返回对应学号的学生姓名赋值给输出参数 @sname
。例如:
DECLARE @studentName NVARCHAR(50)EXEC GetstudentDetails 1, @sname = @studentName OUTPUTSELECT @studentName AS 'Student Name'
结果如图所示:
五、管理存储过程
存储过程创建完成后,用户可以通过SQL Server Management Studio工具对其进行管理。数据库中的存储过程都被保存在“数据库”/“数据库名称”/“可编程性”/“存储过程”路径下。下面是使用SQL Server Management Studio工具对存储过程进行查看代码、修改代码及名称、删除、执行等的管理。
5.1执行存储过程
EXECUTE用来执行Transact-.SQL中的命令字符串、字符串或执行下列模块之一:系统存储过程、用户定义存储过程、标量值用户定义函数或扩展存储过程。
EXECUTE的语法格式如下:
EXECUTE { procedure_name | @procedure_variable }[ { parameter_name = { expression | @variable [ OUTPUT ] } }[ ,...n ]]
其中,关键字和符号的含义如下:
EXECUTE
:用于执行存储过程或调用可执行的批处理。procedure_name
:指定要执行的存储过程的名称。遵循标识符的命名规则。@procedure_variable
:可选项,指定一个变量来保存存储过程的名称。parameter_name
:可选项,指定存储过程的输入参数名称。遵循标识符的命名规则。expression
:指定参数的值,可以是常量、变量或表达式。@variable
:指定一个变量作为参数的值。OUTPUT
:可选项,在参数名称后面加上OUTPUT
关键字表示该参数是输出参数。
使用 EXECUTE
语句时,可以直接指定存储过程的名称并提供参数的值,也可以通过变量来保存存储过程的名称,并在执行时传递参数的值。
以下是一些示例说明了 EXECUTE
语句的使用:
-- 直接执行存储过程并传递参数值
EXECUTE GetstudentDetails @sno = 1, @sname = @studentName OUTPUT-- 使用变量保存存储过程的名称,并传递参数值
DECLARE @procName NVARCHAR(50)
SET @procName = 'GetstudentDetails'EXECUTE @procName @sno = 1, @sname = @studentName OUTPUT
5.2查看存储过程
许多系统存储过程、系统函数和目录视图都提供有关存储过程的信息。可以使用这些系统存储过程来查看存储过程的定义,即用于创建存储过程的Transact-.SQL语句。
可以通过下面3种系统存储过程和目录视图查看存储过程。
5.2.1.使用sys.sql_modules查看存储过程的定义
sys.sql_modules为系统视图,通过该视图可以查看数据库中的存储过程,查看存储过程的操作方
法如下:
(1)单击工具栏中的新建查询按钮,新建查询编辑器。
(2)在新建查询编辑器中输入如下代码:
select * from sys.sql_modules;
执行该语句即可查看到已创建的存储过程:
5.2.2.使用OBJECT_DEFINITION查看存储过程的定义
返回指定对象定义的Transact-.SQL源文本,语法格式如下:
OBJECT_DEFINITION (object_id)
参数说明:
object_id:要使用的对象的D。object_id的数据类型为int,并假定表示当前数据库上下文中的对象。
【例】使用OBJECT_DEFINITION查看ID为1285579618存储过程的代码,SQL语句如下:
select OBJECT_DEFINITION(1285579618)
结果如图所示:
5.2.3.使用sp_helptext查看存储过程的定义
显示用户定义规则的定义、默认值、未加密的Transact--SQL存储过程、用户定义Transact-SQL函
数、触发器、计算列、CHECK约束、视图或系统对象(如系统存储过程)。语法格式如下:
sp_helptext @objname =]'name'[,@columnname computed_column_name
参数说明:
- ☑[@objname=]name':架构范围内的用户定义对象的限定名称和非限定名称。仅当指定限定对象时才需要引号。如果提供的是完全限定名称(包括数据库名称),则数据库名称必须是当前数据库的名称。对象必须在当前数据库中。name的数据类型为nvarchar(776),无默认值。
- ☑[@columnname=]computed_column_name:要显示其定义信息的计算列的名称,必须将包含列的表指定为name。column_name的数据类型为sysname,无默认值。
【例】通过sp_helptext系统存储过程查看名为Proc_Stu存储过程的代码。SQL语句如下:
sp_helptext 'Proc Stu'
结果如图所示:
提示:
上述的查看方法操作步骤如下:
- (1)打开SQL Server Management Studio,并连接到SQL Server2008中的数据库。
- (2)选择存储过程所在的数据库,如db2008_SJCX数据库。
- (3)单击工具栏中的新建询按钮,新建查询编辑器,并输入SQL语句代码:
- (4)单击【执行】按钮,就可以执行上述SQL语句代码。
5.3修改存储过程
修改存储过程可以改变存储过程当中的参数或者语句,可以通过SQL语句中的ALTER PROCEDURE语句实现。虽然删除并重新创建该存储过程,也可以达到修改存储过程的目的,但是将丢失与该存储过程关联的所有权限。
5.3.1.ALTER PROCEDURE语句
ALTER PROCEDURE语句用来修改通过执行CREATE PROCEDURE语句创建的过程。该语句修改存储过程时不会更改权限,也不影响相关的存储过程或触发器。
ALTER PROCEDURE语句的语法格式如下:
ALTER PROCEDURE procedure_name
[ { @parameter1 data_type [ VARYING ] [= default] [ OUT | OUTPUT | READONLY ][ ,...n ]| [ = { NULL | NOT NULL } ]}
]
[ WITH RECOMPILE ]
[,...n]
其中,关键字和符号的含义如下:
ALTER PROCEDURE
:用于修改存储过程的定义。procedure_name
:指定要修改的存储过程的名称。遵循标识符的命名规则。@parameter1
:可选项,指定要修改的存储过程的参数名称。遵循标识符的命名规则。data_type
:指定参数的数据类型。VARYING
:可选项,指定参数是否是可变长度的。default
:可选项,指定参数的默认值。OUT
、OUTPUT
、READONLY
:可选项,用于指定参数的特性,如输出参数或只读参数。= { NULL | NOT NULL }
:可选项,用于指定参数是否允许为空。WITH RECOMPILE
:可选项,用于重新编译存储过程的执行计划。
【例1】ALTER PROCEDURE
语句的使用:
-- 修改存储过程的参数定义
ALTER PROCEDURE GetstudentDetails@sno INT,@sname NVARCHAR(50)
AS
BEGIN-- 存储过程的逻辑代码
END-- 强制重新编译存储过程
ALTER PROCEDURE GetstudentDetails
WITH RECOMPILE
AS
BEGIN-- 存储过程的逻辑代码
END
第一个示例修改了存储过程的参数定义,可以增加、删除或修改存储过程的参数。第二个示例使用 WITH RECOMPILE
选项来强制重新编译存储过程的执行计划,以确保每次执行都使用最新的优化计划。
【例2】通过ALTER PROCEDURE语句修改名为Proc Stu的存储过程,具体操作步骤如下:
(1)打开SQL Server Management Studio,并连接到SQL Server2008中的数据库。
(2)选择存储过程所在的数据库,如db2008数据库。
(3)单击工具栏中的新建查询按钮,新建查询编辑器,并输入如下SQL语句代码:
--修改存过sno参数类型:
ALTER PROCEDURE [Proc_Stu]
@Sno varchar(10)
as
select sage, sname from student where Sno = @Sno;
(4)单击【执行】按钮,就可以执行上述SQL语句代码,执行结果如图所示。
除了上述方法修改存储过程外,也可以通过SQL Server20O8自动生成的ALTER PROCEDURE语
句修改存储过程。以修改系统数据库master中系统存储过程sp_MScleanupmergepublisher为例,操作步骤如下:
(1)打开SQL Server Management Studio,并连接到SQL Server2008中的数据库。
(2)展开“对象资源管理器”中“数据库/系统数据库/master/可编程性/系统存储过程”的节点后,在sp_MScleanupmergepublisher系统存储过程上右击,弹出快捷菜单,如图所示。
(3)选择“修改”命令,在查询编辑器中自动生成修改该存储过程的语句,生成的语句如图所示。
(4)修改该段SQL语句并执行,即可完成修改该存储过程。
5.4重命名存储过程
重新命名存储过程可以通过手动操作或执行sp rename系统存储过程实现。
5.4.1.手动操作重新命名存储过程
(1)打开SQL Server Management Studio,.并连接到SQL Server2008中的数据库。
(2)展开“对象资源管理器”中“数据库”/“数据库名称”/“可编程性”/“存储过程”节点,右击需要重新命名的存储过程,在弹出的快捷菜单中选择“重命名”命令。
例如,修改数据库中的Proc_stu存储过程名称,如图所示。
(3)此时,在存储过程名称的文本框中输入要修改的名称,即可重命名存储过程。
5.4.2.执行sp_rename系统存储过程重新命名存储过程
sp_rename系统存储过程可以在当前数据库中更改用户创建对象的名称。此对象可以是表、索引、
列、别名数据类型或Microsoft.NET Framework公共语言运行时(CLR)用户定义类型。sp_rename
接受三个参数,分别是当前的对象名称、新的对象名称以及对象类型。语法格式如下:
EXEC sp_rename 'current_object_name', 'new_object_name', 'object_type'
其中,关键字和符号的含义如下:
sp_rename
:用于重命名数据库对象的系统存储过程。'current_object_name'
:指定要重命名的当前对象的名称。'new_object_name'
:指定要将当前对象重命名为的新对象的名称。'object_type'
:指定当前对象的类型。对于存储过程,请使用'PROCEDURE'
。
注意:
在执行
sp_rename
之前,应确保已经备份了数据库,并且谨慎操作以避免不可恢复的错误。
【例】将Proc_Stu存储过程重新命名为Proc_StuInfo。SQL语句如下:
EXEC sp_rename 'Proc_Stu', 'Proc_StuInfo';
结果检查如图所示:
注意:
更改对象名的任一部分都可能破坏脚本和存储过程。建议不要使用此语句来重命名存储过程、触发器、用户定义函数或视图,而是删除该对象,然后使用新名称重新创建该对象。
5.5删除存储过程
数据库中某些不再应用的存储过程可以将其删除,这样节约该存储过程所占的数据库空间。删除
存储过程可以通过手动删除或执行DROP PROCEDURE语句实现。
5.5.1手动删除存储过程
(1)打开.SQL Server Management Studio,并连接到SQL Server2008中的数据库。
(2)展开“对象资源管理器”中“数据库”/“数据库名称”/“可编程性”/“存储过程”节点,右击要删除的存储过程,在弹出的快捷菜单中选择“删除”命令。
(3)在“删除对象”窗口中确认所删除的存储过程,单击“确定”按钮即可将该存储过程删除。如删除Proc_Stulnfo存储过程,如图所示。
5.5.2.执行DROP PROCEDURE语句删除存储过程
DROP PROCEDURE语句用来从当前数据库中删除一个或多个存储过程。语法格式如下:
DROP PROCEDURE [schema_name.] procedure_name;
其中,关键字和符号的含义如下:
DROP PROCEDURE
:用于删除存储过程的语句。[schema_name]
:可选项,指定存储过程所属的架构名称。如果省略,则假定为默认架构。procedure_name
:指定要删除的存储过程的名称。
【例】删除名为Proc Student的存储过程。SQL语句如下:
DROP PROCEDURE Proc_Student
(3)单击【执行】按钮,就可以执行上述SQL语句代码将Proc_Student存储过程删除。
提示:
不可以删除正在使用的存储过程,否则Microsoft SQL Server2008将在执行调用进程时显示一条错误消息。
六、存过创建与调试步骤
在 SQL Server 2008 中,创建存储过程的流程步骤如下:
- 1. 打开 SQL Server Management Studio (SSMS)。
- 2. 连接到适当的 SQL Server 数据库实例。
- 3. 在 "查询" 窗口中输入 CREATE PROCEDURE 语句来定义存储过程。确保提供了存储过程的名称、参数、主体和逻辑等。
CREATE PROCEDURE procedure_name[ { @parameter1 data_type [ VARYING ] [= default] [ OUT | OUTPUT | READONLY ][ ,...n ]| [ = { NULL | NOT NULL } ]}]ASBEGIN-- 存储过程的逻辑代码END
- 4. 在 "查询" 窗口中执行 CREATE PROCEDURE 语句,以创建存储过程。
完成上述步骤后,存储过程将被创建并保存到数据库中。
调试和测试存储过程的过程可以通过以下步骤来进行:
- 1. 打开一个新的 "查询" 窗口。
- 2. 使用 EXECUTE 或 EXEC 关键字,调用存储过程,并传入所需的参数。
EXECUTE procedure_name @parameter1 = value1, @parameter2 = value2;
- 3. 在 "查询" 窗口中执行调用存储过程的语句。
- 4. 检查返回的结果或输出参数,以验证存储过程的行为是否符合预期。
如果存储过程中存在错误或需要更改其定义,可以使用 ALTER PROCEDURE 语句进行修改,并重新执行相应的步骤来更新存储过程。
注意:
为了进行有效的调试和测试,建议在存储过程中添加适当的错误处理和日志记录机制,以便在出现问题时能够跟踪和诊断问题。
【例1】 在 SQL Server 2008 中创建存储过程后,添加适当的错误处理和日志记录机制帮助跟踪和诊断问题。
CREATE PROCEDURE Test_Procedure
AS
BEGINBEGIN TRY-- 存储过程的逻辑代码-- 例如,查询一个不存在的表SELECT * FROM NonexistentTable;END TRYBEGIN CATCH-- 记录错误信息到日志表INSERT INTO ErrorLog (ErrorMessage, ErrorDateTime)VALUES (ERROR_MESSAGE(), GETDATE());-- 抛出异常,可根据需要自定义处理方式THROW;END CATCH;
END
在这个示例中,当查询一个不存在的表时会引发一个异常。使用 TRY...CATCH
块捕获异常,并在 CATCH
块中记录错误信息到日志表 ErrorLog
。大家可以根据实际需求自定义错误处理方式,如发送电子邮件通知管理员、回滚事务等。
注意以下几点:
- 可以根据需要创建一个名为
ErrorLog
的日志表,用于记录错误信息。表结构可以包含错误消息、日期时间戳等字段。 - 使用
ERROR_MESSAGE()
函数获取捕获的异常的详细错误消息。 - 使用
GETDATE()
函数获取当前日期时间戳,并将其插入到错误日志表中。 - 使用
THROW
关键字抛出异常,以便在调试或测试过程中终止存储过程的执行。
通过将错误信息记录到日志表,您可以随时查看和分析存储过程执行过程中的错误。这样能够更容易地追踪问题并及时采取适当的措施。一定要根据实际需求和环境选择适合的错误处理和日志记录方法,并确保在生产环境中进行充分测试和验证。
为了便于理解,创建上述中的错误日志表:
CREATE TABLE ErrorLog (LogID INT IDENTITY(1,1) PRIMARY KEY,ErrorMessage NVARCHAR(MAX),ErrorDateTime DATETIME
);
三个字段:
LogID
:作为错误日志的唯一标识符,使用IDENTITY(1,1)
设置为自增。ErrorMessage
:存储错误消息的字段,使用NVARCHAR(MAX)
数据类型以容纳较大的错误消息。ErrorDateTime
:存储错误发生的日期和时间戳的字段,使用DATETIME
数据类型。
【例2】还是上面的存过,然后模拟发送电子邮件的过程:
USE msdb;
GOCREATE PROCEDURE Test_Procedure
AS
BEGINBEGIN TRY-- 存储过程的逻辑代码-- 例如,查询一个不存在的表SELECT * FROM NonexistentTable;END TRYBEGIN CATCH-- 记录错误信息到日志表INSERT INTO ErrorLog (ErrorMessage, ErrorDateTime)VALUES (ERROR_MESSAGE(), GETDATE());-- 发送电子邮件通知管理员(示例中仅打印消息)DECLARE @subject NVARCHAR(100) = 'Error in Test_Procedure';DECLARE @body NVARCHAR(MAX) = 'An error occurred in Test_Procedure. Please check the error log for more details.';PRINT 'Sending email: Subject - ' + @subject;PRINT 'Body - ' + @body;-- 抛出异常,可根据需要自定义处理方式THROW;END CATCH;
END
在 SQL Server 2008 中,发送电子邮件需要使用额外的扩展功能,如 SQL Server Agent 或 CLR 集成。由于当前环境限制了这些功能,因此这里只是提供一个简单的示例模拟。该示例仅为概念演示,并不包含实际的电子邮件发送功能。
在这个示例中,当查询一个不存在的表时会引发一个异常。在 CATCH
块中,除了记录错误信息到日志表之外,还通过打印消息的方式模拟发送电子邮件通知管理员。实际上,大家可以替换 PRINT
语句为相应的电子邮件发送代码。
注意:
真正的电子邮件发送功能需要进一步的配置和集成,以便与 SQL Server 进行通信并发送电子邮件。如果需要实际的电子邮件通知,请考虑使用其他方法或工具来实现,如 SQL Server Agent 或基于 CLR 的扩展。
【例3】当查询一个不存在的表时引发异常时,回滚事务:
CREATE PROCEDURE Test_Procedure
AS
BEGINBEGIN TRYBEGIN TRANSACTION;-- 存储过程的逻辑代码-- 例如,查询一个不存在的表SELECT * FROM NonexistentTable;COMMIT TRANSACTION;END TRYBEGIN CATCHROLLBACK TRANSACTION;-- 记录错误信息到日志表INSERT INTO ErrorLog (ErrorMessage, ErrorDateTime)VALUES (ERROR_MESSAGE(), GETDATE());-- 抛出异常,可根据需要自定义处理方式THROW;END CATCH;
END
使用 BEGIN TRANSACTION
开始一个新的事务,并在 COMMIT TRANSACTION
之前的逻辑代码执行完成后提交事务。如果在逻辑代码执行期间引发了异常,会进入 CATCH
块,其中使用 ROLLBACK TRANSACTION
回滚事务。
注意以下几点:
- 在
TRY
块内的逻辑代码应该包含要在同一事务中进行的操作。 - 如果发生异常,将进入
CATCH
块,并通过ROLLBACK TRANSACTION
来回滚未提交的事务。 - 在回滚事务之前,可以根据需要记录错误信息到日志表。
- 使用
THROW
关键字抛出异常,以便在调试或测试过程中终止存储过程的执行。
提示:
大家一定要谨慎使用事务,确保只在必要的情况下使用,并在实际环境中做好充分的测试和验证。
本次关于SQL sever2008中存储过程的总结和整理就暂时结束了 ,如果文章内容存在错误的地方欢迎码友们的留言指导,或者有关存储过程的其他相关知识也可以留言告知,本木码人一定虚心接受各位的良言,成为一名优秀的猿人。
相关文章:

SQL sever中的存储过程
在Oracle的专篇中我也有仔细总结了存储过程的相关内容, 文章链接:http://t.csdnimg.cn/Z8AnH 尽管Oracle和SQL sever之间是存在一些区别,但许多基本的概念和原则在Oracle和SQL Server之间是通用的。它们之间有一些常见的区别,如下…...

spacy.load(“en_core_web_trf“)报错TypeError: issubclass() arg 1 must be a class
使用spacy时遇到的问题 写在最前面: 安装spacy和en_core_web_trf时需要保证二者版本一致 安装及查看对应spacy版本 安装 pip install spacy查看版本 import spacy spacy.__version__安装en_core_web_trf 直接安装(如果可以的话) pytho…...

【C++和数据结构】模拟实现哈希表和unordered_set与unordered_map
目录 一、哈希的概念与方法 1、哈希概念 2、常用的两个哈希函数 二、闭散列的实现 1、基本结构: 2、两种增容思路 和 插入 闭散列的增容: 哈希表的插入: 3、查找 4、删除 三、开散列的实现 1、基本结构 2、仿函数Hash 3、迭代器…...
十四天学会C++之第五天:类的详细讨论
1. 友元函数和友元类 什么是友元函数和友元类,它们的作用。如何声明和使用友元函数和友元类,访问类的私有成员。 友元函数(Friend Functions) 友元函数是一种特殊的函数,它被允许访问类的私有成员。这意味着即使成员…...

字典树学习笔记
trie 树,即字典树,是一种可以实现 O ( S ) O(S) O(S) 的预处理( S S S 为所有字符串的长度和), O ( N ) O(N) O(N)( N N N 为查询的字符串的长度)的查询的数据结构。 举个栗子,对于…...

web各个指标理解
QPS : 单位时间得请求次数 TPS :单位时间得事务数 并发 : QPS *单位响应时间 pv :进入一个网站,又单击打开该网站的其他页面,每打开一个页面就 增加一个PV,甚至在同一页面每刷新一次也多一个PV 二八定律:百…...
Java后端开发(七)-- 在gitee上部署远程仓库,通过idea上传本地代码(用idea2022版本开发)
目录 1. 在Gitee上创建gitee远程仓库 2.在打开idea,再打开您要上传的idea代码,先创建 本地git仓库...

Go语言入门心法(十二): GORM映射框架
Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…...

Ubuntu更新镜像源切换
概述 用ubuntu用apt命令,自动安装或更新包的时候,默认的镜像源服务器非常卡,很不方便。切换到国内的镜像源,下载更新非常快。为防止以后忘记,本文以国内服务器阿里巴巴的为例简单描述。 版本 Ubuntu23.10 找到更新…...

“一键合并剪辑,轻松添加片头——全新的视频编辑工具让你成为视频制作达人“
在日常生活中,我们时常会遇到需要制作视频的情况。但面对繁琐的视频剪辑和合并,你是否感到无从下手?今天,我们为你带来一款全新的视频编辑工具,让你轻松成为视频制作达人! 首先我们要进入好简单批量智剪主页…...

1.3 矩阵
一、向量与矩阵 下面是三个向量 u \boldsymbol u u、 v \boldsymbol v v、 w \boldsymbol w w: u [ 1 − 1 0 ] v [ 0 1 − 1 ] w [ 0 0 1 ] \boldsymbol u\begin{bmatrix}\,\,\,\,1\\-1\\\,\,\,\,0\end{bmatrix}\kern 10pt\boldsymbol v\begin{bmatrix}\,\,\,…...
阿里云-AnalyticDB【分析型数据库】总结介绍
一、背景 随着企业IT和互联网系统的发展,产生了越来越多的数据。数据量的积累带来了质的飞跃,使得数据应用从业务系统的一部分演变得愈发独立。物流、交通、新零售等越来越多的行业需要通过OLAP做到精细化运营,从而调控生产规则、运营效率、企…...

数二思维导图
高数上 第一章:函数、极限、连续 函数 函数的单调性、周期性、奇偶性复合函数 极限 求直接代入型的极限求∞∞型的极限用等价无穷小代换求00型的极限用洛必达法则求00型或∞∞型的极限求∞•0型的极限求幂指函数的极限函数的左右极限及需要求左右极限的情形极限的…...

ESXI6.5安装教程
设置从IPMI Virtual Disk 3000启动,出现如下界面: 默认选择第一项,回车安装 安装程序正在检测服务器硬件信息,如果不满足系统安装条件会跳出错误提示。 检测完成之后会出现下面界面 回车 按F11 这里列出了服务器硬盘信息&#…...
2023-9-25 美团售后服务系统后端一面【2024秋招】
1 实习 1.1 讲讲你做的一个需求,为什么这么做之类的 答: 1.2 什么是接线 1.3 什么的初始接线,和权威接线 答:初始接线是现状,权威是规划中的 1.4 为什么要做比较呢? 答:运维人员需要查看…...

YOLOv5改进实战 | GSConv + SlimNeck双剑合璧,进一步提升YOLO!
前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…...
Redis之zset在异步队列上的应用
当遇到并发的客户端请求时,为了缓解服务端的处理压力,当请求对响应的处理的实时性要求不高时,可以实现一个异步的请求消息队列。 一种实现策略是使用redis的zset,将消息的到期处理时间作为score,然后用多个线程去轮训…...
day4:Node.js 核心库
day4:Node.js 核心库 文章目录 day4:Node.js 核心库常用工具模块util 模块Moment 模块Lodash 模块web模块文件模块path 模块常用工具模块 Node.js有许多常用的工具,以下是一些常见的: util: 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心 JavaScript 的功能…...
PHP非对称与对称双向加密解密的方式
目录 RSA非对称加密解密: 什么是RSA非对称加密解密解析: 解析: 为什么使用: 有什么优点: DEMO: AES、DES、3DES等对称加密解密: 解析: 为什么使用: 有什么优点: DEMO: RSA非对称加密解密: 什么是RSA非对称加密解密解析: 解析: RSA非对称加密…...

C++之struct匿名结构体实例(二百四十四)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
如何评估大语言模型效果
评估大模型微调后的效果是一个系统化的过程,需要结合客观指标和主观评估,并根据任务类型(分类、生成、回归等)选择合适的评估方法。 一、评估前的准备工作 数据集划分: 将数据分为 训练集、验证集 和 测试集ÿ…...

Kafka入门-消费者
消费者 Kafka消费方式:采用pull(拉)的方式,消费者从broker中主动拉去数据。使用pull的好处就是消费者可以根据自身需求,进行拉取数据,但是坏处就是如果Kafka没有数据,那么消费者可能会陷入循环…...
软件功能模块归属论证方法
文章目录 **一、核心设计原则****二、论证方法****三、常见决策模式****四、验证方法****五、反模式警示****总结** 在讨论软件功能点应该归属哪些模块时,并没有放之四海而皆准的固定方法,但可以通过系统化的论证和设计原则来做出合理决策。以下是常见的…...
Elasticsearch + Milvus 构建高效知识库问答系统《一》
🔍 Elasticsearch Milvus 构建高效知识库问答系统(RAG 技术实战) 📌 目录 背景介绍Elasticsearch 在知识库检索中的作用Milvus 在知识库检索中的作用混合检索:Elasticsearch Milvus完整代码实现部署建议与优化方向…...

网络安全逆向分析之rust逆向技巧
rust逆向技巧 rust逆向三板斧: 快速定位关键函数 (真正的main函数):观察输出、输入,字符串搜索,断点等方法。定位关键 加密区 :根据输入的flag,打硬件断点,快速捕获程序中对flag访问的位置&am…...
计算机视觉与深度学习 | 基于MATLAB的图像特征提取与匹配算法总结
基于MATLAB的图像特征提取与匹配算法全面指南 图像特征提取与匹配 基于MATLAB的图像特征提取与匹配算法全面指南一、图像特征提取基础特征类型分类二、点特征提取算法1. Harris角点检测2. SIFT (尺度不变特征变换)3. SURF (加速鲁棒特征)4. FAST角点检测5. ORB (Oriented FAST …...

Profinet 协议 IO-Link 主站网关(三格电子)
一、产品概述 1.1 产品用途 SG-PN-IOL-8A-001 网关是 Profinet 从转 IO-Link 主的网关设备 ,可以将 IO-Link 从站设备接入 Profinet 系统,通过该网关可实现传感器及驱动器与控制 器之间的信息交互。网关有两个百兆网口和 8 个 IO-Link 端口,两…...
相机camera开发之差异对比核查一:测试机和对比机的硬件配置差异对比
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、背景 二、:Camera硬件配置差异 2.1:硬件配置差异核查项 2.2 :核查方式 2.3 :高通camx平台核查 2.4 :MTK平台核查...

创客匠人:以 AI 利器赋能创始人 IP 打造,加速知识变现新路径
在知识付费与个人 IP 崛起的时代,创客匠人作为行业领先的技术服务商,正通过 AI 工具重构创始人 IP 打造与知识变现的生态。其推出的三大 AI 利器 ——AI 销售信、免训数字人、AI 智能客服,精准解决 IP 运营中的核心痛点。 以 AI 销售信为例&…...

OPenCV CUDA模块光流------高效地执行光流估计的类BroxOpticalFlow
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::BroxOpticalFlow 是 OpenCV CUDA 模块中实现Brox光流算法的类。该类用于在 GPU 上高效地计算两帧图像之间的稠密光流(Dens…...