SQLServer学习笔记系列11

一.写在前面的话

身体是革命的本钱,这句放在嘴边常说的话,还是拿出来一起共勉,提醒一起奋斗的同僚们,保证睡眠,注意身体!偶尔加个班,也许不曾感觉到身体发出的讯号,长期晚睡真心扛不住!自己也制定计划,敦促自己按照作息时间来上班学习生活!虽然自己每星期运动,还是觉得晚睡带来的身体压力,无法承受!程序猿兄弟们,我们早上起来的时候,可以看看自己的眼睛,如果充满血丝,那我们就该需要调养,好好休息了!没了身体,Coding的世界即将一去不复返!好好休息,保重身体!善待朋友,真爱家人,迎接每一天美丽的日出!共勉!

二.存储过程

什么是存储过程:存储过程可以认为是一个结果集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表

的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。

存储过程的好处

1.由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高。

2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。

3.通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全。

(1)存储过程实例:

例如:我们需要调整产品价格,加¥10,但是有时候我们需要将产品价格提高¥20了?此时为了sql的重用,那么可以用存储过程实现。

创建存储过程:

1 CREATE PROCEDURE ModifyPrice
2 (
3   @num money
4
5 )
6 AS
7 UPDATE Production.Products
8 SET [email protected];

其中@num为需要传递的参数,执行存储过程:exec  ModifyPrice @num;  存储过程创建以后,一直存储在数据库中。

(2)存储过程的参数传递

存储过程 默认的为传入参数,与方法不同,存储过程没有通常意义上的返回类型和返回数据。但是我们可以利用传出参数来实现。例如查询顾客的数量:

 1 CREATE PROCEDURE GetCustomersCount
 2 (
 3  @count int OUTPUT
 4 )
 5 AS
 6 DECLARE  @num INT;
 7 SELECT        @num=COUNT(*) FROM Sales.Customers;
 8
 9 --传出
10
11 SET @count=@num;
12 go
13
14 --必须使用变量来保存传出的参数
15 DECLARE @myCount int;
16
17 --前面是参数中定义的传出参数
18 --后面是我们定义的用来保存输出结果的变量
19
20 EXEC GetCustomersCount @count=@myCount OUTPUT;
21
22 PRINT @myCount;       

执行结果:

(3)存储过程的return参数

名字虽然叫return参数,但是不是普通的return,跟C#中的return不一样,只能return整数,表示执行的一种状态,返回0表示执行成功,即使没有写return ,默认为0。

例如我们想要对用户名字的长度做做一个校验,所以在这里根据return 返回的值,来进行判断。

 1 --创建用户
 2 CREATE PROCEDURE CreateUser
 3 (
 4    @username nvarchar(100)
 5 )
 6 AS
 7 DECLARE @namelen INT;
 8 SET @namelen=LEN(@username);
 9
10 IF    @namelen>5
11 RETURN 0
12 ELSE
13 RETURN 1 ;
14
15 GO
16 --定义变量保存结果
17
18 DECLARE @ReturnValue INT;
19 EXEC  @ReturnValue=dbo.CreateUser @username = N‘liupeng‘  -- nvarchar(100)
20 PRINT @ReturnValue;

执行结果:

(4)几种常见的分页存储过程:

首先创建一张表作为测试表,用来保存用户的个人信息:

 1 --创建数据库testDB
 2 if DB_ID(‘testDB‘) is not NULL
 3 DROP DATABASE testDB;
 4 CREATE DATABASE testDB ;
 5 go
 6 IF OBJECT_ID(‘testTable‘) IS NOT NULL
 7 DROP TABLE testTable;
 8 CREATE TABLE testTable
 9 (
10 id INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
11 userName NVARCHAR(200) NOT NULL,
12 userPWD  NVARCHAR(200) NOT NULL,
13 userPhone NVARCHAR(200) NOT NULL
14 )
15
16 go 

接着我们可以向数据库表中插入一些数据,为了是数据量大,呈现的结果准确,我们插入5000000条数据进行测试,由于插入的时候,等待了15分钟,时间

太长,我终止了sql继续执行,查询数据库,此时已插入322446行数据。

 1  --插入数据
 2  set identity_insert testTable on  --设置为on时,可以向标识列中插入
 3  declare @count int
 4  set @count=1
 5  while @count<=2000000
 6  begin
 7     insert into testTable(id,userName,userPWD,userPhone) values(@count,‘liupeng‘,‘liupeng_IT‘,‘@[email protected]‘)
 8      set @[email protected]+1
 9 end
10 set identity_insert testTable off

1.利用select top和select max结合使用,来查询数据分页数据。

 1  create procedure proc_pagedFenye_with_selectMax  --利用select top and select max(列)
 2  (
 3      @pageIndex int,  --页索引
 4      @pageSize int    --页记录数
 5  )
 6  as
 7  begin
 8  set nocount on;
 9      declare @timediff datetime
10    declare @sql nvarchar(500)
11     select @timediff=Getdate()
12     set @sql=‘select top ‘+str(@pageSize)+‘ * From testTable where(ID>(select max(id) From (select top ‘+str(@pageSize*@pageIndex)+‘ id From testTable order by ID) as TempTable)) order by ID‘
13    execute(@sql)
14    select datediff(ms,@timediff,GetDate()) as 查询时间
15 set nocount off;
16 END

执行存储过程:

EXEC proc_pagedFenye_with_selectMax 10,10    --查询第十一页的数据,每页数据10条

查询结果如图所示:消耗的时间为3毫秒。

2.利用select top和select not in结合使用,来进行分页数据查询。

 1 create procedure proc_pagedFenye_with_notin  --利用select top and select not in
 2 (
 3      @pageIndex int,  --页索引
 4      @pageSize int    --每页记录数
 5 )
 6  as
 7  begin
 8     set nocount on;
 9     declare @timediff datetime --耗时
10     declare @sql nvarchar(500)
11     select @timediff=Getdate()
12     set @sql=‘select top ‘+str(@pageSize)+‘ * from testTable where(ID not in(select top ‘+str(@pageSize*@pageIndex)+‘ id from testTable order by ID ASC)) order by ID‘     execute(@sql)  --因select top后不支技直接接参数,所以写成了字符串@sql
13     select datediff(ms,@timediff,GetDate()) as 查询时间
14     set nocount off;
15 END

执行存储过程:

EXEC proc_pagedFenye_with_notin 10,10        --查询第十一页的数据,每页数据10条

查询结果如图所示:消耗的时间为6毫秒。

3.利用row_number()排序方法来进行测试。

 1 create procedure proc_pagedFenye_with_Rownumber  --利用SQL 2005中的Row_number()
 2  (
 3     @pageIndex int,
 4     @pageSize int
 5  )
 6  as
 7  begin
 8  set nocount on;
 9     declare @timediff DATETIME;
10     select @timediff=getdate()
11     select * from (select *,Row_number() over(order by ID asc) as IDRank from testTable) as IDWithRowNumber where IDRank>@pageSize*(@pageIndex-1) and IDRank<@pageSize*(@pageIndex+1)
12     select datediff(ms,@timediff,getdate()) as 查询时间
13 set nocount off;
14 END

执行存储过程:

EXEC proc_pagedFenye_with_Rownumber 10,10       --查询第十一页的数据,每页数据10条

查询结果如图所示:消耗的时间为3毫秒。

根据上述测试结果:我们可以得到查询效率上:select max >row_number>not in,可能由于数据量的问题,结果并不准确,在这里只作为参考作用。希望可以一起探讨!

在这里提示一下:

在存储过程中,经常用到SET NOCOUNT ON;作用:阻止在结果集中返回显示受T-SQL语句或则usp影响的行计数信息。

当SET ONCOUNT ON时候,不返回计数,当SET NOCOUNT OFF时候,返回计数;

即使当SET NOCOUNT ON 时候,也更新@@RowCount;

当SET NOCOUNT on时候,将不向客户端发送存储过程每个语句的DONE_IN_proc消息,如果存储过程中包含一些并不返回实际数据的语句,网络通信流量便会大量减少,可以显著提高应用程序性能;

SET NOCOUNT 指定的设置时在执行或运行时候生效,分析时候不生效。

例如:查询顾客表中前5位顾客:

nocount 关闭:

USE TSQLFundamentals2008;
SET NOCOUNT OFF;
SELECT TOP 5  *  FROM Sales.Customers

nocount打开:

1 USE TSQLFundamentals2008;
2 SET NOCOUNT ON;
3 SELECT TOP 5  *  FROM Sales.Customers

三.用户自定义函数(UDF)

在sql中我们经常用到Function,系统自带的函数为我们提供了很多方便,有时候我们需要根据业务需求,可能系统函数不能完全满足我们的需求,此时就需

要用户自定义Function,满足用户的要求。

例如:我们可以定义一个函数来根据传递的时间,获取当前时间的分钟数。

 1 --创建函数
 2 CREATE FUNCTION Getminnutes
 3 (
 4  @datevalue datetime  --传入参数
 5 )
 6 --函数可以直接返回一个值
 7 RETURNS int
 8 AS
 9 begin
10  --函数体
11  DECLARE @mi INT;
12  SET @mi=DATEPART(MINUTE,@datevalue);
13  RETURN @mi;
14  END;
15
16 SELECT dbo.Getminnutes(GETDATE())

执行结果:

希望各位大牛给出指导,不当之处虚心接受学习!谢谢!

时间: 2024-11-04 07:45:12

SQLServer学习笔记系列11的相关文章

SQLServer学习笔记系列3

一.写在前面的话 今天又是双休啦!生活依然再继续,当你停下来的时候,或许会突然显得不自在.有时候,看到一种东西,你会发现原来在这个社会上,优秀的人很多,默默 吃苦努力奋斗的人也多!星期五早上按时上班,买好早餐,去公司餐厅吃早餐,我遇见了一个人,也许一次两次我还不会去注意,然而我每次在餐厅吃早餐, 都会遇到他,我看到他的是每一次都带着一碗白粥在那里吃,甚至连一点咸菜都没用,或许我这样的单身狗,不能理解有家室的痛楚,也许这是他的一种生活 方式,但我更多的看到的是他的一种吃苦,为了家人,为了将来的一种

SQLServer学习笔记系列1

本系列博文转载自http://www.cnblogs.com/liupeng61624/category/668878.html 本人是新入行的小菜鸟,希望转载一些博文和大家一起学习!谢谢! SQLServer学习笔记系列1 一.前言 一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流!不当之处请斧正!在此感谢! 这边就先从学习Sqlserver写起,自己本身对数据库方面不擅长,所以决定对此从基础开始学习,大牛们对此文可以忽略!首先以<

SQLServer学习笔记系列2

SQLServer学习笔记系列2 一.写在前面的话 继上一次SQLServer学习笔记系列1http://www.cnblogs.com/liupeng61624/p/4354983.html以后,继续学习Sqlserver,一步一步走下去,相信努力终会 有收获!一直坚信这句话,这个世界上比你优秀的人很多,他们在你休息的时候,勤勤恳恳的做着我们看不到的事情,但你回首往事的时候,真心觉得那段奋 斗的岁月让你骄傲!年轻就得折腾,年轻就要奋斗!好啦,进入正题吧! 二.sql的范围内查找 (1)betw

SQLServer学习笔记系列6

一.写在前面的话 时间是我们每个人都特别熟悉的,但是到底它是什么,用什么来衡量,可能很多人会愣在那里.时间可以见证一切,也可以消磨一切,那些过往的点点滴滴可思可忆.回想往年清明节过后,在家乡的晚上总能听见阵阵的青蛙叫声,那是清脆的叫声,那是家乡的味道.时间一转眼,貌似那些日子已离我远去好久,在城市的喧嚣浮华中,找寻不到那种内心的宁静.感叹时间流逝的同时,怀念过去的点点滴滴.我想在繁华的都市中寻找一种安定的心情来学习,或许是一种不错的方式.学习才会让我们认清自己,找回自我,做内心的强者,不骄不躁,

SQLServer学习笔记系列5

一.写在前面的话 转眼又是一年清明节,话说“清明时节雨纷纷”,武汉的天气伴随着这个清明节下了一场暴雨,整个城市如海一样,朋友圈渗透着清明节武汉看海的节奏.今年又没有回老家祭祖,但是心里依然是怀念着那些亲人,虽说他们已离我们远去,然而那些血浓于水的亲情是一辈子无法忘记的,在心里深深的想念他们.生活继续,激情永恒!时刻保持着奋斗的节奏,为那些爱我们的和我爱的人,好好活着,做一个斗士,让我们都能够获得幸福!继续我们的学习吧!在这里首先分享海子的一首诗: 面对大河我无限惭愧, 我年华虚度,空有一身疲倦,

SQLServer学习笔记系列4

一.写在前面的话 好多天没有记录sql学习笔记了,要坚持下去,坚信每一点的进步都是为在积蓄力量.今天看到一幅图,特此分享出来. 通过这幅图,我看到的是每人站在自己的角度看问题,感受是不一样的,就如同学习知识一样,总觉得自己的理解才是最独特的,有时候适当把东西分享出 去,听听别人的见解,或许会让我们理解的更加深刻.换位思考,冷静处理,沉着淡定,不骄不躁,bug只不过生活的一部分,正因为有了bug才会让我们进 步,让我们去学习,去追寻问题的答案,一起努力,做一个快乐的程序猿.这个世界唯一不变的就是变

SQLServer学习笔记系列12

一.写在前面的话 这个sql学习系列,今天准备告一段落,虽然短短的十几篇文章,深刻感受到将学习的东西记录下来,是需要一种坚持! 这些东西只有反复的学习吸收,最终沉淀下来的才是属于自己的知识.也是提醒自己,今后的日子更要有计划,转眼又是7月份了, 时间不等人,岁月不饶人!坚持自己的计划,坚持向往的东西,踏实学习,因为自己不会的还太多,那些大牛还在学习, 我就更没理由逃避!也希望结交一些朋友,一起讨论技术,一起学习,一起进步!   二.触发器 触发器是一种特殊类型的存储过程,不能被显示的执行.它所监

SQLServer学习笔记系列7

一.写在前面的话 转眼又是周一,回想双休的日子,短暂而幸福,在阳光明媚的下午,可以自己做自己想做的任何事,惬意舒适,或读书,或运动,或音乐,当我们静下心来慢慢感受这些的时候,会突然发觉,原来生活是这么的幸福!有所求,有所感,就够啦!简简单单的生活其实就是最奢华的享受!忘记不开心的事,做自己生活的主导,摆脱烦恼,希望园子的朋友们,都能有一个好心情,不顺心的时候,出去走走,让情绪行走无边,放空自己!相信美好的事情终将发生! 二.视图 视图可以看作定义在SQL Server上的虚拟表.视图包含查询的一

SQLServer学习笔记系列10

一.写在前面的话 生活的路很长,还是要坚持走下去,自己选择的生活,就该让这样的生活放射精彩!我不奢求现在的积累,在将来能够收获多少,至少在以后的日子里回忆起来,我不曾放弃过,我坚持过,我不后悔!最近跟朋友谈到成长的话题,我们似乎摆脱不了被敦促的年纪,结婚.下一代是父母对我们的期盼,不同的年龄看问题的方式或许不同,真的到了他们那个年龄,我们才能真正体会那种心情,那种期盼!我只想告诉父母们,我们会努力的!走进未来的幸福,也是我们追求的,只是在这条路上,我们需要更大的勇气努力!你们好好保重,幸福会来的