存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。

一般分为十种情况,每种语法各不相同:

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;

优点:
1.由于应用程序随着时间推移会不断更改,增删功能,T-SQL过程代码会变得更复杂,StoredProcedure为封装此代码提供了一个替换位置。

2.执行计划(存储过程在首次运行时将被编译,这将产生一个执行计划-- 实际上是 Microsoft SQL Server为在存储过程中获取由 T-SQL 指定的结果而必须采取的步骤的记录。)缓存改善性能。
…但sql server新版本,执行计划已针对所有 T-SQL 批处理进行了缓存,而不管它们是否在存储过程中,所以没比较优势了。

3.存储过程可以用于降低网络流量,存储过程代码直接存储于数据库中,所以不会产生大量T-sql语句的代码流量。

4.使用存储过程使您能够增强对执行计划的重复使用,由此可以通过使用远程过程调用 (RPC) 处理服务器上的存储过程而提高性能。RPC 封装参数和调用服务器端过程的方式使引擎能够轻松地找到匹配的执行计划,并只需插入更新的参数值。

5.可维护性高,更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。

6.代码精简一致,一个存储过程可以用于应用程序代码的不同位置。

7.更好的版本控制,通过使用 Microsoft Visual SourceSafe 或某个其他源代码控制工具,您可以轻松地恢复到或引用旧版本的存储过程。

8.增强安全性:
a、通过向用户授予对存储过程(而不是基于表)的访问权限,它们可以提供对特定数据的访问;
b、提高代码安全,防止 SQL注入(但未彻底解决,例如,将数据操作语言--DML,附加到输入参数);
c、SqlParameter 类指定存储过程参数的数据类型,作为深层次防御性策略的一部分,可以验证用户提供的值类型(但也不是万无一失,还是应该传递至数据库前得到附加验证)。

缺点:
1.如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐了。

2.可移植性差
由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。如果应用程序的可移植性在您的环境中非常重要,则将业务逻辑封装在不特定于 RDBMS 的中间层中可能是一个更佳的选择。

数据库存储过程语法总结相关推荐

  1. 数据库中存储过程语法

    数据库中存储过程语法 本文主要总结在数据库中存储过程的语法: 存储过程的创建 存储过程的删除 参数的使用 变量的声明 if条件语句语法 case when条件语句语法 循环语句语法 存储过程的创建 创 ...

  2. Mysql数据库存储过程基本语法讲解

    Mysql数据库存储过程基本语法讲解 一般情况下MYSQL以:结尾表示确认输入并执行语句,但在存储过程中:不是表示结束,因此可以用该命令将:号改为//表示确认输入并执行.存储过程如同一门程序设计语言, ...

  3. SAP AMDP数据库存储过程,AMDP语法实例

    目录 AMDP介绍 AMDP语法 DECLARE变量声明 CURSOR循环(FOR) 数组的使用 IF...ELSE 内表读取 方法嵌套调用 AMDP function,AMDP函数实现 AMDP p ...

  4. Oracle存储过程语法

    原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程  1 CREATE OR REPLACE PROCEDURE 存储过程名  ...

  5. mysql过程异常处理_mysql数据库存储过程异常处理

    14.1.4  定义条件和处理程序 定义条件和处理程序是事先定义程序执行过程中可能遇到的问题.并且可以在处理程序中定义解决这些问题的办法.这种方式可以提前预测可能出现的问题, 并提出解决办法.这样可以 ...

  6. mysql数据库存储过程及调用方法

    mysql数据库存储过程及调用方法 mysql5.0以后就支持存储过程了,目前mysql的6.0Alpha版也已经推出.6.0不仅支持大型数据库如oracle等的绝大部分功 能,如存储过程.视图.触发 ...

  7. mysql的存储过程正负数的变化_《转》mysql存储过程语法及范例

    <转>mysql存储过程语法及实例 存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法------- ...

  8. mysql存储过程语法 if_mysql存储过程语法 if

    MySql存储过程 MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程, ...

  9. 让你提前认识软件开发(28):数据库存储过程中的重要表信息的保存及相关建议...

    第2部分 数据库SQL语言 数据库存储过程中的重要表信息的保存及相关建议 1. 存储过程中的重要表信息的保存 在非常多存储过程中,会涉及到对表数据的更新.插入或删除等,为了防止改动之后的表数据出现故障 ...

最新文章

  1. js函数重写php,深入讲解js覆盖原有方法 提供重写方法
  2. Golang中WaitGroup、Context、goroutine定时器及超时学习笔记
  3. springcloud-zuul路由网关
  4. Reboot运维开发Python-03
  5. [渝粤教育] 西南科技大学 机电传动控制 在线考试复习资料
  6. 性能测试知多少----性能测试分类之我见
  7. linux-dd命令,dd命令_Linux dd 命令用法详解:复制文件并对原文件的内容进行转换和格式化处理...
  8. 2020计算机考试系统office,2020年3月计算机二级考试,大学生office考试教材,仿真考试系统...
  9. 基于小程序的网上商城系统的设计与实现毕业设计论文,网上购物商城小程序毕业论文
  10. 解决网站mp4视频不能边播放边下载的问题!(终极解决方案)
  11. 球球大作战服务器维护时间,2018球球大作战每日解除限制时间是几点 | 手游网游页游攻略大全...
  12. iphone苹果二手手机购买前必看
  13. Cadence OrCAD Capture 四种定位到图纸指定位置的方法说明
  14. Ubuntu卸载安装包
  15. Mybatis的_parameter使用
  16. html 颜色为无色,JS设置对象背景为无色或有色
  17. remix共享本地文件夹
  18. java date time_java8-date和timeAPI
  19. pancakeswap 前端源码编译及部署-linux
  20. 【图算法】社区发现算法——Fast unfolding

热门文章

  1. rasa、rasa-webchat 安装使用记录
  2. React 屏幕截图生成器 html2canvas
  3. SSM大学生公益义工主题管理-义工服务-志愿者报名审核javaweb网站j2ee项目
  4. 如何计算无人机机架对应螺旋桨大小和尺寸!
  5. 可以读取html文件,javascript能读取本地文件吗?
  6. 阿里云学生服务器认证条件详解与选择教程
  7. PDF的查找和替换在哪里?如何全部替换?
  8. SDUSTOJ 1191 - 剪子包袱锤游戏 ( 结构体 函数的巧妙应用 )
  9. 谈谈IT培训机构的骗局!
  10. cesium 水位模拟_SuperMap iClient3D for WebGL教程- 淹没分析