SQL Server 存储过程

Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。

Ø 存储过程的概念

    存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。

    存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。

    由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。

    1、 存储过程的优点

        A、 存储过程允许标准组件式编程

        存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。

        B、 存储过程能够实现较快的执行速度

        如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。

        C、 存储过程减轻网络流量

        对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。

        D、 存储过程可被作为一种安全机制来充分利用

        系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。

Ø 系统存储过程

    系统存储过程是系统创建的存储过程,目的在于能够方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程主要存储在master数据库中,以“sp”下划线开头的存储过程。尽管这些系统存储过程在master数据库中,但我们在其他数据库还是可以调用系统存储过程。有一些系统存储过程会在创建新的数据库的时候被自动创建在当前数据库中。

    常用系统存储过程有:

 1 exec sp_databases; --查看数据库2 exec sp_tables;        --查看表3 exec sp_columns student;--查看列4 exec sp_helpIndex student;--查看索引5 exec sp_helpConstraint student;--约束6 exec sp_stored_procedures;7 exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句8 exec sp_rename student, stuInfo;--修改表、索引、列的名称9 exec sp_renamedb myTempDB, myDB;--更改数据库名称
10 exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库
11 exec sp_helpdb;--数据库帮助,查询数据库信息
12 exec sp_helpdb master;

复制

    系统存储过程示例:

--表重命名
exec sp_rename 'stu', 'stud';
select * from stud;
--列重命名
exec sp_rename 'stud.name', 'sName', 'column';
exec sp_help 'stud';
--重命名索引
exec sp_rename N'student.idx_cid', N'idx_cidd', N'index';
exec sp_help 'student';--查询所有存储过程
select * from sys.objects where type = 'P';
select * from sys.objects where type_desc like '%pro%' and name like 'sp%';

复制

Ø 用户自定义存储过程

   1、 创建语法

create proc | procedure pro_name[{@参数数据类型} [=默认值] [output],{@参数数据类型} [=默认值] [output],....]
asSQL_statements

复制

   2、 创建不带参数存储过程

--创建存储过程
if (exists (select * from sys.objects where name = 'proc_get_student'))drop proc proc_get_student
go
create proc proc_get_student
asselect * from student;--调用、执行存储过程
exec proc_get_student;

复制

   3、 修改存储过程

--修改存储过程
alter proc proc_get_student
as
select * from student;

复制

   4、 带参存储过程

--带参存储过程
if (object_id('proc_find_stu', 'P') is not null)drop proc proc_find_stu
go
create proc proc_find_stu(@startId int, @endId int)
asselect * from student where id between @startId and @endId
goexec proc_find_stu 2, 4;

复制

   5、 带通配符参数存储过程

--带通配符参数存储过程
if (object_id('proc_findStudentByName', 'P') is not null)drop proc proc_findStudentByName
go
create proc proc_findStudentByName(@name varchar(20) = '%j%', @nextName varchar(20) = '%')
asselect * from student where name like @name and name like @nextName;
goexec proc_findStudentByName;
exec proc_findStudentByName '%o%', 't%';

复制

   6、 带输出参数存储过程

if (object_id('proc_getStudentRecord', 'P') is not null)drop proc proc_getStudentRecord
go
create proc proc_getStudentRecord(@id int, --默认输入参数@name varchar(20) out, --输出参数@age varchar(20) output--输入输出参数
)
asselect @name = name, @age = age  from student where id = @id and sex = @age;
go-- 
declare @id int,@name varchar(20),@temp varchar(20);
set @id = 7; 
set @temp = 1;
exec proc_getStudentRecord @id, @name out, @temp output;
select @name, @temp;
print @name + '#' + @temp;

复制

   7、 不缓存存储过程

--WITH RECOMPILE 不缓存
if (object_id('proc_temp', 'P') is not null)drop proc proc_temp
go
create proc proc_temp
with recompile
asselect * from student;
goexec proc_temp;

复制

   8、 加密存储过程

--加密WITH ENCRYPTION 
if (object_id('proc_temp_encryption', 'P') is not null)drop proc proc_temp_encryption
go
create proc proc_temp_encryption
with encryption
asselect * from student;
goexec proc_temp_encryption;
exec sp_helptext 'proc_temp';
exec sp_helptext 'proc_temp_encryption';

复制

   9、 带游标参数存储过程

if (object_id('proc_cursor', 'P') is not null)drop proc proc_cursor
go
create proc proc_cursor@cur cursor varying output
asset @cur = cursor forward_only static forselect id, name, age from student;open @cur;
go
--调用
declare @exec_cur cursor;
declare @id int,@name varchar(20),@age int;
exec proc_cursor @cur = @exec_cur output;--调用存储过程
fetch next from @exec_cur into @id, @name, @age;
while (@@fetch_status = 0)
beginfetch next from @exec_cur into @id, @name, @age;print 'id: ' + convert(varchar, @id) + ', name: ' + @name + ', age: ' + convert(char, @age);
end
close @exec_cur;
deallocate @exec_cur;--删除游标

复制

   10、 分页存储过程

---存储过程、row_number完成分页
if (object_id('pro_page', 'P') is not null)drop proc proc_cursor
go
create proc pro_page@startIndex int,@endIndex int
asselect count(*) from product
;    select * from (select row_number() over(order by pid) as rowId, * from product ) tempwhere temp.rowId between @startIndex and @endIndex
go
--drop proc pro_page
exec pro_page 1, 4
--
--分页存储过程
if (object_id('pro_page', 'P') is not null)drop proc pro_stu
go
create procedure pro_stu(@pageIndex int,@pageSize int
)
asdeclare @startRow int, @endRow intset @startRow = (@pageIndex - 1) * @pageSize +1set @endRow = @startRow + @pageSize -1select * from (select *, row_number() over (order by id asc) as number from student ) twhere t.number between @startRow and @endRow;exec pro_stu 2, 2;

复制

Ø Raiserror

Raiserror返回用户定义的错误信息,可以指定严重级别,设置系统变量记录所发生的错误。

   语法如下:

Raiserror({msg_id | msg_str | @local_variable}{, severity, state}[,argument[,…n]][with option[,…n]]
)

复制

   # msg_id:在sysmessages系统表中指定的用户定义错误信息

   # msg_str:用户定义的信息,信息最大长度在2047个字符。

   # severity:用户定义与该消息关联的严重级别。当使用msg_id引发使用sp_addmessage创建的用户定义消息时,raiserror上指定严重性将覆盖sp_addmessage中定义的严重性。

    任何用户可以指定0-18直接的严重级别。只有sysadmin固定服务器角色常用或具有alter trace权限的用户才能指定19-25直接的严重级别。19-25之间的安全级别需要使用with log选项。

   # state:介于1至127直接的任何整数。State默认值是1。

raiserror('is error', 16, 1);
select * from sys.messages;
--使用sysmessages中定义的消息
raiserror(33003, 16, 1);
raiserror(33006, 16, 1);

复制

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

本文分享自作者个人站点/博客:http://www.cnblogs.com/moyhui/前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速入门「组织结构图」?

组织结构图,对于公司老板和HR可谓是家常便饭,公司发展好,组织结构要升级和调整,人员“正常”流动,都需要用到它。组织结构图可以让人快速的了解公司的行政结构和权利体系,也是让新员工或客户快速了解公司相…

JAVA+Selenium最简单的处理登录弹窗的方式

在做自动化测试遇到需要处理登录弹窗情况,例如我的用户名为admin, 密码为admin, 那么想要登录http://10.10.168.1, 只需要使用以下链接访问即可立即登录, 并免除弹窗: http://账号:密码网址

python-函数用法-F.conv_transpose2d

F.conv_transpose2d torch.nn.functional.conv_transpose2d(input, weight, biasNone, stride1, padding0, output_padding0, groups1, dilation1) → Tensor对由多个输入平面组成的输入图像应用二维转置卷积算子, 有时也称为反卷积. >>> # With square kernels and…

C#设计模式之---外观模式

外观模式(Facade Pattern) 外观模式(Facade Pattern)提供了一个简单且公用的接口去处理复杂的子系统,并且没有减少子系统的功能。降低子系统的复杂性,避免了客户与子系统直接链接,它也减少了子…

composer的劈坑

现在是php8盛行的天下,安装php8我就不多说了,宝塔、小出面板一大堆,一键安装。真心说方便。(好吧,不打广告了),以下是针对 linux 系统 1、安装composer 安装composer之前,需要要先在…

Android 13 设置自动进入wifi adb模式

Android 13 设置自动进入wifi adb模式 文章目录 Android 13 设置自动进入wifi adb模式一、前言:二、解决Android 13 wifi adb每次重启自动重置问题方法1、分析系统中每次重置wifi adb属性的代码2、在开机广播里面进行设置wifi adb 相关属性(1&#xff09…

wpf控制垂直滚动条到最上方

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 使用场景上代码 使用场景 wpf项目中有个datagrid列表,当数据出现垂直滚动条时拉倒最下方,现在当数据刷新时需要自动返回到数据最上方。 提示…

Unity VR 开发教程 OpenXR+XR Interaction Toolkit(八)手指触控 Poke Interaction

文章目录 📕教程说明📕XR Poke Interactor📕与 UI 进行触控交互⭐添加 Tracked Device Graphic Raycaster 和 XR UI Input Module 让 UI 可被交互 📕与物体进行交互⭐XR Simple Interactable⭐XR Poke Filter 往期回顾&#xff1a…

Mysql四种常见备份表方式,历史表

1、将表备份到物理机 mysqldump -h 域名 -P 端口 -u用户 -p密码 库名 表名 > /路径/表名.{$date}.bak 2、将表备份在库里面(create复制表结构、insert复制表内容) create table one_bak like one; 复制表结构 insert into one_bak select * from …

简单工厂模式详解

文章目录 前言一、简单工厂模式定义二、举个例子三、简单工厂模式的缺点总结 前言 本篇我们了解一下简单工厂模式,它是设计模式的雏形,是学习设计模式的开端,我会结合案例说明它的设计思路。 一、简单工厂模式定义 简单工厂模式并不是GoF23…

看一眼Mysql查询语句

目录 🛻 查询数据 🛻基本查询语句 🛻单表查询 🚕查询所有字段 🚕查询指定字段 🚕查询指定记录 🚕带in关键字的查询 🚕带between and的范围查询 🚕带like的字符匹…

【Eigen】Eigen内存对齐超详细讲解

Eigen是一个非常常用的矩阵运算库,由于使用了SSE指令集进行向量化加速,因此它的矩阵运算能力还是很厉害的,在SLAM等领域是一个不可或缺的的工具。然而,有时候在vector容器或者class类中使用Eigen时,可能会出现一些奇奇…

10个在线ai文案自动生成器,轻松写出高质量原创文案

在数字营销时代,撰写引人注目的标题和吸引人的营销文案至关重要。然而,写作优质文案需要耗费时间和精力。幸运的是,现在有许多在线AI文案自动生成器可以帮助我们快速创作出高质量的标题和营销文案。本文将介绍十款值得推荐的在线AI文案自动生…

微信小程序事件点击跳转页面的五种方法

第一种:标签 这是最常见的一种跳转方式,相当于html里的a标签 <navigator url"/pages/main/main"></navigator>第二种:wx.navigateTo({})方法 1.前端wxml <button bindtap"getCeshi" type"primary"> 测试按钮 </button>…

flink水位线传播及任务事件时间

背景 本文来讲解一下flink的水位线传播及对其对任务事件时间的影响 水位线 首先flink是通过从源头生成水位线记录的方式来实现水位线传播的&#xff0c;也就是说水位线是嵌入在正常的记录流中的特殊记录&#xff0c;携带者水位线的时间戳&#xff0c;以下我们就通过图片的方…

springCloud通过两种方式配置热更新

该热更新实际就是通过改动nacos官网里面的配置管理的妹纸内容实现 定义一个config包&#xff0c;在该包下面复制该代码 package cn.itcast.user.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.spring…

【C++】多线程编程二(std::thread详解)

目录 std::thread详解 &#xff08;1&#xff09;启动线程 ①无参无返回的函数作为入参 ②函数对象&#xff08;仿函数&#xff09;作为入参 &#xff08;2&#xff09;不等待线程detch() &#xff08;3&#xff09;等待线程完成join() &#xff08;4&#xff09;向线程…

力扣142. 环形链表 II

题目 给定一个链表的头节点head&#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回null。 链接&#xff1a;142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 题解 方法一&#xff1a;设置两个指针&#xff0c;一个指针指向链表头结点&#…

云原生之深入解析Flink on k8s的运行模式与实战操作

一、概述 Flink 核心是一个流式的数据流执行引擎&#xff0c;并且能够基于同一个 Flink 运行时&#xff0c;提供支持流处理和批处理两种类型应用。其针对数据流的分布式计算提供了数据分布&#xff0c;数据通信及容错机制等功能。Flink 官网不同版本的文档flink on k8s 官方文…

辅助驾驶功能开发-功能对标篇(18)-NCA城市辅助系统-华为

1.横向对标参数 厂商华为车型极狐阿尔法S全新HI版上市时间2022/9/23方案13V5R3L+1DMS摄像头前视摄像头*4【双目+长焦+广角】侧视摄像头*4后视摄像头*1环视摄像头*4