资讯详情 SQL Server实验大作业全攻略:代码与报告一致的事务实战
📅 2026/10/13 4:18:08
简介这份资源是面向软件工程本科生的数据库课程实验大作业完整资料以小区物业收费管理系统为项目背景帮助读者完成从需求分析到数据库设计、建表、查询、视图、索引、授权管理等全流程实践适合正在学习 Microsoft SQL Server 或准备数据库课程设计的学生参考。压缩包共16个文件约12.33MB以13个SQL脚本为核心覆盖建表、插入、更新与删除、查询、视图、索引、创建用户及授权管理等操作另含1份docx实验报告、1份PDF版E-R图和1份可修改的vsd源图便于理解实体关系与撰写文档。资源围绕业主、部门、员工与收费四类信息展开涉及房号唯一标识、员工职务权限划分、物业费与水电费等按月计费规则等典型业务逻辑可帮助读者掌握数据库建模、权限控制与复杂查询的实现思路。目前已有1428人学习下载适合作为课程实验与项目实战的参考方案。1. 从一份能跑通的 SQL Server 实验大作业说起它到底该长什么样很多人搜「数据库 Microsoft SQL Server 实验大作业」心里其实没底网上那些所谓的大作业要么只有一份干巴巴的 Word 报告要么只有几段跑不通的 SQL代码和报告对不上号答辩时老师一问就露馅。我带的几届学生里翻车最多的不是不会写 SQL而是建库脚本、业务代码、实验报告三者脱节——报告里写的表结构和实际脚本字段对不上截图里的数据和脚本插入的数据不一致最后只能靠玄学硬编。这篇笔记就按一线做法把一份「包含代码及实验报告」的 SQL Server 大作业拆开讲清楚从环境选型、库表设计、增删改查与事务并发到报告怎么和代码一一对应再到答辩前怎么自检。适合正在做数据库课程设计、实验大作业的在校生也适合需要快速交付一套可演示 SQL Server 案例的从业者。核心目标只有一个你照着做能交出一份代码能跑、报告能对、老师能问、自己讲得清的作业。下面所有内容以 SQL Server 2012 及以上版本为基准语法在 2019/2022 上同样适用。2. 环境与选题SQL Server 装完连不上之前先把这几件事定死2.1 版本选择与实例配置的取舍SQL Server 的版本差异在大作业这个量级上其实影响很小真正卡人的是实例配置和连接方式。常见做法是选 SQL Server 2012 或 2019 的 Developer 版免费、功能全安装时实例名用默认实例或命名实例都行但一定要记住自己选的是哪个。命名实例连接时要写成主机名\实例名默认实例直接写主机名或localhost。安装完成后最容易翻车的是服务没启动和TCP/IP 协议没开。SQL Server 默认可能只启用了共享内存协议外部工具连不上。打开「SQL Server 配置管理器」在「SQL Server 网络配置」里把 TCP/IP 启用端口默认 1433改完重启服务。这一步不做后面用任何客户端都会报「无法连接」。提示如果安装时选了「混合模式」认证记得设置 sa 密码并启用 sa 账户如果只用 Windows 认证连接字符串里就不要写用户名密码用集成认证。2.2 选题别贪大选一个能讲清事务的场景大作业选题决定了后面所有代码的复杂度。我一般建议选一个带明确业务闭环的小系统比如图书借阅、学生选课、超市进销存、酒店预订。判断标准很简单这个场景里有没有「一次操作要改多张表」的地方。有就说明你能用上事务没有就说明选题太单薄报告里写不出深度。以图书借阅为例核心表就四张读者表、图书表、借阅记录表、罚款表。借书这个动作要同时做三件事在借阅记录里插一条、把图书状态改成已借出、如果超期还要在罚款表插记录。这三步必须在一个事务里否则中途失败就会出现「书借出去了但状态没改」的脏数据。这就是你报告里能写、答辩时能讲的技术点。2.3 建库建表脚本一份能直接执行的初始化代码下面这份脚本是图书借阅系统的建库建表部分可以直接在 SSMS 里执行。注意字符集、主外键、约束都写全报告里的表结构章节直接对应这段代码。-- 创建数据库指定数据文件和日志文件路径 CREATE DATABASE LibraryDB ON PRIMARY ( NAME LibraryDB_Data, FILENAME D:\SQLData\LibraryDB_Data.mdf, SIZE 20MB, MAXSIZE 200MB, FILEGROWTH 10MB ) LOG ON ( NAME LibraryDB_Log, FILENAME D:\SQLData\LibraryDB_Log.ldf, SIZE 10MB, MAXSIZE 100MB, FILEGROWTH 5MB ); GO USE LibraryDB; GO -- 读者表主键自增卡号唯一 CREATE TABLE Readers ( ReaderID INT IDENTITY(1,1) PRIMARY KEY, CardNo VARCHAR(20) NOT NULL UNIQUE, ReaderName NVARCHAR(30) NOT NULL, Dept NVARCHAR(50), RegDate DATE DEFAULT GETDATE() ); -- 图书表状态字段用 0/1 表示在架/借出 CREATE TABLE Books ( BookID INT IDENTITY(1,1) PRIMARY KEY, ISBN VARCHAR(20) NOT NULL UNIQUE, Title NVARCHAR(100) NOT NULL, Author NVARCHAR(50), Status TINYINT DEFAULT 0 CHECK (Status IN (0,1)) ); -- 借阅记录表外键关联读者和图书 CREATE TABLE BorrowRecords ( RecordID INT IDENTITY(1,1) PRIMARY KEY, ReaderID INT NOT NULL, BookID INT NOT NULL, BorrowDate DATE NOT NULL, DueDate DATE NOT NULL, ReturnDate DATE NULL, CONSTRAINT FK_Borrow_Reader FOREIGN KEY (ReaderID) REFERENCES Readers(ReaderID), CONSTRAINT FK_Borrow_Book FOREIGN KEY (BookID) REFERENCES Books(BookID) ); -- 罚款表一条借阅记录最多一条罚款 CREATE TABLE Fines ( FineID INT IDENTITY(1,1) PRIMARY KEY, RecordID INT NOT NULL UNIQUE, Amount DECIMAL(8,2) NOT NULL, Paid TINYINT DEFAULT 0, CONSTRAINT FK_Fine_Record FOREIGN KEY (RecordID) REFERENCES BorrowRecords(RecordID) ); GO这段脚本的逻辑说明IDENTITY(1,1)让主键自动增长省去手动维护UNIQUE约束保证卡号和 ISBN 不重复CHECK约束把图书状态限制在 0 和 1避免脏值外键约束保证借阅记录不会引用不存在的读者或图书。参数上数据文件初始 20MB、日志 10MB对大作业足够路径按自己机器改。执行顺序不能乱先建库再USE再建表有外键依赖的表要放在被引用表之后。3. 增删改查与事务把「借书还书」写成能演示的存储过程3.1 基础 CRUD先让数据动起来报告里如果只有建表没有数据操作基本拿不到高分。先把增删改查写扎实再往上叠事务和并发。下面这几条覆盖了四种基本操作可以直接在 SSMS 里逐条跑。-- 插入读者和图书 INSERT INTO Readers (CardNo, ReaderName, Dept) VALUES (C001, N张三, N计算机学院); INSERT INTO Readers (CardNo, ReaderName, Dept) VALUES (C002, N李四, N外国语学院); INSERT INTO Books (ISBN, Title, Author) VALUES (9787111111111, N数据库系统概论, N王珊); INSERT INTO Books (ISBN, Title, Author) VALUES (9787111222222, N算法导论, NCormen); -- 查询联表查借阅情况 SELECT r.ReaderName, b.Title, br.BorrowDate, br.DueDate FROM BorrowRecords br JOIN Readers r ON br.ReaderID r.ReaderID JOIN Books b ON br.BookID b.BookID WHERE br.ReturnDate IS NULL; -- 更新修改图书状态 UPDATE Books SET Status 1 WHERE ISBN 9787111111111; -- 删除删除一条未归还的借阅记录实际业务中慎用 DELETE FROM BorrowRecords WHERE RecordID 1;逻辑说明INSERT里中文字符串前加N是 SQL Server 的写法表示 Unicode不加可能乱码。JOIN查询把三张表串起来是报告里「多表查询」章节的素材。UPDATE和DELETE一定要带WHERE不带就是全表操作这是新手最常见的翻车点。3.2 借书存储过程一个事务把三张表串起来存储过程是大作业的加分项也是把事务讲清楚的载体。借书这个动作要保证原子性插借阅记录、改图书状态、必要时插罚款三步要么全成要么全滚。CREATE PROCEDURE sp_BorrowBook CardNo VARCHAR(20), ISBN VARCHAR(20) AS BEGIN SET NOCOUNT ON; BEGIN TRY BEGIN TRANSACTION; DECLARE ReaderID INT, BookID INT, Status TINYINT; SELECT ReaderID ReaderID FROM Readers WHERE CardNo CardNo; SELECT BookID BookID, Status Status FROM Books WHERE ISBN ISBN; -- 校验读者存在、图书存在且在架 IF ReaderID IS NULL RAISERROR(N读者不存在, 16, 1); IF BookID IS NULL RAISERROR(N图书不存在, 16, 1); IF Status 1 RAISERROR(N图书已借出, 16, 1); INSERT INTO BorrowRecords (ReaderID, BookID, BorrowDate, DueDate) VALUES (ReaderID, BookID, GETDATE(), DATEADD(DAY, 30, GETDATE())); UPDATE Books SET Status 1 WHERE BookID BookID; COMMIT TRANSACTION; END TRY BEGIN CATCH IF TRANCOUNT 0 ROLLBACK TRANSACTION; THROW; END CATCH END; GO逻辑说明BEGIN TRY...BEGIN CATCH是 SQL Server 的错误处理结构TRANCOUNT判断当前是否有未提交事务有就回滚。RAISERROR抛出自定义错误信息THROW把原始错误往上抛。参数CardNo和ISBN是输入参数调用时写成EXEC sp_BorrowBook C001, 9787111111111。这里把校验放在事务内是为了保证校验和写入看到的是同一份数据避免并发下的竞态。3.3 并发与锁两个窗口同时借同一本书会怎样这是答辩时最容易被问的点。开两个查询窗口同时执行上面的借书存储过程借同一本书你会看到其中一个成功、另一个报「图书已借出」。原因在于UPDATE Books会对该行加排他锁第二个事务要等第一个提交后才能读到最新状态。如果想在报告里体现更细的锁控制可以在查询时加提示-- 读取时加更新锁防止其他事务在读取后修改 SELECT BookID BookID, Status Status FROM Books WITH (UPDLOCK, ROWLOCK) WHERE ISBN ISBN;UPDLOCK表示读取时加更新锁别人可以读但不能改ROWLOCK表示锁粒度到行。这两个提示在并发量不大的大作业里不是必须但写进报告能体现你对锁的理解。注意别滥用NOLOCK它虽然能避免阻塞但会读到脏数据答辩时被问到很难解释。4. 实验报告怎么写让代码、截图、结论三者对得上4.1 报告结构按「需求—设计—实现—测试」四段走一份能被认可的 SQL Server 实验报告结构上不需要花哨但每一段都要有代码或数据支撑。常见做法是分四部分需求分析、数据库设计、功能实现、测试与结论。需求分析写清楚系统要解决什么问题、有哪几类用户、核心业务流程是什么数据库设计放 E-R 图和表结构表格功能实现贴关键 SQL 和存储过程测试部分放执行结果截图和异常情况验证。表结构表格建议用下面这种格式字段、类型、约束、说明四列和建表脚本一一对应字段名数据类型约束说明ReaderIDINT主键自增读者编号CardNoVARCHAR(20)非空唯一借阅卡号ReaderNameNVARCHAR(30)非空读者姓名DeptNVARCHAR(50)可空所属院系RegDateDATE默认当前日期注册日期4.2 截图与代码的对应别让老师找到对不上的地方血泪经验报告里每一张截图都要能在代码里找到对应的语句。比如你截了一张「借书成功」的结果图报告里就要贴出sp_BorrowBook的调用语句和存储过程定义。截图里的数据要和脚本插入的数据一致别用一套数据截图、另一套数据写脚本。测试部分至少覆盖三类正常流程借书成功、还书成功、边界情况借已借出的书、不存在的读者、异常回滚故意让事务中途失败验证数据没被改。第三类最能体现水平做法是在存储过程里临时加一句RAISERROR执行后查BorrowRecords和Books确认两边都没变。4.3 报告里该写和不该写的东西该写的表结构设计理由为什么用这个主键、为什么加这个约束、事务隔离级别的选择、索引的建立依据、测试用例和预期结果。不该写的大段复制粘贴的 SQL 而不加解释、和代码无关的理论堆砌、没有出处的性能数字。索引部分可以补一句在BorrowRecords的ReaderID和BookID上建非聚集索引加速联表查询。建索引的语句是CREATE INDEX IX_Borrow_Reader ON BorrowRecords(ReaderID);报告里说明为什么这两列适合建索引经常作为连接条件比空谈索引原理更有说服力。5. 避坑与排查大作业里最容易翻车的五个地方5.1 现象脚本在别人机器上跑不通报「路径无效」原因建库脚本里写死了D:\SQLData\这种绝对路径别人机器上没有这个目录。解决要么在脚本开头用xp_create_subdir或手动建目录要么把路径改成相对默认路径或者干脆省略FILENAME让 SQL Server 用默认位置。报告里如果贴了带绝对路径的脚本记得加一句「路径需按实际环境修改」。5.2 现象中文插入后显示成问号原因字段类型用了VARCHAR而不是NVARCHAR或者插入时字符串前没加N。解决存中文的字段一律用NVARCHAR插入语句里中文字符串前加N比如N张三。这个坑在报告截图里一眼就能看出来老师看到问号会直接扣分。5.3 现象存储过程执行报「事务计数不匹配」原因BEGIN TRANSACTION和COMMIT/ROLLBACK数量对不上常见于CATCH块里忘了判断TRANCOUNT。解决在CATCH里统一写IF TRANCOUNT 0 ROLLBACK TRANSACTION;保证无论从哪一层抛出异常都能正确回滚。嵌套事务时尤其要注意内层COMMIT不会真正提交只有最外层才生效。5.4 现象两个窗口同时操作一个一直卡着不动原因前一个事务没提交也没回滚持有锁不放后一个事务在等锁。解决检查是不是在 SSMS 里手动开了事务忘了提交执行ROLLBACK或COMMIT释放。排查时可以用EXEC sp_who2看当前会话和阻塞情况或者查sys.dm_tran_locks看锁的持有者。大作业演示时别开着一堆没提交的事务窗口。5.5 现象报告里的数据和截图对不上答辩被追问原因脚本改过但报告没同步或者截图是旧版本跑的。解决定稿前重新从头执行一遍完整脚本用同一份数据重新截图报告里的表结构、字段名、示例数据全部以最终脚本为准。我一般会让学生把「建库脚本 测试数据脚本 存储过程脚本」合成一个文件从头跑一遍没问题再定稿。6. 进阶技巧用一份自检脚本在答辩前把作业验一遍到这一步代码和报告基本成型剩下的是交付前的自检。我习惯写一个自检脚本把关键验证点串起来答辩前跑一遍心里有底。下面这段脚本检查表是否存在、外键是否生效、事务是否能正确回滚。USE LibraryDB; GO -- 1. 检查四张表是否都存在 SELECT name FROM sys.tables WHERE name IN (Readers,Books,BorrowRecords,Fines); -- 2. 检查外键约束是否启用 SELECT name, is_disabled FROM sys.foreign_keys; -- 3. 验证事务回滚故意插入不存在的读者应报错且无数据写入 BEGIN TRY BEGIN TRANSACTION; INSERT INTO BorrowRecords (ReaderID, BookID, BorrowDate, DueDate) VALUES (9999, 1, GETDATE(), GETDATE()); COMMIT; END TRY BEGIN CATCH ROLLBACK; PRINT N外键约束生效事务已回滚; END CATCH; -- 4. 确认没有脏数据写入 SELECT COUNT(*) AS BadRows FROM BorrowRecords WHERE ReaderID 9999;这段脚本的逻辑第 1 步确认表建全了第 2 步确认外键没被禁用有人为了插数据方便会临时禁用外键忘了恢复第 3 步故意插一条引用不存在读者的记录外键会拦截并抛错CATCH里回滚第 4 步查一下BadRows应该是 0说明回滚干净。参数上没什么要调的直接跑就行。如果第 3 步没报错说明外键没生效回去检查建表语句。再补一个演示时的小技巧把常用操作封装成几个带参数的存储过程答辩时现场调用比现场手写 SQL 稳得多。比如还书过程sp_ReturnBook逻辑是更新ReturnDate、把图书状态改回 0、如果超期就插罚款记录同样用事务包起来。现场演示时按「借书 → 查询 → 还书 → 查罚款」的顺序走一遍整个业务闭环就讲清楚了。最后说个我自己的习惯定稿前把整个作业拷到一台没装过 SQL Server 的机器上从安装到跑通完整走一遍把每一步遇到的问题记下来写进报告的「实验环境与部署说明」。这一步最费时间但能挡掉答辩现场百分之八十的意外。希望帮到你。本文还有配套的精品资源点击获取