SqlServer存储过程详解

1.创建存储过程的基本语法模板:

if (exists (select * from sys.objects where name = 'pro_name'))
drop proc pro_name
go
create proc pro_name
@param_name param_type [=default_value]
as
begin
sql语句
end

ps:[]表示非必写内容。sys.objects存储的是本数据库中的信息,不仅仅存储表名,还有存储过程名 、视图名、触发器等等。

例如:

 if (exists (select * from sys.objects where name = 'USP_GetAllUser'))
drop proc USP_GetAllUser
go
create proc USP_GetAllUser
@UserId int =1
as
set nocount on;
begin
select * from UserInfo where Id=@UserId
end

ps:SQL Server 实用工具将 GO 解释为应将当前的 Transact-SQL 批处理语句发送给 SQL Server 的信号。当前批处理语句是自上一 GO 命令后输入的所有语句,若是第一条 GO 命令,则是从特殊会话或脚本的开始处到这条 GO 命令之间的所有语句。

2.调用方法:

exec dbo.USP_GetAllUser 2;

ps:一般在执行存储过程是,最好加上架构名称,例如  dbo.USP_GetAllUser  这样可以可以减少不必要的系统开销,提高性能。 因为如果在存储过程名称前面没有加上架构名称,SQL SERVER 首先会从当前数据库sys schema(系统架构)开始查找,如果没有找到,则会去其它schema查找,最后在dbo架构(系统管理员架构)里面查找。

3.查看本数据库中存在的存储过程

依次展开数据库、可编程性、存储过程,即可看到已创建的存储过程。

4.修改存储过程

alter proc proc_name
as
  sql语句

5.存储过程中的输出参数的使用

 if (exists(select * from  sys.objects where name='GetUser'))
drop proc GetUser
go
create proc GetUser
@id int output,
@name varchar(20) out
as
begin
select @id=Id,@name=Name from UserInfo where Id=@id
end go
declare
@name varchar(20),
@id int;
set @id=3;
exec dbo.GetUser @id,@name out;
select @id,@name;
print Cast(@id as varchar(10))+'-'+@name;

ps:参数output为该参数可以输出

6.分页获取数据的存储过程

 if (exists(select * from  sys.objects where name='GetUserByPage'))
drop proc GetUserByPage
go
create proc GetUserByPage
@pageIndex int,
@pageSize int
as
declare
@startIndex int,
@endIndex int;
set @startIndex = (@pageIndex-1)*@pageSize+1;
set @endIndex = @startIndex + @pageSize -1 ;
begin
select Id,Name from
(
select *,row_number()over (order by Id)as number from UserInfo
)t where t.number>=@startIndex and t.number<=@endIndex
end go
exec dbo.GetUserByPage 2,4;

7.存储过程中事务的创建

if (exists(select * from  sys.objects where name='JayJayToTest'))
drop proc JayJayToTest
go
create proc JayJayToTest
@GiveMoney int,
@UserName nvarchar(20)
as
beginset nocount on;
begin tran;
begin try
update BankTest set Money = Money-@GiveMoney where Name=@UserName;
update BankTest set Money = Money+@GiveMoney where Name='test';
commit;
end try
begin catch
rollback tran;
print ('发生异常,事务进行回滚');
end catch
end
go
exec JayJayToTest 10,'jayjay'

8.了解存储过程的执行计划

SELECT * FROM sys.[syscacheobjects]查看当前缓存的执行计划

如果执行存储过程时成功通过解析阶段,则 Microsoft SQL Server 查询优化器将分析存储过程中的 Transact-SQL 语句并创建一个执行计划。执行计划描述执行存储过程的最快方法,所依据的信息包括:

  1.表中的数据量。

  2.表的索引的存在及特征,以及数据在索引列中的分布。

  3.WHERE 子句条件所使用的比较运算符和比较值。

  4.是否存在联接以及 UNION、GROUP BY 和 ORDER BY 关键字。

查询优化器在分析完存储过程中的这些因素后,将执行计划置于内存中。分析存储过程和创建执行计划的过程称为编译。优化的内存中的执行计划将用来执行该查询。执行计划将驻留在内存中,直到重新启动 SQL Server 或其他对象需要存储空间时为止。如果随后执行了存储过程,而现有执行计划仍留在内存中,则 SQL Server 将重用现有执行计划。如果执行计划不再位于内存中,则创建新的执行计划。

重新编译执行计划(create proc JayJayToTest with recompile)

创建存储过程时在其定义中指定 WITH RECOMPILE 选项,表明 SQL Server 将不对该存储过程计划进行高速缓存;该存储过程将在每次执行时都重新编译。当存储过程的参数值在各次执行间都有较大差异,导致每次均需创建不同的执行计划时,可使用 WITH RECOMPILE 选项。此选项并不常用,因为每次执行存储过程时都必须对其进行重新编译,这样会使存储过程的执行变慢。

由于数据库的新状态,数据库内的某些更改可能会导致执行计划效率低下或不再有效。SQL Server 检测这些使执行计划无效的更改,并将计划标记为无效。此后,必须为执行查询的下一个连接重新编译新的计划。导致计划无效的情况包括:

  1.对查询所引用的表或视图进行任何结构更改(ALTER TABLE 和 ALTER VIEW)。
  2.通过语句(如 UPDATE STATISTICS)显式生成或者自动生成新的分发内容统计。
  3.除去执行计划所使用的索引。
  4.显式调用 sp_recompile。
  5.对键的大量更改(其他用户对由查询引用的表使用 INSERT 或 DELETE 语句所产生的修改)。
  6.对于带触发器的表,inserted 或 deleted 表内的行数显著增长。

SqlServer存储过程详解的更多相关文章

  1. asp.net执行SqlServer存储过程!(详解!)

    ASP.NET执行存储过程 一. 执行一个没有参数的存储过程的代码如下: connectionString为连接字符串 SqlConnection conn=new SqlConnection(con ...

  2. SQLServer 存储过程详解

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

  3. mysql存储过程详解

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  4. mysql 存储过程详解 存储过程

    mysql存储过程详解 1.      存储过程简介         我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成 ...

  5. MySQL存储过程详解 mysql 存储过程

    原文地址:MySQL存储过程详解  mysql 存储过程作者:王者佳暮 mysql存储过程详解 1.     存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储 ...

  6. MySQL存储过程详解 mysql 存储过程(二)

    mysql存储过程详解 1.      存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL ...

  7. mySQL的存储过程详解

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  8. MySQL存储过程详解 mysql 存储过程(转)

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  9. mysql存储过程详解实例

    mysql存储过程详解 1.      存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL ...

随机推荐

  1. 调用不同目录类的protected构造器

    一.问题 二.分析 调用不同目录类的protected构造器,IDE报错. 二.解决办法: 后面添加一个{}就可以了

  2. js中的栈、堆、队列、内存空间

    栈(stack) .堆(heap). 队列(queue)是js的三种数据结构. 栈(stack) 栈的特点是"LIFO,即后进先出(Last in, first out)".数据存 ...

  3. IOS 上架到App Store被拒的常见问题总结

    Guideline 2.3.3 - Performance - Accurate Metadata 2017年11月16日 上午12:52 发件人 Apple 2. 3 Performance: Ac ...

  4. FormData

    1. 概述FormData类型其实是在XMLHttpRequest 2级定义的,它是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)提供便利. 2. 构造函数创建一个formData对象 ...

  5. 生产者消费者模式 php 【转】

    在工作中常常听到某某大牛之间的交谈会涉及到,xx消费者啊啥的,到底什么大牛之间讲的是什么? 这篇文章主要解决三个问题: 1.到底什么是生产者和消费者,以及它们之间的故事 2.它们之间靠什么交流 3.应 ...

  6. week4--系统调用的工作机制

    潘恒 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.使用库函数AP ...

  7. 小学四则运算APP 第二阶段冲刺

    第一阶段实现最基本的四则运算计算,最原始的所以还没有美化 xml文件     <LinearLayout xmlns:android="http://schemas.android.c ...

  8. 过滤器Filter的使用(以登录为例子)

    使用过滤器步骤: (1)在web.xml文件中添加过滤器(以下例子是过滤多个请求) <!-- 用户登录过滤 --> <filter> <filter-name>lo ...

  9. 3-palindrome CodeForces - 805B (思维)

    In the beginning of the new year Keivan decided to reverse his name. He doesn't like palindromes, so ...

  10. json.dumps()和json.loads()

    json.dumps()用于将字典形式的数据转化为字符串,json.loads()用于将字符串形式的数据转化为字典,代码: import json data = { 'name' : 'Connor' ...