SQL Server 存储过程——SQL Server 储存过程的创建与使用

任务描述

本关任务:学习 SQL Server 中存储过程的创建和使用。

相关知识

存储过程提供了很多 T-SQL 语言没有的高级特性,其传递参数和执行逻辑的能力,为处理各种复杂任务提供了支持。并且,由于存储过程是经过编译后,存储在服务器上的,这减少了执行过程中的传输带宽和执行时间。相反,如果使用 T-SQL ,则每次需要经过传输,再编译和执行。

什么是存储过程

存储过程是 SQL Server 中一个非常重要的数据库对象,它实际是一组为了完成特定功能的 T-SQL 语句集合。存储过程经编译后,存储在数据库中,用户通过指定存储过程的名称,并给出相应的参数,就可以对其进行执行。

SQL Server 中的存储过程具有如下特点:

  • 能够包含执行各种数据库操作的语句,并且可以调用其他的存储过程;
  • 能够接收输入参数,并以输出参数的形式,将多个数据值返回给调用程序或批处理;
  • 向调用程序或批处理,返回一个表明成功或失败(及失败原因)的状态;
  • 存储过程经过编译后,存储在数据库中,用户通过使用存储过程的名字,并指定参数来执行它。

存储过程不同于函数,存储过程不返回取代其名称的值,也不能直接在表达式中使用。

存储过程的类型

SQL Server 包含多种可用的存储过程,主要包括用户定义存储过程、扩展存储过程和系统存储过程。 ######用户定义存储过程 存储过程是指封装了可重用代码的模块或者例程。存储过程可以接收输入参数、向客户端返回表格或者标量结果和消息、调用数据定义语言( DDL )和数据操作语言( DML ),然后返回输入参数。 在 SQL Server 中,用户定义的存储过程有两种类型,即 T-SQL 和 CLR 。

  • T-SQL 存储过程是指保存的 T-SQL 语句集合,可以接收和返回用户提供的参数。存储过程也可能从数据库向客户端应用程序返回数据。
  • CLR 存储过程是指针对 .NET Framework 公共语言运行时方法的引用,可以接收和返回用户提供的参数。它们在 .NET Framework 程序集中,是作为类的公共静态方法来实现的。

扩展存储过程

扩展存储过程以在 SQL Server 环境外执行的动态链接库( DLL )来实现。扩展存储过程通过前缀 xp_ 来标识,它们以与系统存储过程相似的方式来执行。

系统存储过程

系统存储过程主要存储在 master 数据库中,并以 sp_ 为前缀,并且系统存储过程主要是从系统表中获取信息,从而为系统管理员 SQL Server 提供支持。通过系统存储过程, SQL Server 中的许多管理性或者信息性的活动,都可以被顺利有效地完成。

创建存储过程

在 SQL Server 中,使用 CREATE PROCEDURE 语句创建存储过程,具体的语法格式如下所示。

CREATE { PROC | PROCEDURE } procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY]
[ WITH {RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
[ FOR REPLICATION ]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }

简单介绍个参数的含义。

  • procedure_name 用于指定存储过程的名称;
  • number 用于指定对同名的过程分组;
  • @parameter 用于指定存储过程中的参数;
  • data_type 用于指定参数的数据类型;
  • VARYING 用于指定作为输出参数支持的结果集,仅适用于游标参数;
  • default 用于指定参数的默认值;
  • OUTPUT 用于指定参数是输出参数;
  • RECOMPILE 用于指定数据库引擎不缓存该过程的计划,该过程在运行时编译;
  • ENCRYPTION 用于指定 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文本的条目;
  • FOR REPLICATION 用于指定不能在订阅服务器上执行为复制创建的存储过程;
  • sql_statement 要包含在过程中的一个或多个 T-SQL 语句。

在命名自定义存储过程时,尽量不要使用 sp_ 作为名称前缀,避免与系统存储过程冲突。如果指定的名称与系统存储过程相同,由于系统存储过程优先级高,那么自定义的存储过程永远也不会执行。 ######创建简单存储过程 从 studentdb 数据库中获取学生学号、姓名和性别的存储过程。语句如下所示:

CREATE PROCEDURE proc_getInfos
AS
BEGIN
SELECT sno '学号', sname '姓名', sex '性别' from student
END

创建带计算函数的存储过程

统计 studentdb 数据库中,男同学个数的存储过程。语句如下:

CREATE PROCEDURE proc_count_male
AS
BEGIN
SELECT COUNT(*) AS '男同学' frome student where sex='男'
END

创建带输入参数的存储过程

根据用户输入的姓名,得到相应的信息的存储过程。语句如下:

CREATE PROCEDURE proc_select_where
@name varchar(50)
AS
BEGIN
SELECT * from student where sname=@name
END

创建带输出参数的存储过程

创建一个存储过程,根据用户输入的年龄,返回大于输入年龄的学生有多少。语句如下:

CREATE PROCEDURE proc_select_ret
@age int,
@age_count int output
AS
BEGIN
SELECT @age_count=COUNT(*) from student where age>@age
END

执行存储过程

在 SQL Server 中,可以使用 EXEC 或 EXECUTE 语句执行存储过程。 ######执行不带参数的存储过程

EXEC proc_getInfos

执行带参数的存储过程

EXEC proc_select_where '张三'

执行带输入输出参数的存储过程

DECLARE @age_ int=19;
DECLARE @count int;
EXEC proc_select_ret @age_, @count output
select '该班一共有'+LTRIM(STR(@count))+'人年龄大于'+LTRIM(STR(@age_));

编程要求

我们已经为你建好了数据库与数据表,并添加了相应的数据内容。 你只需:

  • 补全右侧代码片段中 create proc_student_info 下的 Begin-End 区域间的代码,实现从表中查询所有学生基本信息的存储过程(存储过程名称一定要为 proc_student_info ,测试代码将调用 proc_student_info 存储过程,下面类似);
  • 补全右侧代码片段中 create proc_sno 下的 Begin-End 区域间的代码,创建一个带参数的存储过程,输出指定学号的学生信息;
  • 补全右侧代码片段中 create proc_add 下的 Begin-End 区域间的代码,创建一个带参数的存储过程,根据指定参数增加学生信息,如果学生编号已经存在则不能增加(调用此存储过程时,会依次填充各个字段值,请注意 insert 时,参数顺序与表字段的顺序一致);
  • 补全右侧代码片段中 create student_del 下的 Begin-End 区域间的代码,创建一个带参数的存储过程,删除指定学号的学生信息。若成功,则输出 successfully deleted ;若没有该学号,则输出 No such student 。

表 student 的字段类型除了 birthday 是 date 类型,其余均为 varchar 类型,表内容如下:

测试说明

本关涉及到的测试文件是 step1.sh ,平台将运行用户补全的 step1.sql 文件,得到数据,然后执行以下操作:

  • 将得到的数据与答案比较,判断程序是否正确;

  • 如果操作正确,你将得到如下的结果:

 实验代码

USE studentdb
go

SET NOCOUNT ON 
go
--********** create proc_student_info **********--
--********** Begin **********--
create proc proc_student_info
as
Begin
select* from student 
End



--********** End **********--
go
exec proc_student_info
go

--********** create proc_sno **********--
--********** Begin **********--
create proc proc_sno
@sno varchar(50)
as
Begin
    select * from student where sno = @sno 
End



--********** End **********--
go
exec proc_sno '1001'
go

--********** create proc_add **********--
--********** Begin **********--
create proc proc_add
@sno varchar(50),
@sname varchar(50),
@sex varchar(10),
@date date,
@dis varchar(50),
@school varchar(50)
as
Begin
    if EXISTS(SELECT * FROM student WHERE sno=@sno)
        print 'Already have a primary key '+@sno
    else
        insert into student values(@sno,@sname,@sex,@date,@dis,@school)
End





--********** End **********--
go
exec proc_add '1004','HMM','female','2019-6-2','English','national school'
go
exec proc_student_info
go

--********** create student_del **********--
--********** Begin **********--
create proc student_del
@sno varchar(50)
as
Begin
    if EXISTS(select * from student where sno=@sno)
    Begin
        delete from student where sno = @sno
        print'successfully deleted'
    End

    else 
        print'No such student'
End




--********** End **********--
go
exec student_del '1001'
go
exec proc_student_info
go

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/491442.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云手机:实现便携与安全的双赢

随着5G时代的到来,云手机在各大游戏、直播和新媒体营销中扮演越来越重要的角色。它不仅节约了成本,提高了效率,而且在边缘计算和云技术逐渐成熟的背景下,展现出了更大的发展机遇。 云手机的便携性如何? 云手机的便携性…

奇偶校验|ECC内存|海明码

前言 大家好,我是jiantaoyab,本篇文章给大家介绍数据出错和有什么方法能减少出错。 单比特翻转 由于硬件故障或其他原因,内存或其他存储设备中的单个比特位发生随机变化的现象。 例如,原本存储为1的位可能变为0,或…

Git入门(Git快速下载,安装,配置,远程仓库,本地仓库,IDEA提交代码,VScode提交代码使用方案一体)

Git快速下载 通过阿里镜像可以自由挑选版本并快速下载CNPM Binaries Mirrorhttp://npm.taobao.org/mirrors/git-for-windows/ 这里安装最新版本 下载安装文件 安装完后双击文件即可开始安装git 安装 git的安装傻瓜式Next即可 配置 打开git:桌面空白处右击&#…

雷卯推荐多种系列汽车级TVS供您选择

1. 车规级TVS的应用 2.车规级TVS系列表格如下 3.方案推荐 12V汽车电源浪涌保护方案 方案优点:用于满足前装汽车的ISO7637-2 5A5BA测试,可采用单独大功率的TVS或PTCTVS的组合方案,满足ISO10605-2, 等级4,接触放电15K…

Python包管理工具 pip 及其常用命令和参数用法

目录 PIP 主要功能 安装包 升级包 卸载包 列出包 检查依赖 pip的配置和环境 主要用法 1:版本 2:安装 Python 库 3:升级库 4:卸载库 5:搜索库 6:查看已安装库详细信息 7:只下载库…

[CISCN2019 华东北赛区]Web2

[CISCN2019 华东北赛区]Web2 随便注册一个登录,发现 还有反馈页面,一看就知道大概率是xss,应该是为了得到管理员cookie扫描了一下,果然有admin.php后台登录 buu可以连接访问外网了,所以内部的xss平台关闭了&#xff0…

2014年认证杯SPSSPRO杯数学建模A题(第一阶段)轮胎的花纹全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 A题 轮胎的花纹 原题再现: 轮胎被广泛使用在多种陆地交通工具上。根据性能的需要,轮胎表面常会加工出不同形状的花纹。在设计轮胎时,往往要针对其使用环境,设计出相应的花纹形状。   第一阶段问…

前端日期组件layui使用,月模式

初学前端,实战总结 概要 有一个日期组件,我的谷歌浏览器选完日期后,偶尔获取不到最新数据,有一个客户,是经常出不来数据。 日期组件是Wdate:调用的方法是WdatePicker onpicking,代码片段如下…

Apple Vision Pro应用合集

这里给大家分享一个网站,手机了最新的apple vision pro 上面运行的应用。 1、查找应用:用户可以浏览特色推荐的应用,或者通过随机挑选功能发现新的应用。 2、社区交流:提供社区功能,用户可以在这里交流使用体验、分享…

燃气官网安全运行监测系统-阀井燃气监测仪-旭华智能

近年来,燃气爆炸事故频发,造成了重大人员伤亡和财产损失。这也再次为我们敲响警钟,燃气是我们日常生活中不可或缺的能源,但其潜在的危险性也是不容小觑。因此在重要节点加装燃气阀井气体监测仪,并将数据上传到系统平台…

【网安小白成长之路】1.PHP基本语法

🐮博主syst1m 带你 acquire knowledge! ✨博客首页——syst1m的博客💘 🔞 《网安小白成长之路(我要变成大佬😎!!)》真实小白学习历程,手把手带你一起从入门到入狱🚭 &…

Spring Cloud 九:服务间通信与消息队列

Spring Cloud 一:Spring Cloud 简介 Spring Cloud 二:核心组件解析 Spring Cloud 三:API网关深入探索与实战应用 Spring Cloud 四:微服务治理与安全 Spring Cloud 五:Spring Cloud与持续集成/持续部署(CI/C…

Git学习(一)基于本地操作:Git初识、Git安装(Linux-ubuntu)、Git 基本操作、分支管理

目录 Git 初识 Git 安装(Linux-ubuntu) Git 基本操作 创建 Git 本地仓库 配置 Git 认识工作区、暂存区、版本库 添加文件 查看 .git 文件 修改文件 版本回退 撤销修改 情况一:对于工作区的代码,还没有 add 情况二&am…

docker拉取镜像

docker 拉取镜像 命令格式 docker pull 仓库名称[:标签] 从下载过程可以看出: (1)镜像文件是由若干层组成,即:AUFS联合文件系统。这是实现增量保存与更新的基础 (2)下载过程会输出各层镜像的信…

博客系统——1、数据库表设计 - 用户信息表

任务描述 本关任务:创建博客系统数据库的用户信息表。 相关知识 数据库整体设计 一个博客系统会有哪些功能呢,肯定会有的是博客列表,博客详情,评论,登陆注册等等这些功能,那应该建多少张表呢&#xff1…

《机器学习:引领数字化时代的技术革命》

随着科技的不断发展,机器学习作为人工智能的重要支柱之一,正迅速崛起并引领着数字化时代的技术革命。本文将从机器学习的技术进展、技术原理、行业应用案例、面临的挑战与机遇以及未来趋势预测和学习路线等方面展开探讨,为您揭示机器学习的神…

PC电脑技巧[笔记本通过网线访问设备CMW500]

笔记本局域网访问设备 现在我有一台CMW500,我要用笔记本去访问它,但是我发现没有路由器就是不能够访问,通过网线连接设备就是ping不通: 这里设置TCP/IPv4的IP地址如下,这时候就可以pin通了:

VOC(客户之声)赋能智能家居:打造个性化、交互式的未来生活体验

随着科技的飞速发展,智能家居已成为现代家庭不可或缺的一部分。然而,如何让智能家居更好地满足用户需求,提供更贴心、更智能的服务,一直是行业关注的焦点。在这个背景下,VOC(客户之声)作为一种用…

分类预测 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆网络多头注意力机制多特征分类预测

分类预测 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆网络多头注意力机制多特征分类预测 目录 分类预测 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆网络多头注意力机制多特征分类预测分类效果基本介绍模型描述程序设计参考资料 分类效果…

JVM之堆

堆的核心概述 一个JVM实例只存在一个堆内存,堆也是内存管理的核心区域。 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。 堆内存的大小是可以调节的。 《JVM虚拟机规范》规定,堆可以处于物理上不连…