首页 > 数据库 >sql server 存储过程

sql server 存储过程

时间:2024-12-31 19:11:45浏览次数:5  
标签:存储 sp END SQL BEGIN server sql 过程

SQL Server 存储过程笔记

  1. 什么是存储过程 (Stored Procedure)
    存储过程是预编译的 SQL 语句集合,存储在 SQL Server 数据库中,可以通过名称调用。它们通常用于执行复杂的操作、数据验证、错误处理或批量数据操作。存储过程可以接受输入参数,执行一系列的 SQL 操作,并返回结果或状态。

  2. 存储过程的创建
    创建存储过程的基本语法如下:


CREATE PROCEDURE ProcedureName
    @Parameter1 DataType,
    @Parameter2 DataType
AS
BEGIN
    -- SQL 语句
END
ProcedureName:存储过程的名称。
@Parameter:存储过程的输入参数,DataType 为参数的数据类型。
  1. 存储过程的执行
    存储过程创建后,可以使用 EXEC 或 EXECUTE 来调用它:

EXEC ProcedureName @Parameter1 = Value1, @Parameter2 = Value2;
  1. 存储过程中的常见功能
    4.1 输入和输出参数
    存储过程可以接收输入参数(IN)、返回值(OUT)和输入输出参数(INOUT)。输入参数用于传递数据给存储过程,输出参数用于从存储过程中返回数据。

示例:


CREATE PROCEDURE sp_GetOrderCount
    @StartDate DATETIME,
    @EndDate DATETIME,
    @OrderCount INT OUTPUT
AS
BEGIN
    SELECT @OrderCount = COUNT(OrderId)
    FROM Orders
    WHERE OrderDate BETWEEN @StartDate AND @EndDate;
END;

执行存储过程并获取输出参数:


DECLARE @OrderCount INT;
EXEC sp_GetOrderCount '2024-01-01', '2024-12-31', @OrderCount OUTPUT;
SELECT @OrderCount AS TotalOrders;

4.2 控制流语句
存储过程支持多种控制流语句,包括 IF...ELSE、WHILE、BEGIN...END 等,允许在存储过程中进行条件判断、循环等操作。

示例:


IF @StartDate > @EndDate
BEGIN
    RAISERROR('开始日期不能大于结束日期', 16, 1);
    RETURN;
END;

4.3 错误处理
SQL Server 提供了 TRY...CATCH 结构来处理存储过程中的错误。TRY 块用于捕获代码中的错误,CATCH 块处理错误并提供反馈。

示例:


BEGIN TRY
    -- 可能会抛出错误的 SQL 语句
    UPDATE Orders SET TotalAmount = TotalAmount + 100 WHERE OrderId = 1;
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ErrorMessage;
    ROLLBACK TRANSACTION;  -- 回滚事务
END CATCH;

4.4 事务管理
存储过程可以使用事务 (BEGIN TRANSACTION, COMMIT, ROLLBACK) 来确保数据的一致性,尤其在执行多个操作时。

示例:


BEGIN TRANSACTION;

BEGIN TRY
    -- 执行一系列数据更新操作
    UPDATE Orders SET TotalAmount = TotalAmount + 100 WHERE OrderId = 1;
    UPDATE OrderDetails SET Quantity = Quantity + 1 WHERE OrderId = 1;

    COMMIT TRANSACTION;  -- 提交事务
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;  -- 出错时回滚事务
    SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
  1. 存储过程的性能优化
    避免在存储过程中使用游标:游标会逐行处理数据,性能较差。如果可能,使用 SET 操作来批量更新数据。
    避免不必要的循环:存储过程中的循环可能会导致性能问题,尽量用集合操作代替循环。
    合适的索引:在存储过程中涉及大量数据查询时,确保相关的表上有合适的索引。
    避免多次执行相同查询:尽量将多次执行的查询结果存储在临时表或变量中,避免重复查询。
  2. 存储过程的常见错误处理方法
    6.1 参数验证
    存储过程中的输入参数可能无效或不符合预期,提前进行参数验证可以避免后续操作中的问题。

示例:


IF @StartDate IS NULL OR @EndDate IS NULL
BEGIN
    RAISERROR('开始日期和结束日期不能为空', 16, 1);
    RETURN;
END;

IF @StartDate > @EndDate
BEGIN
    RAISERROR('开始日期不能大于结束日期', 16, 1);
    RETURN;
END;

6.2 RAISERROR 用法
RAISERROR 用于抛出错误,可以设置错误的严重性级别和状态码,通常与 RETURN 配合使用,终止存储过程的执行。

示例:

RAISERROR('执行查询时发生错误', 16, 1);
RETURN;
  • 16:错误的严重性级别(16 表示用户错误)。
  • 1:错误的状态代码,通常为 1。
    1. 存储过程中的调试
  • PRINT:用于打印调试信息,适用于简单的调试。
  • PRINT '开始执行存储过程';
  • SELECT:可以在存储过程中临时输出变量或数据,查看存储过程的执行结果。

SELECT @OrderCount AS OrderCount;
8. 存储过程的权限管理
存储过程的执行权限可以通过 GRANT、DENY 和 REVOKE 控制。

授予权限:
GRANT EXECUTE ON sp_GetOrderStats TO UserName;
撤销权限:
REVOKE EXECUTE ON sp_GetOrderStats FROM UserName;
9. 存储过程的调用实例
9.1 无参数存储过程


CREATE PROCEDURE sp_GetAllOrders
AS
BEGIN
    SELECT * FROM Orders;
END;

调用:

EXEC sp_GetAllOrders;
9.2 带参数的存储过程


CREATE PROCEDURE sp_GetOrdersByDateRange
    @StartDate DATETIME,
    @EndDate DATETIME
AS
BEGIN
    SELECT * FROM Orders
    WHERE OrderDate BETWEEN @StartDate AND @EndDate;
END;

调用:

EXEC sp_GetOrdersByDateRange '2024-01-01', '2024-12-31';
10. 存储过程的版本控制
在开发过程中,存储过程的修改可能需要版本控制,通常可以通过以下几种方式:

在存储过程代码中加入版本信息。
使用数据库迁移工具(如 Entity Framework、Liquibase)进行版本管理。
示例:

-- 版本 1.0 创建
CREATE PROCEDURE sp_GetOrders
AS
BEGIN
    -- 查询代码
END;

总结
存储过程是 SQL Server 中一个非常强大的工具,它允许你将 SQL 查询、数据操作和业务逻辑封装起来,提高代码重用性、简化应用程序逻辑并提升性能。通过存储过程,你可以进行复杂的数据库操作、错误处理和事务管理,帮助你构建更加健壮和高效的数据库应用。

标签:存储,sp,END,SQL,BEGIN,server,sql,过程
From: https://www.cnblogs.com/shaki/p/18644671

相关文章

  • PerformanceObserver
    PerformanceObserver基础库2.11.0开始支持,低版本需做兼容处理。PerformanceObserver对象,用于监听性能相关事件属性ArraysupportedEntryTypes获取当前支持的所有性能指标类型方法PerformanceObserver.observe(Objectoptions)开始监听PerformanceObserver.disconnec......
  • JAVA开源毕业设计 大学生竞赛管理系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T101,文末自助获取源码\color{red}{T101,文末自助获取源码}......
  • JAVA开源毕业设计 租房管理系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T102,文末自助获取源码\color{red}{T102,文末自助获取源码}......
  • SQL优化| IS NOT NULL 优化与 NOT NULL 查询慢优化
    在SQL查询时,SQL语句中由于使用了ISNOTNULL,导致查询时间过长,数据表有180W条数据,查询的字段上已经有普通索引,我们使用简单的sql查询这个cfErpPayNumber不是空的记录,耗时需要1843ms,这是非常头疼的,  查看执行计划,是全表扫描这里为了加快查询效率,我们需要加入函数索引, ......
  • 【分布式存储】HDFS
    https://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html HDFS(HadoopDistributedFileSystem)Hadoop分布式文件系统。是根据google发表的论文翻版的。论文为GFS(GoogleFileSystem)Google文件系统设计前提和目标:硬件错误、流式数据访问、大规模数据集:运行在HDFS上的......
  • 不再担心安装问题!手把手教你在 CentOS 上安装 MySQL 8
    目录......
  • 【iscsi使用】1.SAN存储和NAS的对比
    目录1.SAN存储及NAS存储2.CentOS7搭建iscsi服务器3.无盘启动CentOS7SAN存储及NAS存储通过对比的方式来进行理解它们的使用场景及异同。原理和架构SAN(StorageAreaNetwork)存储区域网络原理:SAN是一种基于光纤通道、iscsi或其他高速传输技术构建的专用网络,它将存储设......
  • 掌握 PostgreSQL 的 psql 命令行工具
    title:掌握PostgreSQL的psql命令行工具date:2024/12/30updated:2024/12/30author:cmdragonexcerpt:psql是PostgreSQL关系数据库管理系统的交互式命令行工具,是数据库管理员和开发人员进行数据库管理和操作的主要接口。熟练使用psql工具,不仅能够提高对P......
  • PostgreSQL小技巧
    在字符串中添加换行符在PostgreSQL中如果想在字符串中添加特殊符号,是不等直接在字符串中显示的,如:select'\n',最后查出来的就是\n而不是换行符。这是需要借用E。在PostgreSQL中,字符串前面的E表示该字符串是一个转义字符串(escapestring)。转义字符串可以包含用于表示特殊字符或......
  • 元素定位(调试环境:appium-server+inspector+模拟器)
    fromappiumimportwebdriverfromappium.options.androidimportUiAutomator2Optionsfromappium.webdriver.common.appiumbyimportAppiumByasBy创建一个UiAutomator2Options对象options=UiAutomator2Options()options.platform_name="Android"options......