【新星计划2023】SQL SERVER (04) -- 存储过程

在这里插入图片描述

【新星计划2023】SQL SERVER -- 存储过程

    • 1. Store Procedure Introduction
      • 1.1 优势
      • 1.2 Category
    • 2. 系统存储过程
      • 2.1 介绍
    • 3. 扩展存储过程
      • 3.1 Introduction
      • 3.2 Demo
    • 4. 自定义存储过程
      • 4.1 语法
      • 4.2 Demo
        • 4.2.1 简单的存储过程
        • 4.2.2 无参的存储过程
        • 4.2.3 传参的存储过程
        • 4.2.4 通配符传参的存储过程
        • 4.2.5 使用out参数的存储过程
        • 4.2.6 使用存储过程修改数据
    • 5. Awakening


在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Officail Website: https://learn.microsoft.com/en-us/sql/sql-server/?view=sql-server-ver16.
Officail Website(中文): https://learn.microsoft.com/zh-cn/sql/sql-server/?view=sql-server-ver16.


1. Store Procedure Introduction

1.1 优势

  • 存储过程只是在创造的时候进行编译,以后每次执行的时候,就不需要编译了,但是直接利用SQL的话,需要每次运行的时候都重新编译一次,所以使用存储过程可以提高数据库的执行速度。
  • 当对数据库进行复杂操作的时候,利用存储过程进行封装,可以减少代码出错的几率,并且MSSQL本身具有代码调试能力,可以很容易的定位到出错的语句。
  • 存储过程可以重复使用,可以提高开发人员的开发效率。
  • 安全性高,可以设定只有特定权限的用户对存储过程进行操作;也可以在一定的程度上预防SQL注入操作。

1.2 Category

  • 存储过程主要分以下几类
    1.系统存储过程:就是以SP_开头的存储过程,用来进行系统的各种设定,取得信息,进行相关的管理工作等等;
    2.扩展存储过程:就是以XP_开头的,用来调用操作系统提供的功能。
    3.用户自定义的存储过程。

2. 系统存储过程

2.1 介绍

类别 描述
活动Geo-Replication存储过程 用于管理 Azure SQL 数据库中的活动Geo-Replication配置
目录存储过程 用于实现 ODBC 数据字典功能,并隔离 ODBC 应用程序以使其不受基础系统表更改的影响。
变更数据捕获存储过程 用于启用、禁用、或报告变更数据捕获对象。
游标存储过程 用于实现游标变量功能。
数据收集器存储过程 用于处理数据收集器和以下组件:收集组、收集项和收集类型。
数据库引擎存储过程 用于SQL Server数据库引擎的常规维护。
数据库邮件存储过程 (Transact-SQL) 用于从 SQL Server 实例中执行电子邮件操作。
数据库维护计划存储过程 用于设置管理数据库性能所需的核心维护任务。
分布式查询存储过程 用于实现和管理分布式查询。
Filestream 和 FileTable 存储过程 (Transact-SQL) 用于配置和管理 FILESTREAM 和 FileTable 功能。
防火墙规则存储过程 (Azure SQL数据库) 用于配置 Azure SQL 数据库防火墙。
全文搜索存储过程 用于实现和查询全文索引。
常规扩展存储过程 用于为各种维护活动提供从 SQL Server 实例到外部程序的接口。
日志传送存储过程 用于配置、修改和监视日志传送配置。
管理数据仓库存储过程 (Transact-SQL) 用于配置管理数据仓库。
MSDTC 存储过程 用于重置 Microsoft 分布式事务处理协调器 (MSDTC) 日志或查看 MSDTC 统计信息。
OLE 自动化存储过程 用于启用标准自动化对象以在标准 Transact-SQL 批处理中使用。
基于策略的管理存储过程 用于基于策略的管理。
PolyBase 存储过程 在 PolyBase 横向扩展组中添加或删除计算机。
查询存储存储过程 (Transact-SQL) 用于优化性能。
复制存储过程 用于管理复制。
安全性存储过程 用于管理安全性。
快照备份存储过程 用于删除FILE_SNAPSHOT备份及其所有快照或删除单个备份文件快照。
空间索引存储过程 用于分析和提高空间索引的索引性能。
SQL Server 代理存储过程 由SQL Server Profiler用于监视性能和活动。
SQL Server Profiler 存储过程 由SQL Server 代理用于管理计划和事件驱动的活动。
Stretch Database 存储过程 用于管理延伸数据库。
临时表存储过程 用于临时表
XML 存储过程 用于 XML 文本管理。

3. 扩展存储过程

  • 扩展存储过程: https://learn.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/general-extended-stored-procedures-transact-sql?view=sql-server-ver16.

3.1 Introduction

  • 主要有一下几类
    【新星计划2023】SQL SERVER (04) -- 存储过程_第1张图片

3.2 Demo

  • 基本不会用到。

4. 自定义存储过程

4.1 语法

  • sql语法
    【新星计划2023】SQL SERVER (04) -- 存储过程_第2张图片
  • 参数介绍
    在这里插入图片描述
    【新星计划2023】SQL SERVER (04) -- 存储过程_第3张图片
    【新星计划2023】SQL SERVER (04) -- 存储过程_第4张图片

4.2 Demo

4.2.1 简单的存储过程

// show db name
CREATE PROC What_DB_is_this
AS
SELECT DB_NAME() AS ThisDB;

//execute
EXEC What_DB_is_this;

4.2.2 无参的存储过程

// show table LastName, FirstName, JobTitle, Department
CREATE PROCEDURE HumanResources.uspGetAllEmployees
AS
    SET NOCOUNT ON;
    SELECT LastName, FirstName, JobTitle, Department
    FROM HumanResources.vEmployeeDepartment;

//execute(3种方法)
EXECUTE HumanResources.uspGetAllEmployees;
EXEC HumanResources.uspGetAllEmployees;
HumanResources.uspGetAllEmployees;

4.2.3 传参的存储过程

// show table LastName, FirstName, JobTitle, Department
IF OBJECT_ID ( 'HumanResources.uspGetEmployees', 'P' ) IS NOT NULL
    DROP PROCEDURE HumanResources.uspGetEmployees;
GO
CREATE PROCEDURE HumanResources.uspGetEmployees
    @LastName NVARCHAR(50),
    @FirstName NVARCHAR(50)
AS
    SET NOCOUNT ON;
    SELECT FirstName, LastName, JobTitle, Department
    FROM HumanResources.vEmployeeDepartment
    WHERE FirstName = @FirstName AND LastName = @LastName;
GO

//execute(4种方法)
EXECUTE HumanResources.uspGetEmployees N'Ackerman', N'Pilar';
-- Or
EXEC HumanResources.uspGetEmployees @LastName = N'Ackerman', @FirstName = N'Pilar';
GO
-- Or
EXECUTE HumanResources.uspGetEmployees @FirstName = N'Pilar', @LastName = N'Ackerman';
GO
-- Or, if this procedure is the first statement within a batch:
HumanResources.uspGetEmployees N'Ackerman', N'Pilar';

4.2.4 通配符传参的存储过程

// show table LastName, FirstName, JobTitle, Department
IF OBJECT_ID ( 'HumanResources.uspGetEmployees2', 'P' ) IS NOT NULL
    DROP PROCEDURE HumanResources.uspGetEmployees2;
GO
CREATE PROCEDURE HumanResources.uspGetEmployees2
    @LastName NVARCHAR(50) = N'D%',
    @FirstName NVARCHAR(50) = N'%'
AS
    SET NOCOUNT ON;
    SELECT FirstName, LastName, JobTitle, Department
    FROM HumanResources.vEmployeeDepartment
    WHERE FirstName LIKE @FirstName AND LastName LIKE @LastName;

//execute(6种方法)
EXECUTE HumanResources.uspGetEmployees2;
-- Or
EXECUTE HumanResources.uspGetEmployees2 N'Wi%';
-- Or
EXECUTE HumanResources.uspGetEmployees2 @FirstName = N'%';
-- Or
EXECUTE HumanResources.uspGetEmployees2 N'[CK]ars[OE]n';
-- Or
EXECUTE HumanResources.uspGetEmployees2 N'Hesse', N'Stefen';
-- Or
EXECUTE HumanResources.uspGetEmployees2 N'H%', N'S%';

4.2.5 使用out参数的存储过程

IF OBJECT_ID ( 'Production.uspGetList', 'P' ) IS NOT NULL
    DROP PROCEDURE Production.uspGetList;
GO
CREATE PROCEDURE Production.uspGetList @Product VARCHAR(40)
    , @MaxPrice MONEY
    , @ComparePrice MONEY OUTPUT
    , @ListPrice MONEY OUT
AS
    SET NOCOUNT ON;
    SELECT p.[Name] AS Product, p.ListPrice AS 'List Price'
    FROM Production.Product AS p
    JOIN Production.ProductSubcategory AS s
      ON p.ProductSubcategoryID = s.ProductSubcategoryID
    WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice;
-- Populate the output variable @ListPprice.
SET @ListPrice = (SELECT MAX(p.ListPrice)
    FROM Production.Product AS p
    JOIN Production.ProductSubcategory AS s
      ON p.ProductSubcategoryID = s.ProductSubcategoryID
    WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice);
-- Populate the output variable @compareprice.
SET @ComparePrice = @MaxPrice;
GO
  • 详解
    1.定义两个变数接受结果
    @ComparePrice MONEY OUTPUT
    @ListPrice MONEY OUT
    2.给结果赋值
    SET @ComparePrice = @MaxPrice;

4.2.6 使用存储过程修改数据

CREATE PROCEDURE HumanResources.Update_VacationHours
	@NewHours SMALLINT, 
	@Rowcount INT OUTPUT
AS
	SET NOCOUNT ON;
	UPDATE HumanResources.Employee
	SET VacationHours =
	    ( CASE
	        WHEN SalariedFlag = 0 THEN VacationHours + @NewHours
	        ELSE @NewHours
	        END
	    )
	WHERE CurrentFlag = 1;
	SET @Rowcount = @@rowcount;

GO
DECLARE @Rowcount INT
EXEC HumanResources.Update_VacationHours 40, @Rowcount OUTPUT
PRINT @Rowcount;

5. Awakening

     在一秒钟内看到本质的人和花半辈子也看不清一件事本质的人,自然是不一样的命运。

在这里插入图片描述

你可能感兴趣的:(Sql,Server,数据库,sql,mysql)