SQLServer学习笔记系列11
一.写在前面的话
身体是革命的本钱,这句放在嘴边常说的话,还是拿出来一起共勉,提醒一起奋斗的同僚们,保证睡眠,注意身体!偶尔加个班,也许不曾感觉到身体发出的讯号,长期晚睡真心扛不住!自己也制定计划,敦促自己按照作息时间来上班学习生活!虽然自己每星期运动,还是觉得晚睡带来的身体压力,无法承受!程序猿兄弟们,我们早上起来的时候,可以看看自己的眼睛,如果充满血丝,那我们就该需要调养,好好休息了!没了身体,Coding的世界即将一去不复返!好好休息,保重身体!善待朋友,真爱家人,迎接每一天美丽的日出!共勉!
二.存储过程
什么是存储过程:存储过程可以认为是一个结果集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表
的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。
存储过程的好处:
1.由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高。
2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。
3.通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全。
(1)存储过程实例:
例如:我们需要调整产品价格,加¥10,但是有时候我们需要将产品价格提高¥20了?此时为了sql的重用,那么可以用存储过程实现。
创建存储过程:
CREATE PROCEDURE ModifyPrice
(
@num money )
AS
UPDATE Production.Products
SET unitprice=unitprice+@num;
其中@num为需要传递的参数,执行存储过程:exec ModifyPrice @num; 存储过程创建以后,一直存储在数据库中。
(2)存储过程的参数传递
存储过程 默认的为传入参数,与方法不同,存储过程没有通常意义上的返回类型和返回数据。但是我们可以利用传出参数来实现。例如查询顾客的数量:
CREATE PROCEDURE GetCustomersCount
(
@count int OUTPUT
)
AS
DECLARE @num INT;
SELECT @num=COUNT(*) FROM Sales.Customers; --传出 SET @count=@num;
go --必须使用变量来保存传出的参数
DECLARE @myCount int; --前面是参数中定义的传出参数
--后面是我们定义的用来保存输出结果的变量 EXEC GetCustomersCount @count=@myCount OUTPUT; PRINT @myCount;
执行结果:
(3)存储过程的return参数
名字虽然叫return参数,但是不是普通的return,跟C#中的return不一样,只能return整数,表示执行的一种状态,返回0表示执行成功,即使没有写return ,默认为0。
例如我们想要对用户名字的长度做做一个校验,所以在这里根据return 返回的值,来进行判断。
--创建用户
CREATE PROCEDURE CreateUser
(
@username nvarchar()
)
AS
DECLARE @namelen INT;
SET @namelen=LEN(@username); IF @namelen>
RETURN
ELSE
RETURN ; GO
--定义变量保存结果 DECLARE @ReturnValue INT;
EXEC @ReturnValue=dbo.CreateUser @username = N'liupeng' -- nvarchar()
PRINT @ReturnValue;
执行结果:
(4)几种常见的分页存储过程:
首先创建一张表作为测试表,用来保存用户的个人信息:
--创建数据库testDB
if DB_ID('testDB') is not NULL
DROP DATABASE testDB;
CREATE DATABASE testDB ;
go
IF OBJECT_ID('testTable') IS NOT NULL
DROP TABLE testTable;
CREATE TABLE testTable
(
id INT IDENTITY(,) PRIMARY KEY NOT NULL,
userName NVARCHAR() NOT NULL,
userPWD NVARCHAR() NOT NULL,
userPhone NVARCHAR() NOT NULL
) go
接着我们可以向数据库表中插入一些数据,为了是数据量大,呈现的结果准确,我们插入5000000条数据进行测试,由于插入的时候,等待了15分钟,时间
太长,我终止了sql继续执行,查询数据库,此时已插入322446行数据。
--插入数据
set identity_insert testTable on --设置为on时,可以向标识列中插入
declare @count int
set @count=
while @count<=
begin
insert into testTable(id,userName,userPWD,userPhone) values(@count,'liupeng','liupeng_IT','@liupengwuhan@gmail.com')
set @count=@count+
end
set identity_insert testTable off
1.利用select top和select max结合使用,来查询数据分页数据。
create procedure proc_pagedFenye_with_selectMax --利用select top and select max(列)
(
@pageIndex int, --页索引
@pageSize int --页记录数
)
as
begin
set nocount on;
declare @timediff datetime
declare @sql nvarchar()
select @timediff=Getdate()
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'
execute(@sql)
select datediff(ms,@timediff,GetDate()) as 查询时间
set nocount off;
END
执行存储过程:
EXEC proc_pagedFenye_with_selectMax , --查询第十一页的数据,每页数据10条
查询结果如图所示:消耗的时间为3毫秒。
2.利用select top和select not in结合使用,来进行分页数据查询。
create procedure proc_pagedFenye_with_notin --利用select top and select not in
(
@pageIndex int, --页索引
@pageSize int --每页记录数
)
as
begin
set nocount on;
declare @timediff datetime --耗时
declare @sql nvarchar()
select @timediff=Getdate()
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
select datediff(ms,@timediff,GetDate()) as 查询时间
set nocount off;
END
执行存储过程:
EXEC proc_pagedFenye_with_notin 10,10 --查询第十一页的数据,每页数据10条
查询结果如图所示:消耗的时间为6毫秒。
3.利用row_number()排序方法来进行测试。
create procedure proc_pagedFenye_with_Rownumber --利用SQL 2005中的Row_number()
(
@pageIndex int,
@pageSize int
)
as
begin
set nocount on;
declare @timediff DATETIME;
select @timediff=getdate()
select * from (select *,Row_number() over(order by ID asc) as IDRank from testTable) as IDWithRowNumber where IDRank>@pageSize*(@pageIndex-) and IDRank<@pageSize*(@pageIndex+)
select datediff(ms,@timediff,getdate()) as 查询时间
set nocount off;
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 * FROM Sales.Customers
nocount打开:
USE TSQLFundamentals2008;
SET NOCOUNT ON;
SELECT TOP * FROM Sales.Customers
三.用户自定义函数(UDF)
在sql中我们经常用到Function,系统自带的函数为我们提供了很多方便,有时候我们需要根据业务需求,可能系统函数不能完全满足我们的需求,此时就需
要用户自定义Function,满足用户的要求。
例如:我们可以定义一个函数来根据传递的时间,获取当前时间的分钟数。
--创建函数
CREATE FUNCTION Getminnutes
(
@datevalue datetime --传入参数
)
--函数可以直接返回一个值
RETURNS int
AS
begin
--函数体
DECLARE @mi INT;
SET @mi=DATEPART(MINUTE,@datevalue);
RETURN @mi;
END; SELECT dbo.Getminnutes(GETDATE())
执行结果:
希望各位大牛给出指导,不当之处虚心接受学习!谢谢!
SQLServer学习笔记系列11的更多相关文章
- SQLServer学习笔记系列3
一.写在前面的话 今天又是双休啦!生活依然再继续,当你停下来的时候,或许会突然显得不自在.有时候,看到一种东西,你会发现原来在这个社会上,优秀的人很多,默默 吃苦努力奋斗的人也多!星期五早上按时上班, ...
- SQLServer学习笔记系列2
一.写在前面的话 继上一次SQLServer学习笔记系列1http://www.cnblogs.com/liupeng61624/p/4354983.html以后,继续学习Sqlserver,一步一步 ...
- SQLServer学习笔记系列6
一.写在前面的话 时间是我们每个人都特别熟悉的,但是到底它是什么,用什么来衡量,可能很多人会愣在那里.时间可以见证一切,也可以消磨一切,那些过往的点点滴滴可思可忆.回想往年清明节过后,在家乡的晚上总能 ...
- SQLServer学习笔记系列5
一.写在前面的话 转眼又是一年清明节,话说“清明时节雨纷纷”,武汉的天气伴随着这个清明节下了一场暴雨,整个城市如海一样,朋友圈渗透着清明节武汉看海的节奏.今年又没有回老家祭祖,但是心里依然是怀念着那些 ...
- SQLServer学习笔记系列1
一.前言 一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流! 不当之处请斧正!在此感谢!这边就先从学习Sqlserver写起,自己本身对数 ...
- SQLServer学习笔记系列4
一.写在前面的话 好多天没有记录sql学习笔记了,要坚持下去,坚信每一点的进步都是为在积蓄力量.今天看到一幅图,特此分享出来. 通过这幅图,我看到的是每人站在自己的角度看问题,感受是不一样的,就如同学 ...
- SQLServer学习笔记系列12
一.写在前面的话 这个sql学习系列,今天准备告一段落,虽然短短的十几篇文章,深刻感受到将学习的东西记录下来,是需要一种坚持! 这些东西只有反复的学习吸收,最终沉淀下来的才是属于自己的知识.也是提醒自 ...
- SQLServer学习笔记系列10
一.写在前面的话 生活的路很长,还是要坚持走下去,自己选择的生活,就该让这样的生活放射精彩!我不奢求现在的积累,在将来能够收获多少,至少在以后的日子里回忆起来,我不曾放弃过,我坚持过,我不后悔!最近跟 ...
- SQLServer学习笔记系列8
一.写在前面的话 最近一直在思考一个问题,什么才能让我们不显得浮躁,真正的静下心来,用心去感受,用心去回答每个人的问题,用心去帮助别人.现实的生活,往往让我们显得精疲力尽,然后我们仔细想过没用,其实支 ...
随机推荐
- ThinkPHP5 助手函数
对于ThinkPHP5.0以前的版本,助手函数全部是单字母函数,但到ThinkPHP5之后,使用如下函数来代替单字母函数: 最常用: /** * 实例化Model * @param string $n ...
- C#程序代码分析(第三周)
刚开始看到这段程序,都不知道是什么东西,问过室友才知道是C#程序:但对C#一点都不了解,最基本的项目建设都不会,在室友的帮助下,以及在网上搜了一些资料,勉强算是完成了此次作业吧. using Syst ...
- HTML 常用标签
一.基础标签 <!-- --> 定义注释 <!DOCTYPE> 定义文档类型 <style> 定义文档的样式信息 <meta> 定义关于HTML文 ...
- LINUX 下时间转换为秒数
linux下时间是从1970.1.1开始算的秒数 //转来自网址 http://blog.csdn.net/wind19/article/details/6579495 $ dateTue Feb 3 ...
- SQL Server数据库备份的镜像
SQL Server数据库备份的镜像 一个完整备份可以分开镜像 USE master GO BACKUP DATABASE [testdatabase] TO DISK = N'C:\testdata ...
- 有一个团队协同工具,叫Worktile
项目管理,本是一个老生常谈的话题,曾几何时大碗云集在这个市场,其中不乏出现像微软.SAP.IBM.用友这样的名字.复杂而又冗繁的流程控制,让人们划分成两类人,一类是会使用这些工具和系统的人,另一类是不 ...
- java中构造方法的特殊性
构造方法名与类名相同 构造方法没有返回值,也不能写void 构造方法的主要作用是完成对对象的初始化工作 构造方法一般不由编程人员显示调用,而是由new来调用 在创建一个类的对象的同时,系统会自动调用该 ...
- PHP的pcntl多进程
PHP使用PCNTL系列的函数也能做到多进程处理一个事务.比如我需要从数据库中获取80w条的数据,再做一系列后续的处理,这个时候,用单进程?你可以等到明年今天了...所以应该使用pcntl函数了. 假 ...
- MongoDB学习笔记~根据子集合里某个属性排序
回到目录 这个问题是这样的,有一个实体dog,里面有集合属性DogHistory,它里面有一些自己的属性,其中一个是SortNum,主要用来进行排序,而且这个排序可以影响主对象,即影响dog类,这个在 ...
- js事件(event)的运行原理
昨天写click事件时候突然脑袋抽筋想了想浏览器是怎么执行click事件的,为什么我们可以用e或者window.event这个对象获取一些事件的属性呐?以下是我的理解.如果您有更好的理解,欢迎评论!! ...