1. 存储过程的类型:

(1) 用户自定义存储过程

自定义存储过程即用户使用T_SQL语句编写的、为了实现某一特定业务需求,在用户数据库中编写的T_SQL语句集合,自定义存储过程可以接受输入参数、向客户端返回结果和信息,返回输出参数等。创建自定义存储过程时,存储过程名前加上"##"表示创建了一个全局的临时存储过程;存储过程前面加上"#"时,表示创建的局部临时存储过程。局部临时存储过程只能在创建它的回话中使用,会话结束时,将被删除。这两种存储过程都存储在tempdb数据库中。

用户定义的存储过程分为两类:T_SQL 和CLR

T_SQL:存储过程是值保存的T_SQL语句集合,可以接受和返回用户提供的参数,存储过程也可能从数据库向客户端应用程序返回数据。

CLR存储过程是指引用Microsoft.NET Framework公共语言的方法存储过程,可以接受和返回用户提供的参数,它们在.NET Framework程序集是作为类的公共静态方法实现的。

(2) 扩展存储过程

扩展存储过程是以在SQL SERVER环境外执行的动态连接(DLL文件)来实现的,可以加载到SQL SERVER实例运行的地址空间中执行,扩展存储过程可以用SQL SERVER扩展存储过程API编程,扩展存储过程以前缀"xp_"来标识,对于用户来说,扩展存储过程和普通话存储过程一样,可以用相同的方法来执行。

(3) 系统存储过程

系统存储过程是 SQL Server系统自身提供的存储过程,可以作为命令执行各种操作。

系统存储过程主要用来从系统表中获取信息,使用系统存储过程完成数据库服务器的管理工作,为系统管理员提供帮助,为用户查看数据库对象提供方便,系统存储过程位于数据库服务器中,并且以sp_开头,系统存储过程定义在系统定义和用户定义的数据库中,在调用时不必在存储过程前加数据库限定名。例如:sp_rename系统存储过程可以修改当前数据库中用户创建对象的名称,sp_helptext存储过程可以显示规则,默认值或视图的文本信息,SQL SERVER服务器中许多的管理工作都是通过执行系统存储过程来完成的,许多系统信息也可以通过执行系统存储过程来获得。

系统存储过程创建并存放在与系统数据库master中,一些系统存储过程只能由系统管理员使用,而有些系统存储过程通过授权可以被其它用户所使用。

2.Sql存储过程

(1)创建存储过程

使用 create Procedure语句来创建存储过程,存储过程名称在该语句之后,as关键字标示存储过程主体的开始,存储过程有多个sql语句组成,例如下面的语句创建一个名为usp_getAllEmployees的存储过程,用于从employeeDepartment表中检索数据

Create Procedure usp_getAllEmployees

As

Select LastName,FirstName,JobTitle,Department

From employeeDepartment

要执行一个存储过程,可以使用execute语句:

Execute usp_getAllEmployees

存储过程的参数

存储过成人能够通过参数与调用程序通讯。参数定义应当出现在存储过程名称的后面,as的前面,当程序执行存储过程时,可通过存储过程的参数向该存储过程传递值,也可以output参数将值返回至调用程序

1、指定参数的名称和数据类型

参数名称应当以@开始,以后的字符可以是遵守对象标识符的任意字符,并以@@开头,因为这是用于内置函数的标识符号,例如下面创建的usp_GetProduct存储过程包含@standardCost和@listPrice两个参数,参数的数据类型均是money

Create produce usp_GetProduct

@standardCost money,@listPrice money

As

Select name, standardCost, listPrice from product

Where standardCost>@ standardCost and listPrice> @listPrice

执行存储过程时,既可以通过显式的方式指定参数名称并分配适当的值,也可以直接分配参数值,如果使用了显式方式,则按任意顺序提供参数,如果未指定参数名称,则必须按参数在存储过程定义的时候的顺序来提供。

Excute usp_GetProduct @ listPrice=100,@standardCost=10

Excute usp_GetProduct 10 ,100

2、为参数指定默认值

在参数定义中可以为可选参数指定一个,默认值,执行该存储过程时,如果未指定其他值,则使用默认值

Create produce usp_GetProduct

@standardCost money=0,@listPrice money

As

Select name, standardCost, listPrice from product

Where standardCost>@ standardCost and listPrice> @listPrice

执行该存储过程,可以只为@listPrice指定参数

Excute usp_GetProduct @ listPrice=100

由于具有默认参数通常是可选参数,所以建议将他们放置在参数列表的末尾以便于调用。

对于字符参数,在参数传递时可以指定通配符

3、指定输出参数

默认情况下,所有的参数均为输出参数,要指定输出参数,必须在参数定义中使用output关键字。当存储过程退出时,它将向调用程序返回输出参数的当前值。,例如,下面创建的存储过程定义了一个输出参数@productCount,用于返回ListPrice大于指定产品的数量

Create produce usp_GetProduct

@productCount int output,

@listPrice money

As

set @productCount= (select count(id) from product

Where listPrice> @listPrice)

2. 修改存储过程

如果需要修改存储过程中的语句或者参数,可以删除并重新创建该存储过程,也可以使用alter producedure语句更改该存储过程。删除并重新建时,与该存储过程关联的所有权限将丢失,更改时,将更改过程或者参数定义,但为该存储过程定义的权限将保留,将不会影响任何相关的存储过程或触发器

Alrter produce usp_GetProduct

@standardCost money=0,@listPrice money

As

Select name, standardCost, listPrice from product

Where standardCost>@ standardCost and listPrice> @listPrice

3. 存储过程的重新编译

1、指定在下次执行时重新编译

可以使用sp_recompile系统存储过程指定在下次执行存储过程或触发器进行重新编译

2、从sql server 2005开始,引入了对存储过程执行语句级重新编译的功能,也就是说在重新编译存储过程时,值编译导致重新编译的语句,而不编译整个存储过程。

要使用此功能,应当在语句中包含recomple查询提示,recomeple指示数据库引擎在执行查询后,丢弃为其生成的查询计划,从而在下次执行时强制编译查询计划,如果未指定recompile。数据库将缓存查询计划并从新使用它们

3、每次执行时重新编译村重过程

在创建存储过程时指定with recompile选项,强制在执行存储过程时对其进行重新编译,指定该选项时,数据库引擎将部位该存储过程缓存执行计划,而是在每次执行时都重新编译

4.创建带游标参数的存储过程

if (object_id('book_cursor', 'P') is not null)

drop proc book_cursor

go

create proc book_cursor

@bookCursor cursor varying output

as

set @bookCursor=cursor forward_only static for

select book_id,book_name,book_auth from books

open @bookCursor;

go

--调用book_cursor存储过程

declare @cur cursor,

@bookID int,

@bookName varchar(20),

@bookAuth varchar(20);

exec book_cursor @bookCursor=@cur output;

fetch next from @cur into @bookID,@bookName,@bookAuth;

while(@@FETCH_STATUS=0)

begin

fetch next from @cur into @bookID,@bookName,@bookAuth;

print 'bookID:'+convert(varchar,@bookID)+' , bookName: '+ @bookName

+' ,bookAuth: '+@bookAuth;

end

close @cur --关闭游标

DEALLOCATE @cur; --释放游标

5.创建分页存储过程

if (object_id('book_page', 'P') is not null)

drop proc book_page

go

create proc book_page(

@TableName varchar(50), --表名

@ReFieldsStr varchar(200) = '*', --字段名(全部字段为*)

@OrderString varchar(200), --排序字段(必须!支持多字段不用加order by)

@WhereString varchar(500) =N'', --条件语句(不用加where)

@PageSize int, --每页多少条记录

@PageIndex int = 1 , --指定当前为第几页

@TotalRecord int output --返回总记录数

)

as

begin

--处理开始点和结束点

Declare @StartRecord int;

Declare @EndRecord int;

Declare @TotalCountSql nvarchar(500);

Declare @SqlString nvarchar(2000);

set @StartRecord = (@PageIndex-1)*@PageSize + 1

set @EndRecord = @StartRecord + @PageSize - 1

SET @TotalCountSql= N'select @TotalRecord = count(*) from ' + @TableName;--总记录数语句

SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName;--查询语句

--

IF (@WhereString! = '' or @WhereString!=null)

BEGIN

SET @TotalCountSql=@TotalCountSql + ' where '+ @WhereString;

SET @SqlString =@SqlString+ ' where '+ @WhereString;

END

--第一次执行得到

--IF(@TotalRecord is null)

-- BEGIN

EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord output;--返回总记录数

-- END

----执行主语句

set @SqlString ='select * from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' + ltrim(str(@EndRecord));

Exec(@SqlString)

END

--调用分页存储过程book_page

exec book_page 'books','*','book_id','',3,1,0;

--

declare @totalCount int

exec book_page 'books','*','book_id','',3,1,@totalCount output;

select @totalCount as totalCount;--总记录数。

pb 执行存储过程带参数_数据库存储过程相关推荐

  1. mysql怎么写数据存储过程_数据库存储过程要怎么写

    SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数) ...

  2. Python 执行SQL带参数

    Python 执行SQL带参数 转载于:https://www.cnblogs.com/xibuhaohao/p/10451456.html

  3. pb 执行存储过程带参数_SQL高级知识——存储过程

    存储过程的定义 存储过程其实就是已预编译为可执行过程的一个或多个SQL语句. 通过调用和传递参数即可完成该存储过程的功能. 创建存储过程语法 CREATE PROC | PROCEDURE proce ...

  4. mysql带参数的sql_MySql存储过程是带参数的存储过程(动态执行SQL语句)

    下文介绍的MySql存储过程是带参数的存储过程(动态执行SQL语句),该MySql存储过程是根据用户输入的条件和排序方式查询用户的信息,排序条件可以没有调用方式: call GetUsersDynam ...

  5. dapper 调用 存储过程返回值_数据库事务、存储过程、函数以及触发器之间的区别和联系...

    一.[事务概念] 事务(Transaction)是指构成单一逻辑工作单元的操作集合,要么完整地执行,要么完全不执行. 1,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前 ...

  6. mysql中的存储过程优点_数据库存储过程在优点

    存储过程 sql语句执行的时候要先编译,然后执行.存储过程就是编译好了的一些sql语句.应用程序需要用的时候直接调用就可以了,所以效率会高. 存储过程介绍 存储过程是由流控制和SQL语句书写的过程,这 ...

  7. jdbc存储过程mysql_JDBC对MySQL数据库存储过程的调用

    1.什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完成特定功能而编写的一组的SQL语句集.存储过程经编译存储在数据库中,用户通过指定存储过程的名字并给出参 ...

  8. oracle中存储过程可见权限,Oracle数据库存储过程与权限

    在执行存储过程时,我们可能会遇到权限问题 ● 定义者权限存储过程 ● 调用者权限存储过程 在数据库中创建存储过程时,定义者权限是缺省模式 当指定AUTHID CURRENT_USER关键字后,便是调用 ...

  9. delve 调试带参数_带你学够浪:Go语言基础系列-环境配置和 Hello world

    前面几周陆陆续续写了一些后端技术的文章,包括数据库.微服务.内存管理等等,我比较倾向于成体系的学习,所以数据库和微服务还有后续系列文章补充. 最近工作上比较多的 Golang 编程,现在很多互联网公司 ...

最新文章

  1. win7中Android开发环境搭建超详细(百度)
  2. Python基础语法学习笔记
  3. 使用命令启动IIS管理器
  4. linux grep 正则搜索某段时间内的日志
  5. mac下webstorm 安装
  6. 用隐式反馈做推荐模型,你做对了吗
  7. EPS 转 pdf 在线
  8. Swagger天天用,但它背后的实现原理很多人都不知道!
  9. html是手机吗,MHTML是什么
  10. 分享一段飞天R502读卡器的JAVA读卡代码
  11. matlab用摄像头拍照,matlab调用摄像头拍照
  12. 计算机与机器人论文参考文献,机器人论文参考文献(2016年10月21日)
  13. 安卓手机整人代码c语言大全,求一个C语言整人代码!!!
  14. latex排版——博雅编辑室
  15. xshell对mysql的备份与恢复_XShell5里面登陆了数据库,如何将数据库里面的表或者整个数据库备份导出来(和导入进去)...
  16. 这一次,Google 终于对 Web 自动化下手了!
  17. 0428-Scrum团队成立
  18. kafka(15) Kafka Connect
  19. 计算机考试去底纹,Excel2007应用或删除单元格底纹
  20. 华为认证考试一定要去报培训班吗?

热门文章

  1. js 格式化日期 (/Date(1400046388387)/)
  2. repeater 的解释说明 用法
  3. mysql隔离级别底层实现_1、深入理解mysql四种隔离级别及底层实现原理(MVCC和锁)...
  4. pygame系列_游戏中的事件
  5. PHP的composer的快速源
  6. Go赋值使用:类型{} 定位使用.
  7. WeChat微信小程序image组件aspectFill:保留中部 等比例变化 Widthfix:宽度为指定的  高度依据原图的宽高比进行变化
  8. 反思本地测试没有问题 但测试服务器存在问题的解决方法:1.文件夹2.分支切换
  9. 反思相信谁的评价:一直的坚定的不移的相信自己对自己的评价 相信自己是多么的重要
  10. Git本地已有仓库进行连接Remote库 本地没有仓库进行本地新建仓库连接Remote库