首页 > 数据库 >C#高级:在SQLserver中使用视图和存储过程

C#高级:在SQLserver中使用视图和存储过程

时间:2024-08-10 13:59:22浏览次数:17  
标签:Name C# SQLserver UserID 视图 -- SQL SELECT

一、视图

1.视图是什么,有什么作用?

①一个虚拟表

②简化查询

2.视图和存储过程有什么区别?

①视图:用于简化查询和数据展示

②存储过程:用于执行一系列SQL语句,包含增删改查等,即业务逻辑得处理。

3.建立一个视图,名为PersonBorrowView,SQL已给出:

  SELECT U.Name,BW.BoTime,BI.BookName FROM UserInfo U
  INNER JOIN BorrowInfo BW ON U.UserID=BW.UserID
  INNER JOIN BookInfo BI ON BW.BookID=BI.BookID

【解答】建立视图的SQL语句:

CREATE VIEW PersonBorrowView AS
SELECT U.Name, BW.BoTime, BI.BookName
FROM UserInfo U
INNER JOIN BorrowInfo BW ON U.UserID = BW.UserID
INNER JOIN BookInfo BI ON BW.BookID = BI.BookID;

4.如果往BorrowInfo加一条记录,我原本的SQL会增加一条记录,那么查询视图,数据会增加吗?

会,因为查询视图,本质是查询视图保存的SQL

5.写出查询视图的SQL。

SELECT * FROM PersonBorrowView;

6.写出根据视图名获取视图的SQL

SELECT OBJECT_DEFINITION(OBJECT_ID('PersonBorrowView')) AS VIEWSQL;

7.小结:

-- 建立视图:
CREATE VIEW 视图名 AS
SQL-- 写你的查询SQL

-- 查询视图:
SELECT * FROM 视图名

-- 根据视图名查询视图保存的SQL:
SELECT OBJECT_DEFINITION(OBJECT_ID('视图名')) AS VIEWSQL

二、存储过程

1.创建一个存储过程(一键归还非管理员用户2024年借的书),要求做以下几件事情:

-- 筛选出需要一键归还的用户
SELECT UserID,Name FROM UserInfo WHERE Power !=1

-- 筛选出2024年未归还的书
SELECT BorID,UserID,BookID FROM BorrowInfo Where Year(BoTime)='2024' and BackTime is null and UserID in (xxxxx)

-- 将这些书的归还状态更新为今天
Update BorrowInfo set BackTime = GETDATE() Where  BorID in (xxxxx)

-- 将一键归还涉及到的用户、书名、还款日期插入到PC_Table中
INSERT INTO PC_TABLE  ([PCName],[PCBoTime],[PCBookName]) VALUES(xxxx)

【解答:存储过程的创建SQL】

  定义存储过程的名称:ReturnBooksForNonAdmin2024

  另外定义一些临时表去推进存储过程的流程

CREATE PROCEDURE ReturnBooksForNonAdmin2024
AS
BEGIN
    -- 1. 筛选出需要一键归还的用户
    DECLARE @NonAdminUsers TABLE (UserID NVARCHAR(100), Name NVARCHAR(100));
    INSERT INTO @NonAdminUsers (UserID, Name)
    SELECT UserID, Name
    FROM UserInfo
    WHERE Power != 1;

    -- 2. 筛选出2024年未归还的书
    DECLARE @BooksToReturn TABLE (BorID NVARCHAR(100), UserID NVARCHAR(100),BookID NVARCHAR(100));
    INSERT INTO @BooksToReturn (BorID, UserID,BookID)
    SELECT BorID, UserID,BookID
    FROM BorrowInfo
    WHERE YEAR(BoTime) = 2024
    AND BackTime IS NULL
    AND UserID IN (SELECT UserID FROM @NonAdminUsers);

    -- 3. 将这些书的归还状态更新为今天
    UPDATE BorrowInfo
    SET BackTime = GETDATE()
    WHERE BorID IN (SELECT BorID FROM @BooksToReturn);

    -- 4. 将一键归还涉及到的用户、书名、还款日期插入到PC_TABLE中
    INSERT INTO PC_TABLE ([PCName], [PCBoTime], [PCBookName])
    SELECT u.Name AS [PCName], GETDATE() AS [PCBoTime], bi.BookName AS [PCBookName]
    FROM @BooksToReturn b
    JOIN UserInfo u ON b.UserID = u.UserID
    JOIN BookInfo bi ON b.BookID= bi.BookID;

END;

2.写出执行存储过程的SQL/方法

EXECUTE ReturnBooksForNonAdmin2024;


3.假设一个存储过程分为4步,第2步发现报错,那么它会执行1、2步,还是都不执行呢?

取决于SQL的事务

  • 如果步骤1和步骤2在同一个事务中执行,并且第2步失败,步骤1也不会生效。
  • 如果每一步都在独立的事务中,那么步骤1和步骤2会分别执行,失败的步骤不会影响之前成功的步骤。

(本例的存储过程没有指定事务,因此会被当做是独立的事务,因此会执行第1、2步,而不执行后续的SQL)

4.谈谈临时表和公共表达式的区别

-- 临时表
DECLARE @NonAdminUsers TABLE (UserID NVARCHAR(100), Name NVARCHAR(100));
INSERT INTO @NonAdminUsers (UserID, Name)
SELECT UserID, Name
FROM UserInfo
WHERE Power != 1;
SELECT * FROM @NonAdminUsers

-- 公共表达式CTE
WITH NonAdminUsers AS
(
    SELECT UserID, Name
    FROM UserInfo
    WHERE Power != 1
)
SELECT * FROM NonAdminUsers

【区别和特点】

  1. 作用域: 临时表通常用于存储过程或复杂逻辑,公共表达式(CTE)更适合单次查询,特别是递归查询。
  2. 复杂性: 临时表处理复杂的增删改查操作时更具优势。
  3. 用途: 公共表达式适合在查询中引用和计算临时数据。

标签:Name,C#,SQLserver,UserID,视图,--,SQL,SELECT
From: https://blog.csdn.net/m0_67412019/article/details/141089065

相关文章

  • 基于 Clouflare+D1 的web访客统计服务
    项目地址https://github.com/yestool/analytics_with_cloudflare部署步骤安装依赖npminstall-gwranglernpminstallhono创建D1数据库:web_analytics数据库名称为web_analytics,与package.json内保持一致npxwranglerd1createweb_analytics运行后控制台......
  • C#多线程并发编程深度探索:解锁async、await、Task与lock等关键字的奥秘
    一、多线程介绍1.什么是多线程多线程是指在一个应用程序中同时执行多个线程的能力。每个线程都是独立运行的,拥有自己的执行路径和资源。多线程编程能够充分利用多核处理器的计算能力,提高应用程序的性能和响应性,特别是在处理耗时任务和并行计算时效果显著。在C#中,线程是程序......
  • Docker搭建多版本PHP环境
    最近由于项目需要,需要同时启动多个项目,但是一个项目是php5.6,一个项目是php7.4,还有一个是php8.0,但是我需要同时运行,所以需要搭建一个多版本的开发环境,基于此自己实现了一个dnmpDNMP是基于docker部署的Nginx、PHP、MySQL开发环境支持php5.6、php7.0、php7.1、php7.2、php7......
  • BugKu CTF Misc:眼见非实 & 啊哒 & ping & Snowfall
    前言BugKu是一个由乌云知识库(wooyun.org)推出的在线漏洞靶场。乌云知识库是一个致力于收集、整理和分享互联网安全漏洞信息的社区平台。BugKu旨在提供一个实践和学习网络安全的平台,供安全爱好者和渗透测试人员进行挑战和练习。它包含了各种不同类型的漏洞场景,如Web漏洞、系统......
  • 【全网独家】libVLC 更改视频宽高比(代码+测试部署)
    libVLC更改视频宽高比介绍libVLC是VLC媒体播放器的核心库,提供了强大的多媒体处理功能。更改视频宽高比(AspectRatio)是指调整视频帧的宽度和高度比例,以适应不同的显示设备或满足特定的播放需求。应用使用场景视频播放器:用户可能需要调整视频的宽高比以适应窗口或全屏......
  • 面向对象编程(OOP: Object Oriented Programming ):类、对象、构造方法、封装
    目录一、类1、定义(1)属性(2)方法2、类的定义方法二、对象1、定义2、对象的定义方法三、类和对象的关系1、现实世界都是由很多对象组成的,基于对象的共同特征抽象出类。2、对象:真实存在的对象3、类是对象的模板,对象是类的具体实例。4、一个类可以创建多个对象,同一个......
  • 【数据结构与算法】输出二叉树中从每个叶子结点到根结点的路径 C++实现(二叉树+栈+深度
    二叉树叶子节点到根节点的路径题目描述给定一棵二叉树的后序遍历序列post[s1..t1]和中序遍历序列in[s2..t2],设计一个算法,输出二叉树中从每个叶子节点到根节点的路径。请使用栈的数据结构解决。输入格式输入包括两行:第一行为后序遍历序列post[s1..t1]。第二行为中序......
  • JDBC数据库连接技术基础及核心API
    目录JDBC的概念JDBC的搭建步骤JDBC的代码实现步骤框架代码实现核心API注册驱动(jdk6.0后可自动注册,无需编写代码)Connection(连接数据库)Statement(用于执行SQL语句,会被SQL注入攻击,后被PreparedStatement替代)PreparedStatement(可以防止SQL注入,全面替代Statement)ResultS......
  • nowcoder Week Contest
    52小红有\(n\)个数字\(a_1,a_2,\dots,a_n\)和一个空字符串\(s\)。现在她需要执行\(n\)次操作:第\(i\)次操作需要将\(a_i\)按照数位上的相对顺序、从左到右的取出并依次插入\(s\)(在\(s\)中不需要连续,但需要保持原有相对顺序)。小红想要构造一个这样的字符串\(s\)......
  • CF844D Boxes And Balls
    题意有\(n\)个箱子、\(n\)种颜色的球,第\(i\)种颜色的球有\(w_i\)个,最开始时都在第\(1\)个箱子中。每次可以从有球的一个箱子中拿出所有球,并随意分割为2部分或3部分,并放入箱子,需要的代价为球的总数。问将每种颜色的球都放在对应的一个箱子中需要的代价最少是多少。......