pb 执行存储过程带参数_数据库存储过程
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 执行存储过程带参数_数据库存储过程相关推荐
- mysql怎么写数据存储过程_数据库存储过程要怎么写
SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数) ...
- Python 执行SQL带参数
Python 执行SQL带参数 转载于:https://www.cnblogs.com/xibuhaohao/p/10451456.html
- pb 执行存储过程带参数_SQL高级知识——存储过程
存储过程的定义 存储过程其实就是已预编译为可执行过程的一个或多个SQL语句. 通过调用和传递参数即可完成该存储过程的功能. 创建存储过程语法 CREATE PROC | PROCEDURE proce ...
- mysql带参数的sql_MySql存储过程是带参数的存储过程(动态执行SQL语句)
下文介绍的MySql存储过程是带参数的存储过程(动态执行SQL语句),该MySql存储过程是根据用户输入的条件和排序方式查询用户的信息,排序条件可以没有调用方式: call GetUsersDynam ...
- dapper 调用 存储过程返回值_数据库事务、存储过程、函数以及触发器之间的区别和联系...
一.[事务概念] 事务(Transaction)是指构成单一逻辑工作单元的操作集合,要么完整地执行,要么完全不执行. 1,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前 ...
- mysql中的存储过程优点_数据库存储过程在优点
存储过程 sql语句执行的时候要先编译,然后执行.存储过程就是编译好了的一些sql语句.应用程序需要用的时候直接调用就可以了,所以效率会高. 存储过程介绍 存储过程是由流控制和SQL语句书写的过程,这 ...
- jdbc存储过程mysql_JDBC对MySQL数据库存储过程的调用
1.什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完成特定功能而编写的一组的SQL语句集.存储过程经编译存储在数据库中,用户通过指定存储过程的名字并给出参 ...
- oracle中存储过程可见权限,Oracle数据库存储过程与权限
在执行存储过程时,我们可能会遇到权限问题 ● 定义者权限存储过程 ● 调用者权限存储过程 在数据库中创建存储过程时,定义者权限是缺省模式 当指定AUTHID CURRENT_USER关键字后,便是调用 ...
- delve 调试带参数_带你学够浪:Go语言基础系列-环境配置和 Hello world
前面几周陆陆续续写了一些后端技术的文章,包括数据库.微服务.内存管理等等,我比较倾向于成体系的学习,所以数据库和微服务还有后续系列文章补充. 最近工作上比较多的 Golang 编程,现在很多互联网公司 ...
最新文章
- win7中Android开发环境搭建超详细(百度)
- Python基础语法学习笔记
- 使用命令启动IIS管理器
- linux grep 正则搜索某段时间内的日志
- mac下webstorm 安装
- 用隐式反馈做推荐模型,你做对了吗
- EPS 转 pdf 在线
- Swagger天天用,但它背后的实现原理很多人都不知道!
- html是手机吗,MHTML是什么
- 分享一段飞天R502读卡器的JAVA读卡代码
- matlab用摄像头拍照,matlab调用摄像头拍照
- 计算机与机器人论文参考文献,机器人论文参考文献(2016年10月21日)
- 安卓手机整人代码c语言大全,求一个C语言整人代码!!!
- latex排版——博雅编辑室
- xshell对mysql的备份与恢复_XShell5里面登陆了数据库,如何将数据库里面的表或者整个数据库备份导出来(和导入进去)...
- 这一次,Google 终于对 Web 自动化下手了!
- 0428-Scrum团队成立
- kafka(15) Kafka Connect
- 计算机考试去底纹,Excel2007应用或删除单元格底纹
- 华为认证考试一定要去报培训班吗?
热门文章
- js 格式化日期 (/Date(1400046388387)/)
- repeater 的解释说明 用法
- mysql隔离级别底层实现_1、深入理解mysql四种隔离级别及底层实现原理(MVCC和锁)...
- pygame系列_游戏中的事件
- PHP的composer的快速源
- Go赋值使用:类型{} 定位使用.
- WeChat微信小程序image组件aspectFill:保留中部 等比例变化 Widthfix:宽度为指定的 高度依据原图的宽高比进行变化
- 反思本地测试没有问题 但测试服务器存在问题的解决方法:1.文件夹2.分支切换
- 反思相信谁的评价:一直的坚定的不移的相信自己对自己的评价 相信自己是多么的重要
- Git本地已有仓库进行连接Remote库 本地没有仓库进行本地新建仓库连接Remote库