Sqlserver存储过程快速上手分享

ops/2024/9/20 3:56:05/ 标签: sqlserver, 数据库

文章目录

  • 一、前言
    • 1.1 什么是Sqlserver
    • 1.2 什么是存储过程
    • 1.3 使用场景
    • 1.4 Sqlserver存储过程编写过程
    • 1.5 使用工具
  • 二、创建一个sqlserver的存储过程
    • 2.1 编写一个基础的结构
    • 2.2 确定输入参数
    • 2.3 编写过程
      • 思考:天数进行for循环
      • 思考:然后把for循环的结果存起来
      • 关于定义变量
      • 写中间表(创建表、移除表)
      • 编写函数
  • 三、结论
    • 思考:如何调用其他存储过程
      • 方式一
      • 方式二

一、前言

1.1 什么是Sqlserver

根据百度百科介绍:美国Microsoft公司推出的一种关系型数据库系统。SQL Server是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,实现了与WindowsNT的有机结合,提供了基于事务的企业级信息管理系统方案。

1.2 什么是存储过程

根据Microsoft介绍: SQL Server 中的存储过程是由一个或多个 Transact-SQL 语句或对 Microsoft .NET Framework 公共语言运行时 (CLR) 方法的引用构成的一个组。 过程与其他编程语言中的构造相似,这是因为它们都可以:

接受输入参数并以输出参数的格式向调用程序返回多个值。
包含用于在数据库中执行操作的编程语句。 这包括调用其他过程。
向调用程序返回状态值,以指明成功或失败(以及失败的原因)。

1.3 使用场景

Sqlserver在一些小型的场景还是非常有用的。一般CS架构,如果没有单独架设服务器,只有一个客户端+一个数据库,这种结构来说,Sqlserver就承担着服务器的功能,Sqlserver存储过程可以用于大部分逻辑的编写,比如报表、逻辑判断、数据采集、监控等。

注意1:由于存储过程,可以看成为作为服务器编程使用,该功能具备增删改查的功能,增删改查就满足了大部分使用场景了。但是由于数据库本身的原因,如果是非常大量的操作,建议还是使用服务端程序进行操作,存储过程的维护和扩展的功能,真的不是很强大,建议评估后再使用

注意2:由于sqlserver

1.4 Sqlserver存储过程编写过程

大概步骤

编写基础结构、并且进行必要的注释
1、确定输入参数
1.1 对入参进行判断
2、编写过程
2.1 定义变量
2.2 写for循环
2.3 if判断(根据条件创建表、根据条件执行不同逻辑)
2.3 写中间表(创建表、移除表)
2.4 编写函数
3、确定返回结果
3.1 确定返回的字段
3.2 确定返回表的数量

问题思考:

问题1:如何调用其他存储过程

1.5 使用工具

目前连接 Sqlserver的工具有 SSMS、Navicat、DBeaver。其实对于编写存储过程来,这些都大同小异,主要是看人的使用情况。

我更偏向于使用 Navicat

sqlserver_48">二、创建一个sqlserver的存储过程

2.1 编写一个基础的结构

CREATE PROCEDURE [dbo].[Can_getScore]
AS
BEGIN-- routine body goes here, e.g.-- SELECT 'Navicat for SQL Server'
END

以上是最简单的结构,dbo为数据库名称、Can_getScore为存储过程名称,但是目前该存储过程不能保存,因为最少需要写一个 DML 语句

在最顶部编写注释

/*主要功能:xxx开发者:xxxx开发时间:xxxx测试:EXEC Can_getScore xxxxx
*/

最终结果为

/*主要功能:按一个月时间段获取学生成绩、按天获取学生成绩开发者:Can开发时间:2024-08-09测试:EXEC Can_getScore xxx
*/
CREATE PROCEDURE [dbo].[Can_getScore]
AS
BEGINSELECT * FROM Student_Score
END

2.2 确定输入参数

根据需求:按一个月时间段(1-5 6-10 11-15 16-20 21-25 26-月底)获取学生成绩或者按一个月30天获取学生成绩
那么参数1,按时间段的参数为1 按天为2
参数2:指定是哪个月的范围
参数3:可以是指定获取某个人的数据

注意,存储过程是根据顺序来判断对应的入参的

例如
EXEC Can_getScore 1,‘2024-08-01’,‘2024-08-05’,‘小明’ — 按8月份时间段获取该学生数据

CREATE PROCEDURE [dbo].[Can_getScore]
@STYLE INT=1,
@StartDate DATETIME,
@EndDate DATETIME,
@Username VARCHAR(50) = ''
AS
BEGINIF @STYLE=1BEGINSELECT * FROM Student_ScoreENDIF @STYLE=2BEGINSELECT * FROM Student_ScoreEND
END
  • 1.1 对入参进行判断
    例如 @STYLE 只能输入 1 和 2

@StartDate @EndDate的开始时间和结束时间只能同一个月份

	--- 前置条件IF @STYLE != 1 AND @STYLE != 2BEGINRAISERROR('类型只能输入1或2.', 16, 1)RETURNENDIF MONTH(@StartDate) != MONTH(@EndDate) OR YEAR(@StartDate) != YEAR(@EndDate) BEGINRAISERROR('只能查找同个年月份的数据.', 16, 1)RETURNEND

2.3 编写过程

思考:天数进行for循环

例如 2024-08-09 ~ 2024-08-19,天数进行循环,并且获取当天早上00:00:00 到晚上 23:59:59

DECLARE @MiddleDate DATE = @StartDate;WHILE @MiddleDate <= @EndDate  BEGINSELECT @MiddleDate=DATEADD(DAY, 1, @MiddleDate)END

思考:然后把for循环的结果存起来

    ---创建表,并把数据取下来CREATE TABLE #TMP1(ID NVARCHAR(100),minTime DATETIME,maxTime DATETIME);DECLARE @MiddleDate DATE = @StartDate;DECLARE @StartDatefor1 DATETIME2(7), @endDatefor1 DATETIME2(7); WHILE @MiddleDate <= @EndDate  BEGINSET @StartDatefor1 = CAST(CAST(@MiddleDate AS VARCHAR(10)) + ' 08:00:00' AS DATETIME2(7)); SET @endDatefor1 = DATEADD(SECOND, -1, CAST(CAST(DATEADD(DAY, 1, @MiddleDate) AS VARCHAR(10)) + ' 08:00:00' AS DATETIME2(7)));insert into #TMP1 (ID,minTime,maxTime) values (@MiddleDate,@StartDatefor1,@endDatefor1)SELECT @MiddleDate=DATEADD(DAY, 1, @MiddleDate)ENDSELECT * FROM #TMP1DROP TABLE #TMP1

结果运行

EXEC Can_getScore 1,‘2024-07-01’,‘2024-08-05’,‘’

2024-07-01	2024-07-01 08:00:00.000	2024-07-02 07:59:59.000
2024-07-02	2024-07-02 08:00:00.000	2024-07-03 07:59:59.000
2024-07-03	2024-07-03 08:00:00.000	2024-07-04 07:59:59.000
2024-07-04	2024-07-04 08:00:00.000	2024-07-05 07:59:59.000
2024-07-05	2024-07-05 08:00:00.000	2024-07-06 07:59:59.000

关于定义变量

1、定义字符串
declare @FSELLER  VARCHAR(100)='';
2、定义Int类型
DECLARE @pavg int
3、定义时间类型
DECLARE @StartDate DATE = '2024-07-01';
4、定义Double类型
DECLARE @avg_price DECIMAL(23,10)=0

写中间表(创建表、移除表)

编写函数

案例,创建一个函数

该函数的功能,把“秒”转化为“时间”

CREATE FUNCTION [dbo].[F_SecondToString]
(@second int --秒
)
RETURNS NVARCHAR(100)
AS 
BEGIN
DECLARE @Result NVARCHAR(100)
Declare @h int
Declare @m int
Declare @s int
set @h=@second/3600
set @m=@second%3600/60
set @s=@second%3600%60select @Result=right(REPLICATE('',1)+convert(varchar(50),@h),3)+':'
+right(REPLICATE('0',1)+convert(varchar(50),@m),2)+':'
+right(REPLICATE('0',1)+convert(varchar(50),@s),2)--SET @Result=(SELECT CONVERT(VARCHAR(10),@second/3600)+'时'+CONVERT(VARCHAR(10),@second%3600/60)+'分'+CONVERT(VARCHAR(10),@second%3600%60)+'秒')RETURN @Result
END

查看 1314 是多少小时分钟

DECLARE @secNumber int=1314select dbo.F_SecondToString(@secNumber)

结果

0:21:54

以上可以把 函数与过程结合起来使用

三、结论

让我们再回顾一下这个过程

编写基础结构、并且进行必要的注释
1、确定输入参数
1.1 对入参进行判断
2、编写过程
2.1 定义变量
2.2 写for循环
2.3 if判断(根据条件创建表、根据条件执行不同逻辑)
2.3 写中间表(创建表、移除表)
2.4 编写函数
3、确定返回结果
3.1 确定返回的字段
3.2 确定返回表的数量

有增删改查、for循环、if等,这不妥妥可以进行编程吗?

所以sqlserver的存储过程,可以作为一个后端服务使用,类似接口一样的存在。

但是在编写存储过程的过程中,记得进行备份,还有在写update delete语句的时候,要小心。

思考:如何调用其他存储过程

方式一

目前有两个方式,一个是存储过程中调用存储过程,用变量参数,例如
存储过程1

ALTER PROCEDURE [dbo].[Can_getNow]
@NOWString VARCHAR(100)
AS
BEGIN-- routine body goes here, e.g.-- SELECT 'Navicat for SQL Server'SELECT @NOWString = CONVERT(VARCHAR(6), GETDATE(), 112)SELECT @NOWStringEND

存储过程调用存储过程1

ALTER PROCEDURE [dbo].[Can_myTest]
AS
BEGIN-- routine body goes here, e.g.-- SELECT 'Navicat for SQL Server'declare @NOWString  VARCHAR(100)='';EXEC Can_getNow @NOWStringSELECT @NOWString
END

方式二

调用方,创建一个表
被调用放,把数据存进去
调用放,把数据获取出来,然后删除该表

本课程分享就到这里了。


http://www.ppmy.cn/ops/93859.html

相关文章

RabbitMQ消息队列

消息队列概念 什么是消息队列 消息&#xff08;Message&#xff09;是指在应用间传送的数据消息队列&#xff08;Message Queue&#xff09;是一种应用间的通信方式解决方法&#xff0c;确保消息的可靠传递、主流消息队列 目前主流的几大消息1队列有&#xff1a;RabitMQ、Acti…

DLMS/COSEM中的信息安全:安全密钥(下)

2.5组件B终端实体证书类型要由DLMS/COSEM服务器支持 每个DLMS/COSEM服务器应使用X.509 v3格式&#xff0c;并包含以下任一项&#xff1a; ——具有P-256或P-384 ECDSA功能的签名密钥&#xff1b;或 ——具有P-256或P-384 ECDSA功能的密钥协商密钥。 每张证书均应使用ECDSA进行签…

无人机之陀螺仪篇

陀螺仪器最早是用于航海导航&#xff0c;但随着科学技术的发展&#xff0c;它在航空和航天事业中也得到广泛的应用。陀螺仪不仅可以作为指示仪表&#xff0c;而更重要的是它可以作为自动控制系统中的一个敏感元件&#xff0c;即可作为信号传感器。 根据需要&#xff0c;陀螺仪器…

Magic Number Group

登录—专业IT笔试面试备考平台_牛客网、 把每个数的质因数分解出来&#xff0c;用莫队做&#xff0c;找区间众数即可 // Problem: Magic Number Group // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/21592/G // Memory Limit: 524288 MB // Time Limit:…

如何在 Windows 上安装 FastReport .NET 及其组件

要安装 FastReport.NET 软件及其组件&#xff0c;您需要在 cpanel 中下载安装程序分发并 运行它。当使用具有 UAC&#xff08;用户帐户控制&#xff09;的操作系统时&#xff0c;您需要同意运行该软件。 FastReport .NET 是适用于.NET Core 3&#xff0c;ASP.NET&#xff0c;M…

无线领夹麦克风六大常见缺陷曝光:拒绝冲动谨防劣质产品!

​在当下这个全民皆为媒体的时代大潮中&#xff0c;视频分享已然成为了引领风尚的指向标。在自媒体领域竞争愈发激烈的态势下&#xff0c;若要在这片广阔海洋中扬帆远航&#xff0c;优秀的作品毫无疑问是吸引观众的关键所在。而想要塑造出这样的卓越之作&#xff0c;除了需要创…

Linux——进程(2)

一、父子进程的关系 子进程是父进程的副本。 子进程获得父进程数据段&#xff0c;堆&#xff0c;栈&#xff0c;正文段共享。 在fork之后&#xff0c;一般情况哪个会先运行&#xff0c;是不确定的。 如果非要确定那个要先运行&#xff0c;需要IPC机制。 1、区别 1&…

ZAN与Mysten Labs合作推进Web3基础设施开发

Mysten Labs是一家Web3基础设施公司&#xff0c;也是Sui区块链的开发公司&#xff0c;今天宣布与蚂蚁数字科技的技术品牌ZAN建立合作伙伴关系。 通过整合Sui&#xff0c;ZAN旨在加速其Web3应用程序的开发和采用。该合作将专注于为Mysten Labs在两个关键领域提供技术支持&#…

oracle 数据中lsnrctl 是干啥的

突然发现lsnrctl stop 之后&#xff0c;依然可以启动数据库 就感觉怪怪的&#xff0c;一直以为这个是数据库的守护进程&#xff0c;原来不是。。。。 lsnrctl 是 Oracle 监听器控制实用程序的命令行界面工具&#xff0c;用于管理 Oracle Net 服务监听器。监听器是 Oracle 网络…

Python爬虫——爬取bilibili中的视频

爬取bilibili中的视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入bilibili官网中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频播放页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到…

汽车精密设计、无人机外形优化总是遇难题?CFD参数优化详解2来袭

数值仿真的参数优化 在上期文章中&#xff0c;我们给大家带来了机翼多学科优化、拟合试验曲线、一维CFD模型参数的DOE和回归分析三个参数优化案例&#xff0c;本期文章将继续为各位讲解多个 Altair CFD 参数优化案例&#xff0c;一起来看看吧。 案例&#xff1a;汽车排气管形状…

7.2 我们机房断网了!--图文解析

7.2 我们机房断网了&#xff01;–图文解析 原文链接&#xff1a;https://juejin.cn/post/7399569706183049250 原文作者&#xff1a;哔哩哔哩技术团队 1、背景 原文&#xff1a; 2024 年 7 月 2 日 10:04&#xff0c;我站机房 A 公网物理光缆中断&#xff0c;导致机房 A …

Electron 开发桌面应用程序用于对接USB Audio Class协议

开发用于对接USB Audio Class协议的Electron桌面应用程序是一个复杂的任务&#xff0c;可能涉及多个开源库和项目的组合。以下是一些开源项目和库&#xff0c;它们可以帮助你实现这个目标&#xff1a; 1. Electron Electron 是一个用于构建跨平台桌面应用程序的框架。你可以使…

go语言后端开发学习(五)——如何在项目中使用Viper来配置环境

前言 在之前的文章中我们就介绍过用go-ini来读取配置文件,但是当时我们在介绍时说了他只能读取.ini格式的配置文件所以局限性较大,这里我们介绍一个适用范围更大的配置管理第三方库——Viper。 什么是Viper Viper是适用于Go应用程序&#xff08;包括Twelve-Factor App&#…

Ubuntu系统的基础操作和使用|Linux|安装|网络连接|更新与升级系统|系统维护|故障排除|监控|桌面环境|虚拟机|快捷键

目录 1. Ubuntu系统的安装与初步设置 1.1 下载与安装Ubuntu 1.2 创建用户和设置密码 1.3 配置网络连接 1.4 更新与升级系统 2. Ubuntu的基本操作 2.1 文件与目录管理 2.2 系统进程管理 2.3 软件安装与管理 2.4 权限与用户管理 3. 系统维护与故障排除 3.1 系统日志查…

HarmonyOS鸿蒙开发岗位面试中关于组件的问题总结

文章目录 1. 鸿蒙组件的基本概念2. 组件的使用3. 布局管理4. 组件间通信5. 组件化开发6. 性能优化7. 实战应用 鸿蒙应用开发岗位面试中关于鸿蒙组件的问题&#xff0c;通常会涉及多个关键知识点&#xff0c;这些知识点涵盖了鸿蒙组件的基本概念、使用、布局管理、性能优化、组件…

Go语言并发编程实战:掌握并发模型,提升应用性能

1. 引言 1.1 并发编程的重要性 在现代软件开发中&#xff0c;并发编程已经成为了一种不可或缺的技术。随着多核处理器的普及和云计算的兴起&#xff0c;应用程序需要能够有效地利用并发处理能力&#xff0c;以提高性能和用户体验。并发编程使得程序能够在同一时间内处理多个任…

Qt Xlsx使用教程、Qt操作Excel、Qt生成Excel图表、跨平台不依赖Office 直接使用源码

1.Qt Xlsx库简介 官方文档&#xff1a;Qt Xlsx | QtXlsx 0.3 (debao.me) 下载地址&#xff1a;dbzhang800/QtXlsxWriter: .xlsx file reader and writer for Qt5 (github.com) CSDN下载地址&#xff1a;QtXlsxWriter-master源码资源-CSDN文库 2.源码取出 3.目录结构 再根目…

股指期货套期保值中的展期管理有哪些?

在复杂的金融市场环境中&#xff0c;展期作为一种重要的风险管理工具&#xff0c;被广泛应用于期货交易中&#xff0c;特别是当投资者需要对长期资产进行套期保值时。展期的核心思想在于&#xff0c;通过连续替换高流动性的近月期货合约来替代流动性较差的远月合约&#xff0c;…

JS【详解】对象的内部属性 vs 内部方法

每个JS 对象都有很多内部属性和方法&#xff0c;仅供 JS 引擎管理和操作对象使用&#xff0c;对开发者不可见&#xff0c;只能用特殊的方法访问和修改&#xff08;不建议修改&#xff09; 了解它们可以帮助我们更好的理解对象的行为&#xff0c;无需深究其具体实现 下文中&am…