当前位置: 首页 > news >正文

Sqlserver存储过程

系列文章目录

文章目录

  • 系列文章目录
  • 一、准备工作
  • 二、编写存储过程
    • 1、根据学生ID查询学生信息
    • 2、根据学生ID查询所有成绩
    • 3、插入学生的存储过程
    • 4、删除学生信息
  • 二、每周定期refresh index & sp


一、准备工作

-- 创建 Students 表
CREATE TABLE Students (StudentID INT PRIMARY KEY IDENTITY,Name NVARCHAR(50),Gender NCHAR(10),BirthDate DATE,Major NVARCHAR(50)
);-- 创建 Scores 表
CREATE TABLE ScoresPlus (ScoreID INT PRIMARY KEY IDENTITY,StudentID INT,Course NVARCHAR(50),Score INT,FOREIGN KEY (StudentID) REFERENCES Students(StudentID)
);
-- 插入学生数据
INSERT INTO Students (Name, Gender, BirthDate, Major)
VALUES 
('张三', '男', '2000-01-01', '计算机科学'),
('李四', '女', '2001-05-15', '软件工程'),
('王五', '男', '1999-08-20', '人工智能');-- 插入成绩数据
INSERT INTO ScoresPlus (StudentID, Course, Score)
VALUES 
(1, '数学', 85),
(1, '英语', 90),
(2, '数学', 78),
(2, '英语', 88),
(3, '数学', 92),
(3, '英语', 89);

二、编写存储过程

1、根据学生ID查询学生信息

CREATE PROCEDURE GetStudentById@StudentID INT
AS
BEGINSELECT * FROM Students WHERE StudentID = @StudentID;
END;使用:
EXEC GetStudentById @StudentID = 1;

2、根据学生ID查询所有成绩

-- 查询学生成绩的存储过程
CREATE PROCEDURE GetScoresByStudentId@StudentID INT
AS
BEGINSELECT s.Course, s.ScoreFROM Scores sWHERE s.StudentID = @StudentID;
END;使用:
EXEC GetScoresByStudentId @StudentID = 1;

3、插入学生的存储过程

CREATE PROCEDURE InsertStudent@Name NVARCHAR(50),@Gender NCHAR(10),@BirthDate DATE,@Major NVARCHAR(50)
AS
BEGININSERT INTO Students (Name, Gender, BirthDate, Major)VALUES (@Name, @Gender, @BirthDate, @Major);
END;使用:
EXEC InsertStudent @Name = '赵六',@Gender = '男',@BirthDate = '2002-03-10',@Major = '网络工程';

4、删除学生信息

-- 删除学生信息的存储过程
CREATE PROCEDURE DeleteStudent@StudentID INT
AS
BEGINIF EXISTS (SELECT 1 FROM Students WHERE StudentID = @StudentID)BEGINDELETE FROM Students WHERE StudentID = @StudentID;PRINT '学生已删除。';ENDELSEBEGINPRINT '学生不存在,无法删除。';END
END;使用:
EXEC DeleteStudent @StudentID = 1;

二、每周定期refresh index & sp

目标:
获取所有表名(TableName)
获取每个表的所有索引(IndexName)
获取所有存储过程名称(SP Name)
对这些对象进行维护操作:
对表的索引进行 REBUILD 或 REORGANIZE
对存储过程进行 sp_recompile
-- 获取所有表名和对应的索引名
SELECT t.name AS TableName,i.name AS IndexName
FROM sys.tables t
INNER JOIN sys.indexes i ON t.object_id = i.object_id
WHERE i.type > 0 -- 排除堆表
ORDER BY t.name, i.name;
-- 获取所有存储过程名称
SELECT name AS SPName
FROM sys.procedures
WHERE type = 'P' -- 存储过程
ORDER BY name;
CREATE PROCEDURE RefreshIndexesAndSPs
AS
BEGINSET NOCOUNT ON;DECLARE @TableName NVARCHAR(128)DECLARE @IndexName NVARCHAR(128)DECLARE @SQL NVARCHAR(MAX)-- 获取所有表和索引DECLARE cur CURSOR FORSELECT t.name AS TableName,i.name AS IndexNameFROM sys.tables tINNER JOIN sys.indexes i ON t.object_id = i.object_idWHERE i.type > 0 -- 排除堆表OPEN curFETCH NEXT FROM cur INTO @TableName, @IndexNameWHILE @@FETCH_STATUS = 0BEGIN-- 执行 REBUILD 索引SET @SQL = N'ALTER INDEX [' + @IndexName + '] ON [' + @TableName + '] REBUILD;'EXEC sp_executesql @SQL-- 可选:根据碎片率判断是否使用 REORGANIZE-- 这里为了简化,直接使用 REBUILDFETCH NEXT FROM cur INTO @TableName, @IndexNameENDCLOSE curDEALLOCATE cur-- 重新编译所有存储过程DECLARE @SPName NVARCHAR(128)DECLARE cur_sp CURSOR FORSELECT name FROM sys.procedures WHERE type = 'P'OPEN cur_spFETCH NEXT FROM cur_sp INTO @SPNameWHILE @@FETCH_STATUS = 0BEGINSET @SQL = N'EXEC sp_recompile ''' + @SPName + ''''EXEC sp_executesql @SQLFETCH NEXT FROM cur_sp INTO @SPNameENDCLOSE cur_spDEALLOCATE cur_spPRINT '索引刷新和存储过程重新编译完成。'
END使用:
EXEC RefreshIndexesAndSPs;
注意:
REBUILD 会锁表,建议在低峰期执行
事务控制	建议加 BEGIN TRANSACTION 和 COMMIT,避免失败
权限要求	需要 ALTER 权限对表和存储过程
可选优化	根据 sys.dm_db_index_physical_stats 的 avg_fragmentation_percent 决定是 REBUILD 还是 REORGANIZE
http://www.dtcms.com/a/346913.html

相关文章:

  • 拼豆设计生成器(支持大写字母、数字,颜色自定义)
  • 力扣 30 天 JavaScript 挑战 第38天 (第九题)学习了 语句表达式的区别 高级函数 promise async await 节流
  • 三、Bpmnjs 核心组件与架构介绍
  • 深入剖析结构体内存对齐
  • 达梦数据库巡检常用SQL(一)
  • Base64 编码优化 Web 图片加载:异步响应式架构(Java 后端 + 前端全流程实现)
  • Linux问答题:分析和存储日志
  • [特殊字符] 在 Windows 新电脑上配置 GitHub SSH 的完整记录(含坑点与解决方案)
  • JUC之AQS
  • csrf漏洞学习笔记
  • C++ 20: Concepts 与Requires
  • 告别SaaS数据绑架,拥抱数据主权:XK+独立部署版跨境商城定制,为海外物流企业深度赋能
  • CentOS创建管理员用户feixue并设置密码全教程
  • 【c++进阶系列】:万字详解多态
  • 快速掌握Java非线性数据结构:树(二叉树、平衡二叉树、多路平衡树)、堆、图【算法必备】
  • STM32学习笔记19-WDG
  • linux shell测试函数
  • 百度深度学习面试:batch_size的选择问题
  • Linux总线设备驱动模型深度理解
  • 玩转Vue3高级特性:Teleport、Suspense与自定义渲染
  • 内联函数是什么以及的优点和缺点
  • ICP语序文字点选验证逆向分析(含Py纯算源码)
  • 基于SpringBoot+vue校园点餐系统
  • 【升级版】从零到一训练一个 0.6B 的 MoE 大语言模型
  • RabbitMQ面试精讲 Day 28:Docker与Kubernetes部署实践
  • JAVA核心基础篇-枚举
  • 【Linux网络编程】分布式Json-RPC框架 - 项目设计
  • Java试题-选择题(16)
  • 2025年渗透测试面试题总结-29(题目+回答)
  • 基于ResNet50的血细胞图像分类模型训练全记录