存储过程及ASP调用存储过程实现分页(七)
以上的SQL优化只是给大家做个简单的介绍。希望你能看懂些,及在以后的应用中能想到的话就用上吧。这也是本文的目的。
为了方便大家参考我把所有的T-SQL语句写如下:
这里是所有的T-SQL语句,可以做为学习参考,里面我都注释,再不懂就在查询分析器里F1呵呵~:):
/*=======开始=========*/
CREATE database johnny --创建数据库
go
USE johnny --使用数据库
go
CREATE TABLE testTable( --创建表
tID int identity(1,1), --创建字段,下同
tUserName varchar(50),
tTel varchar(30)
)
go
CREATE TABLE testUser
(
uID int primary key identity(1,1), --创建主键
uName varchar(20) not null, --用户名,非空
uEmail varchar(50) not null, --用户名电子邮件,非空
uQQ int default 0 --用户QQ,默认0
)
go
/*先给用户表插入几条记录*/
insert into testUser(uName,uEmail,uQQ) values('johnny','chenzxmail@163.com',40623660)
insert into testUser(uName,uEmail,uQQ) values('张三','12345@163.com',123456)
insert into testUser(uName,uEmail,uQQ) values('李四','43435@163.com',4354534)
go
/*查看刚才插入的数据*/
select * from testuser
go
/*插入数据到测试的表*/
set nocount on --当 SET NOCOUNT 为 ON 时,存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。
declare @i int --DECLARE 语句声明变量@i,并用 SET 或 SELECT 语句给其指派值。
set @i=1 --用 SET 或 SELECT 语句给其指派值
while @i<=200000 --只要指定的条件为真,就重复执行语句。即插入200000的数据,呵呵发了1分14秒的时间。
begin
insert into testTable(tUserName,tTel) values(CAST(round(rand()*100000,0) AS varchar),CAST(round(rand()*100000,0) AS varchar)+CAST(CEILING(round(rand()*100000,0)/3) AS VARCHAR))
SELECT @i=@i+1
end
go
/*查看刚才插入的前50条记录的信息*/
SELECT TOP 50 * FROM testTable
go
/*第一个简单的存储过程*/
CREATE PROC testPROC1
AS
SELECT * FROM testUser
go
/*==============
第2个存储过程:即有返回值,输入参数和输出参数。
●RETURN 语句无条件终止查询、存储过程或批处理。存储过程或批处理中 RETURN 语句后面的语句都不执行。
●return的说明:除非特别指明,所有系统存储过程返回 0 值表示成功,返回非零值则表示失败。
●本存储过程的return都是特别的说明,所以其返回值都是有相应的意义。
●下面的返回值0、1、2假如去掉的话,即如果 RETURN 未指定值,则存储过程返回 0。在程序调用且正常运行的情况下获取“返回值”的值都是返回 0 。
==============*/
CREATE PROC testPROC2
@userName varchar(20), --声明变量@userName
@userEmail varchar(50) OUTPUT --声明变量@userEmail,且是输出参数。
AS
set nocount on
begin
IF @userName is null OR @userName='' --当输入参数为空或is null时
begin
set @userEmail='请输入要查询的用户名!' --符合条件给输出参数赋值,以便提示
return 0 --输入参数为空时,“返回值”我们这里设置为 0(当然可以设置其他的数字)。
end
ELSE
IF exists(SELECT uEmail FROM testUser WHERE uName=@userName) --如果输入参数存在时
begin
SELECT @userEmail=uEmail FROM testUser WHERE uName=@userName --输出参数赋值
return 1 --验证输入的参数(用户名),存在时“返回值”我们这里设置为 1。
end
ELSE
begin
set @userEmail='不存在此用户名!' ----如果输入参数 不 存在时,提示
return 2 --输入的参数(用户名)不 存在时“返回值”我们这里设置为 2。
end
end
go
/*=======第3个存储过程====
有返回输出参数和记录集的存储过程
========================*/
CREATE PROC testPROC3
@tPageCount int OUTPUT, --输出参数,总页数
@tPageSize int, --每页显示多少条记录
@tPageNo int --当前页码
AS
SET NOCOUNT ON
BEGIN
/*取得总记录条数*/
DECLARE @tRecordCount int --总记录条数
SELECT @tRecordCount=COUNT(tID) FROM testTable
--PRINT @tRecordCount
/*确定总的页数*/
IF (@tRecordCount % @tPageSize) = 0
SET @tPageCount=CEILING(@tRecordCount/@tPageSize) --CEILING函数:返回大于或等于所给数字表达式的最小整数。
ELSE
SET @tPageCount=CEILING(@tRecordCount/@tPageSize)+1
/*如果输入的页码大于总的页数*/
IF @tPageNo > @tPageCount
SET @tPageNo = @tPageCount
/*确定当前页记录的起止标记*/
DECLARE @tStart int , @tEnd int --设置起止标志
SET @tStart=(@tPageNo-1) * @tPageSize
SET @tEnd =@tStart+@tPageSize+1
/*由其止标记得到当前页的记录*/
SELECT * FROM testTable WHERE (tID>@tStart) AND (tID<@tEnd)
--SELECT * FROM testTable WHERE (tID<@tEnd) AND (tID>@tStart)
--SELECT * FROM testTable WHERE tID between @tStart+1 AND @tEnd
/*我们把总记录做为返回值,这样存储过程就变了有返回值,输出参数和记录集了*/
RETURN @tRecordCount --做为返回值
END
GO
/*=======第4个存储过程=====
这个存储过程比较简单主要是说明怎么读取多个记录集的问题。
注意:记录集的要按顺序来读取。不能跳着读。
======================*/
USE johnny
go
CREATE PROC testPROC4
AS
SET NOCOUNT ON
BEGIN
SELECT uName FROM testUser
SELECT uEmail FROM testUser
SELECT uQQ FROM testUser
END
go
--sp_helptext testPROC1 --用于查看存储过程
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |