T-SQL 经典行专列、列转行,分页及存储过程

T-SQL 经典行专列、列转行,分页及存储过程
T-SQL 经典行专列、列转行,分页及存储过程

T-SQL 经典编程

说明:本实例是以SQL Server 2005 为运行环境的。

准备工作:创建一个名为DB 的数据库(CREATE DATABASE DB)。

一、T-SQL 行转列

1、创建如下表

CREATE TABLE [Scores] (

[ID] INT IDENTITY(1,1),--自增标识

[StuNo] INT,--学号

[Subject] NVARCHAR(30),--科目

[Score] FLOAT--成绩

)

GO

INSERT INTO [Scores]

SELECT 100,'语文', 80 UNION

SELECT 100,'数学', 75 UNION

SELECT 100,'英语', 70 UNION

SELECT 100,'生物', 85 UNION

SELECT 101,'语文', 80 UNION

SELECT 101,'数学', 90 UNION

SELECT 101,'英语', 70 UNION

SELECT 101,'生物', 85

CREATE TABLE [Student] (

[ID] INT IDENTITY(100,1),--自增标识,学号

[StuName] NVARCHAR(30),--姓名

[Sex] NVARCHAR(30),--性别

[Age] CHAR(2)--年龄)

GO

INSERT INTO [Student]

SELECT'张三','男', 80 UNION

SELECT'李四','女', 75

两表的数据如下图:

2、通过CASE…WHEN 语句和GROUP BY…聚合函数来实现行转列

SELECT

StuNo AS'学号',

MAX(CASE Subject WHEN'语文'THEN Score ELSE 0 END)AS'语文',

MAX(CASE Subject WHEN'数学'THEN Score ELSE 0 END)AS'数学',

MAX(CASE Subject WHEN'英语'THEN Score ELSE 0 END)AS'英语',

MAX(CASE Subject WHEN'生物'THEN Score ELSE 0 END)AS'生物',

SUM(Score)AS'总分',

AVG(Score)AS'平均分'

FROM dbo.[Scores]

GROUP BY StuNo

ORDER BY StuNo ASC

结果如下图:

3、通过JOIN…ON 实现两表联接,显示出学生姓名

SELECT

MAX(StuNo)AS'学号',

StuName AS'姓名',

MAX(CASE Subject WHEN'语文'THEN Score ELSE 0 END)AS'语文',

MAX(CASE Subject WHEN'数学'THEN Score ELSE 0 END)AS'数学',

MAX(CASE Subject WHEN'英语'THEN Score ELSE 0 END)AS'英语',

MAX(CASE Subject WHEN'生物'THEN Score ELSE 0 END)AS'生物',

SUM(Score)AS'总分',

AVG(Score)AS'平均分'

FROM dbo.[Scores] A join [Student] B on(A.StuNo=B.ID)

GROUP BY StuName

ORDER BY StuName ASC

结果如下图:

4、通过PIVOT 实现行转列

SELECT

StuNo AS'学号',

StuName AS'姓名',

AVG(语文)AS'语文',

AVG(数学)AS'数学',

AVG(英语)AS'英语',

AVG(生物)AS'生物'

FROM [Scores]

PIVOT(

AVG(Score)FOR Subject IN

(语文,数学,英语,生物)

)AS NewScores

JOIN [Student] ON(NewScores.StuNo=Student.ID) GROUP BY NewScores.StuNo,StuName

ORDER BY StuName ASC

结果如下图:

二、T-SQL列转行

1、创建数据表并插入4 条数据

CREATE TABLE [StudentScores] (

[ID] INT IDENTITY(1,1),--自增标识

[StuNo] INT,--学号

[Chinese] NVARCHAR(30),--语文

[Mathematics] NVARCHAR(30), --数学

[English] NVARCHAR(30),--英语

[Biology] NVARCHAR(30) --生物)

GO

INSERT INTO [StudentScores]

SELECT 100, 80, 85, 75, 80 UNION

SELECT 101, 90, 80, 70, 75 UNION

SELECT 102, 95, 90, 80, 70 UNION

SELECT 103, 60, 70, 80, 85

数据如下图:

2、通过UNION ALL…MAX 实现列转行

SELECT StuNo,'Chinese'AS Subject,

MAX(Chinese)AS'Score'

FROM [StudentScores]

GROUP BY [StuNo]

UNION ALL

SELECT StuNo,'Mathematics'AS Subject, MAX(Mathematics)AS'Score' FROM [StudentScores]

GROUP BY [StuNo]

UNION ALL

SELECT StuNo,'English'AS Subject,

MAX(English)AS'Score'

FROM [StudentScores]

GROUP BY [StuNo]

UNION ALL

SELECT StuNo,'Biology'AS Subject,

MAX(Biology)AS'Score'

FROM [StudentScores]

GROUP BY [StuNo]

结果如下图:

3、用UNPIVOT 实现列转行

SELECT StuNo, Subject, Score

FROM [StudentScores]

UNPIVOT

(

Score FOR Subject IN

([Chinese], [Mathematics], [English], [Biology]) )AS NewStudentScores

三、T-SQL 分页

1、创建数据库并插入40000 条数据

CREATE TABLE [Pagin] (

[ID] INT IDENTITY(1,1),--自增标识

[Number] INT,--编号

[Type] NVARCHAR(30),--类型

[Count] INT--数量

)

GO

declare @i int

set @i = 0

while(@i<10000)

begin

INSERT INTO [Pagin] SELECT 10000+@i,'A类', 80+@i%5

INSERT INTO [Pagin] SELECT 10000+@i,'B类', 60+@i%10

INSERT INTO [Pagin] SELECT 10000+@i,'C类', 70+@i%8

INSERT INTO [Pagin] SELECT 10000+@i,'D类', 90+@i%3

set @i = @i + 1

end

2、通过TOP 实现分页

方案一:两次TOP 实现,原型如下

SELECT*FROM(

SELECT TOP 5 *FROM(

SELECT TOP 25 *FROM [Pagin] WHERE ID>0 ORDER BY ID ASC )AS TEMPTABLE1 ORDER BY ID DESC

)AS TEMPTABLE2 ORDER BY ID ASC

SELECT TOP 5 *FROM(

SELECT TOP 25 *FROM [Pagin] WHERE ID>0 ORDER BY ID ASC

)AS TEMPTABLE1 ORDER BY ID DESC

说明:第一个 TOP 表示页面容量,第二个 TOP 表示页面容量*当前页码数。

弊病:1、强制排序,否则不能分页,虽然目前基本上查询表都要排序。

2、排序字段不能有空值即null,否则分页结果不符实际情况。

3、多次order by 速度会快吗,有待我进一步大数据量测试。

方案二:两次TOP 基于NOT IN 实现,原型如下

select top 5 *from [Pagin]

where ID not in(select top 25 ID from [Pagin] order by ID)

order by ID

说明:第一个 TOP 表示页面容量,第二个 TOP 表示页面容量*当前页码数。

弊病:1、强制排序。

2、排序列必须是唯一列,否则分页情况不符实际。

3、使用not in,速度慢。

方案三:两次TOP 基于MAX 或MIN 实现,原型如下

select top 5 *from [Pagin]

where ID >(select max(p.ID)from(select top25 ID from[Pagin] order by id)as p)

order by ID

说明:第一个 TOP 表示页面容量,第二个 TOP 表示页面容量*当前页码数。

弊病:1、强制排序。

2、排序列必须是唯一列,否则分页情况不符实际。

最后总结:在sqlserver 分页中,第二第三种方案基本上是淘汰掉的,因为现在基本上什么表都是根据添加时间来排序,所以那两种方案没有用,真亏作者也敢发布出来,只有第一种方案还是稍微能用一下,但还是要复杂的拼sql 语句,不方便,要通用于所有表有点难度,象oracle 就很方便了,基于rownum ,传入一个sql 查询语句,这个查询语句爱怎么写就怎么写,反正保证它得到一个结果集就行,不像sqlserver又是要求唯一健又是要求必须排序,把一个结果集颠来倒去,不慢才怪呢。

方案一的简单存储过程如下:

CREATE PROCEDURE proc_page

@pageIndex INT= 0,--页索引

@pageSize INT= 10,--页大小

@recordCount INT= 0 OUTPUT,--返回纪录总数

@pageCount INT= 0 OUTPUT--返回页总数

AS

DECLARE @sql NVARCHAR(1300)--主sql语句

--得到记录总数--

BEGIN

DECLARE @recordTotal INT

SET@sql =N'SELECT @recordTotal=COUNT(ID) FROM [Pagin] WHERE ID>0'

EXEC SP_EXECUTESQL @sql,N'@recordTotal INT

OUTPUT',@recordTotal OUTPUT--@recordTotal = @recordCount OUTPUT SET @recordCount = @recordTotal

END

--计算页总数--

IF(@recordCount%@pageSize=0)--如果记录总数除以页大小的余数为零SET @pageCount = @recordCount/@pageSize

ELSE--如果记录总数除以页大小的余数不为零

SET @pageCount = @recordCount/@pageSize + 1

--根据页索引执行分页查询--

IF(@pageIndex<=1 OR @pageIndex>@pageCount)--如果是第一页,或者该页不存在,则默认也索引为1,即第一页

BEGIN

SET @pageIndex = 1

SET@sql ='SELECT TOP '+STR(@pageSize)+' * FROM [Pagin] WHERE ID>0 ORDER BY ID ASC'

EXEC SP_EXECUTESQL @sql

END

ELSE--如果不是第一页,即其它页

BEGIN

SET@sql ='SELECT * FROM (SELECT TOP '+STR(@pageSize)+' * FROM (SELECT TOP '+STR(@pageSize*@pageIndex)+' * FROM [Pagin] WHERE ID>0 ORDER BY ID ASC) AS TB1 ORDER BY ID DESC) AS TB2 ORDER BY ID ASC' EXEC SP_EXECUTESQL @sql

END

PRINT @sql--打印SQL 语句

GO

--测试

DECLARE @recordCount INT,@pageCount INT

EXEC proc_page 0,5,@recordCount OUTPUT,@pageCount OUTPUT

PRINT @recordCount

PRINT @pageCount

注意:该存储过程是扩展的,还可以改为万能分页存储过程,只需再加上一些参数,再改改就好了。

存储过程的典型例子

可能有不少朋友使用SQL SERVER做开发也已经有段日子,但还没有或者很少在项目中使用存储过程,或许有些朋友认为根本没有必要使用存储过程等等。其实当你一个项目做完到了维护阶段时,就会发现存储过程给我们带来了好处了,修改方便,不能去改我们的应用程序,只需要改存储过程的内容,而且还可以使我们的程序速度得到提高。 QUOTE: SQL SERVER 联机丛书中的定义: 存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。 可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。 也可以创建在 Microsoft SQL Server 启动时自动运行的存储过程。 要使用存储过程,首先我们必需熟悉一些基本的T-SQL语句,因为存储过程是由于一组T-SQL语句构成的,并且,我们需要了解一些关于函数、过程的概念,因为我们需要在应用程序中调用存储过程,就像我们调用应用程序的函数一样,不过调用的方法有些不同。 下面我们来看一下存储过程的建立和使用方法。 一、创建存储过程 和数据表一样,在使用之前我们需要创建存储过程,它的简明语法是: QUOTE: CREATE PROC 存储过程名称 [参数列表(多个以“,”分隔)] AS SQL 语句 例: QUOTE: CREATE PROC upGetUserName @intUserId INT, @ostrUserName NVARCHAR(20) OUTPUT -- 要输出的参数 AS BEGIN -- 将uName的值赋给 @ostrUserName 变量,即要输出的参数 SELECT @ostrUserName=uName FROM uUser WHERE uId=@intUserId END 其中 CREATE PROC 语句(完整语句为CREATE PROCEDURE)的意思就是告诉SQL SERVER,

数据库分页SQL语句

数据库分页SQL语句 博客分类: 数据库 数据库分页语句 SQL Server --------------------------------------------------------------------------------- 从数据库表中的第M条记录开始取N条记录,利用Top关键字:注意如果Select语句中既有top,又有order by,则是从排序好的结果集中选择: SELECT * FROM ( SELECT Top N * FROM (SELECT Top (M + N - 1) * FROM 表名称 Order by 主键 desc) t1 ) t2 Order by 主键 asc 例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下: SELECT * FROM ( SELECT TOP 20 * FROM (SELECT TOP 29 * FROM Sys_option order by sys_id desc) t1) t2 Order by sys_id asc Oralce数据库 -------------------------------------------------------------------------------- 从数据库表中第M条记录开始检索N条记录 SELECT * FROM (SELECT ROWNUM r,t1.* From 表名称 t1 where rownum < M + N) t2 where t2.r >= M 例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下: SELECT * FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum < 30 ) t2 Where t2.R >= 10 如果你对Oracle数据库分页不是很熟悉的话,本页后面有专门对Oracle分页技术的讲解。 My sql数据库 --------------------------------------------------------------------------------------------- My sql数据库最简单,是利用mysql的LIMIT函数,LIMIT [offset,] rows从数据库表中M条记录开始检索N条记录的语句为:

软件工程师实习心得体会及收获【完整版】

软件工程师实习心得体会及收获 ----WORD文档,下载后可编辑修改复制---- Ctrl+D收藏本站,我们将第一时间为大家提供更多关于2019年实习报告的信息,敬请期待! 点击查看:实习报告网 相关推荐:实习报告范文| 实习报告模板| 会计实习报告 | 大学生实习报告 | 顶岗实习报告 | 金工实习报告 | 毕业实习报告 | 土木工程实习报告 | 生产实习报告 |实习周记 | 3000字范文 软件工程师实习心得体会及收获 2019年11月下旬,我离开了学校,进入了最后一学期的顶岗实习阶段。从离开学校的那天起,我就当自己是一个正式的员工,做好了经历重重困难的准备,我始终坚信,我的努力与坚持不懈不会白费,我的未来不是梦。 一、实习单位介绍: 南京智风多媒体有限公司是我现在实习的单位,它成立于1998年,是从事教育软件、数字化教学资源、多媒体产品等开发、制作的专业公司;是江苏省信息产业厅认定的双软企业、江苏省新闻出版局审核认定的电子出版物开发制作单位。公司长期承担高校及教育管理部门的数字化教学资源、教务教学、实验科研等管理系统的开发和信息化项目建设。如:《数字化教学资源库-名师名课网系统》、《OA办公系统》等多个系统平台。智风公司多年来致力于网络课程的建设服务工

作,拥有一支专业化的开发团队,通过严格的开发流程和创新的教学理念为广大院校提供优质的服务。专业化的研发队伍:从教学设计、技术开发,到交互设计、视觉设计、资源素材制作等各个方面,全面解决您的后顾之忧;丰富的开发经验:业已开发的课程中有42门被评为精品课程,累计开发的网络课程已逾1000门。 二、实习岗位、主要过程、主要内容、主要工作、收获 我在该公司任职软件开发工程师,刚实习的第一个星期,主要的工作是熟悉公司的开发框架及开发流程,及时完成项目经理派发的任务。从第二个星期开始,我就开始接触公司的开发项目。令我印象最深、体会也最深的一个项目是《南京大学110周年校庆系统》。该项目不仅开发时间短(只有一个月的时间),最主要的是需求不清。在客户与公司的双重压力下,我们这组人(共5人)在与客户只沟通了两次的需求下,我们就开始动工。该项目的用户主要分为校领导和嘉宾。针对校领导和嘉宾进行相应的车辆、餐厅、宾馆、会场、时间、志愿者的安排,要有冲突提示功能。如:在一个重叠的时间段内,一个人不能同时参加两项及以上活动;一辆车安排的人数不能超过他的承载数等等。在做这些功能的时候,我们有过以人为基础,分配车辆、餐厅等资源,也有考虑过以资源为主,分配人员等种种意见。在每一次意见有了分歧以后,我们都要讨论,各抒己见。这种方式使我乐于表达自己的想法,当我的想法得到了其他同事的认可时,那种感觉无法用言语来表达。即使是自己的想法错了,但听到同事的另一番看法,使我茅塞顿开,也有了收获的喜悦。由于项目太紧,我们经常加班,每

T-SQL 经典行专列、列转行,分页及存储过程

T-SQL 经典编程 说明:本实例是以SQL Server 2005 为运行环境的。 准备工作:创建一个名为DB 的数据库(CREATE DATABASE DB)。 一、T-SQL 行转列 1、创建如下表 CREATE TABLE [Scores] ( [ID] INT IDENTITY(1,1),--自增标识 [StuNo] INT,--学号 [Subject] NVARCHAR(30),--科目 [Score] FLOAT--成绩 ) GO INSERT INTO [Scores] SELECT 100,'语文', 80 UNION SELECT 100,'数学', 75 UNION SELECT 100,'英语', 70 UNION SELECT 100,'生物', 85 UNION SELECT 101,'语文', 80 UNION SELECT 101,'数学', 90 UNION SELECT 101,'英语', 70 UNION SELECT 101,'生物', 85 CREATE TABLE [Student] ( [ID] INT IDENTITY(100,1),--自增标识,学号 [StuName] NVARCHAR(30),--姓名 [Sex] NVARCHAR(30),--性别 [Age] CHAR(2)--年龄) GO INSERT INTO [Student] SELECT'张三','男', 80 UNION SELECT'李四','女', 75 两表的数据如下图:

2、通过CASE…WHEN 语句和GROUP BY…聚合函数来实现行转列 SELECT StuNo AS'学号', MAX(CASE Subject WHEN'语文'THEN Score ELSE 0 END)AS'语文', MAX(CASE Subject WHEN'数学'THEN Score ELSE 0 END)AS'数学', MAX(CASE Subject WHEN'英语'THEN Score ELSE 0 END)AS'英语', MAX(CASE Subject WHEN'生物'THEN Score ELSE 0 END)AS'生物', SUM(Score)AS'总分', AVG(Score)AS'平均分' FROM dbo.[Scores] GROUP BY StuNo ORDER BY StuNo ASC 结果如下图: 3、通过JOIN…ON 实现两表联接,显示出学生姓名 SELECT MAX(StuNo)AS'学号', StuName AS'姓名', MAX(CASE Subject WHEN'语文'THEN Score ELSE 0 END)AS'语文', MAX(CASE Subject WHEN'数学'THEN Score ELSE 0 END)AS'数学', MAX(CASE Subject WHEN'英语'THEN Score ELSE 0 END)AS'英语', MAX(CASE Subject WHEN'生物'THEN Score ELSE 0 END)AS'生物', SUM(Score)AS'总分', AVG(Score)AS'平均分' FROM dbo.[Scores] A join [Student] B on(A.StuNo=B.ID)

如何实现GridView的手动分页

如何实现GridView的手动分页 我们可以这样做。先要在Html界面中GridView中增加AllowPaging="True"接着做下面的 //在page_load事件中将GridView绑定数据库 protected void Page_Load(object sender, EventArgs e) { string sqlstr=select * from TABLE; sqlconnection conn=new sqlconnection("数据库连接字串"); DataSet mydataset = new DataSet(); SqlDataAdapter myds = new SqlDataAdapter(); myds.SelectCommand = new SqlCommand(sqlstr, conn); myds.Fill(mydataset); this.GridView1.DataSource = mydataset; mydataset.Dispose(); myds.Dispose(); conn.Close(); conn.Dispose(); GridView1.DataBind(); } //GridView有一个PageIndexChanging事件 protected void GridView1_PageIndexChanging(object sender, GridViewPag eEventArgs e) { GridView1.PageIndex = e.NewPageIndex; GridView1.DataBind(); } 这样就可以实现啦! 要使用手动分页前提是GridView没有使用数据源控件(sqldatasource.....)的时候。 请教GridView的手动分页如何实现?谢谢! 请教GridView的手动分页(自定义分页)如何实现? 比如已知有10000条数据,我要GridView的分页功能来显示数据,但是自动分页功能需要每次都取出全部的10000条数据,这样效率不高, 所以就要求只用设置GridView的分页数如1000页(每页10知),当选择第n页时才从数据库中取出对应的数据,请问怎样实现? 谢谢! https://www.360docs.net/doc/2d9726184.html,结合存储过程写的通用搜索分页程序

oracle千万级数据分页存储过程优化

oracle千万级数据分页存储过程优化 随着数据量的增加,Oracle数据库分页存储过程(使用rownum分页)查询性能越来越差,查询时间也越来越长,于是优化势在必行,结合用户一般使用特点(一般看前几页的较多),于是以此为切入点优化原先的存储过程,在WHERE条件中增加rownum<=pageindex*pageSize,减少首次过滤的数据量,调整后的存储过程如下:CREATE OR REPLACE PACKAGE DotNet is TYPE type_cur IS REF CURSOR; --定义游标变量用于返回记录集 PROCEDURE DotNetPagination_New(Pindex in number, --分页索引 Psql in varchar2, --产生dataset的sql语句 Psize in number, --页面大小 v_cur out type_cur --返回当前页数据记录 ); procedure DotNetPageRecordsCount_New(Psqlcount in varchar2, --产生dataset的sql语句

Prcount out number --返回记录总数 ); end DotNet_New; CREATE OR REPLACE PACKAGE BODY DotNet is PROCEDURE DotNetPagination(Pindex in number, Psql in varchar2, Psize in number, v_cur out type_cur) AS v_sql VARCHAR2(4000); v_count number; v_Plow number; v_Phei number; v_Appsql varchar2(1000); Begin v_Phei := Pindex * Psize + Psize; v_Plow := v_Phei - Psize + 1; --优化的地方-------------- v_Appsql := ''; if (Pindex < 1000) then v_Appsql := ' and rownum <= ' || v_Phei; end if;

条件分支结构、循环控制结构和存储过程--分页存储过程oracle

条件分支结构、循环控制结构和存储过程--分页存储过程oracle 条件分支结构案例 1、编写一个过程,可以输入一个雇员姓名,如果该雇员的工资低于2000,就给该雇员工资增加10%。 /* 结构: IF 条件THEN 执行语句; END IF; */ CREATE OR REPLACE PROCEDURE add_sal_prc(p_name IN VARCHAR2) IS n_sal myemp.sal%TYPE; BEGIN SELECT sal INTO n_sal FROM myemp WHERE ename = p_name; IF n_sal < 2000 THEN UPDATE myemp SET sal = sal * (1 + 0.1) WHERE ename = p_name; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.put_line('未找到相关信息.'); END add_sal_prc; / 2、编写一个过程,在myemp表中,如果某个雇员的工资低于2000,就给该雇员工资增加10%。 CREATE OR REPLACE PROCEDURE update_myemp_sal_prc IS CURSOR c_test IS SELECT * FROM myemp FOR UPDATE; BEGIN FOR var_data IN c_test LOOP IF var_data.sal < 2000 THEN UPDATE myemp SET sal = sal * 1.1 WHERE CURRENT OF c_test; END IF; END LOOP; EXCEPTION

(完整版)SQLSERVER存储过程大总结

SQLSERVER存储过程使用说明书 引言 首先介绍一下什么是存储过程:存储过程就是将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,并且这样的语句是放在数据库中的,还可以根据条件执行不同SQL语句,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。 请大家先看一个小例子: create proc query_book as select * from book go --调用存储过程 exec query_book 请大家来了解一下存储过程的语法。 Create PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS sql_statement [ ...n ] 一、参数简介 1、procedure_name 新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。 要创建局部临时过程,可以在 procedure_name 前面加一个编号 符 (#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加两

个编号符 (##procedure_name)。完整的名称(包括 # 或 ##)不能超过 128 个字符。指定过程所有者的名称是可选的。 2、;number 是可选的整数,用来对同名的过程分组,以便用一条 Drop PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。Drop PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应 在 procedure_name 前后使用适当的定界符。 3、@parameter 过程中的参数。在 Create PROCEDURE 语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2100 个参数。 使用@符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。 4、data_type 参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。 说明:对于可以是cursor 数据类型的输出参数,没有最大数目的限制。 5、VARYING 指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。 6、default 参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。 7、OUTPUT

经过优化测试的SQL分页存储过程

经过优化测试的SQL分页存储过程 2009-10-24 23:20 建立一个 Web 应用,分页浏览功能必不可少。这个问题是数据库处理中十分常见的问题。经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页。但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存中,很费内存。游标一建立,就将相关的记录锁住,直到取消游标。游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作。而对于多表和大表中定义的游标(大的数据集合)循环很容易使程序进入一个漫长的等待甚至死机。 更重要的是,对于非常大的数据模型而言,分页检索时,如果按照传统的每次都加载整个数据源的方法是非常浪费资源的。现在流行的分页方法一般是检索页面大小的块区的数据,而非检索所有的数据,然后单步执行当前行。 最早较好地实现这种根据页面大小和页码来提取数据的方法大概就是“俄罗斯存储过程”。这个存储过程用了游标,由于游标的局限性,所以这个方法并没有得到大家的普遍认可。 后来,网上有人改造了此存储过程,下面的存储过程就是结合我们的办公自动化实例写的分页存储过程: CREATE procedure pagination1 (@pagesize int, --页面大小,如每页存储20条记录 @pageindex int --当前页码 ) as set nocount on begin declare @indextable table(id int identity(1,1),nid int) --定义表变量declare @PageLowerBound int --定义此页的底码 declare @PageUpperBound int --定义此页的顶码 set @PageLowerBound=(@pageindex-1)*@pagesize set @PageUpperBound=@PageLowerBound+@pagesize set rowcount @PageUpperBound insert into @indextable(nid) select gid from TGongwen where fariqi >dateadd(day,-365,getdate()) order by fariqi desc select O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwen O,@indextable t where O.gid=t.nid and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id end set nocount off

C++调用SQL存储过程实例

c/c++调用mysql存储过程 mysql5.0以后就支持存储过程了,目前mysql的6.0Alpha版也已经推出。6.0不仅支持大型数据库如oracle等的绝大部分功能,如存储过程、视图、触发器、job等等,而且修正了这些功能所存在的bug,其中6.0.1还支持64位windows,以及表空间。 在c/c++中访问mysql,常见的只是一些简单的业务,使用c中嵌入简单的查询、插入、更新等操作即可。随着业务的复杂化,完成一个业务功能需要非常多的sql操作环节,把这些语句都嵌入c代码中会导致c代码越来越繁琐、不清晰,这时候,自然就想到了存储过程来封装所有的数据库逻辑,通过c简单调用mysql存储过程接口即可达到目的,极大地减轻了c程序员的工作量,也便于前端业务处理逻辑与数据库处理逻辑的分离。下面就介绍c 语言调用存储过程的简单的方法。 1、首先创建一张表 用于存放用户信息 Create table student( id int auto_increment, name varchar(20), age tinyint, remark varchar(50), primary key(id) ); 2、插入几条信息 Insert into student values(1,"zhouys",90, ""); commit; 3、查看用户信息 mysql> select * from student;

+------+-----------+------+----------+ | id | name | age | remark | +------+-----------+------+----------+ | 1 | zhouys | 90 | | +------+-----------+------+-----------+ 1 row in set (0.00 sec) mysql> 4、创建存储过程 如下: delimiter // create procedure querystudent( in in_id int , #0-字符id 1-数字id # out out_ret int, #返回结果 out out_name varchar(20), #名字 out out_age int #年龄) label_a:begin declare v_name varchar(20) ; declare v_age tinyint ; #参数判断 if (in_id<=0) then set out_ret=-1; #id error

存储过程的实例

存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。 --------------------基本语法-------------------- 一.创建存储过程 create procedure sp_name() begin ......... end 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递 三.删除存储过程 1.基本语法: drop procedure sp_name// 2.注意事项 (1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 四.其他常用命令 1.show procedure status 显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等2.show create procedure sp_name 显示某一个mysql存储过程的详细信息 --------------------数据类型及运算符-------------------- 一、基本数据类型: 略 二、变量: 自定义变量:DECLARE a INT ; SET a=100; 可用以下语句代替:DECLARE a INT DEFAULT 100; 变量分为用户变量和系统变量,系统变量又分为会话和全局级变量 用户变量:用户变量名一般以@开头,滥用用户变量会导致程序难以理解及管理 1、在mysql客户端使用用户变量 mysql> SELECT 'Hello World' into @x; mysql> SELECT @x; mysql> SET @y='Goodbye Cruel World'; mysql> select @y; mysql> SET @z=1+2+3; mysql> select @z; 2、在存储过程中使用用户变量 mysql> CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World'); mysql> SET @greeting='Hello'; mysql> CALL GreetWorld( );

123常用存储过程集锦

常用存储过程集锦,都是一些mssql常用的一些,大家可以根据需要选择使用。 =================分页========================== /*分页查找数据*/ CREATE PROCEDURE [dbo].[GetRecordSet] @strSql varchar(8000),--查询sql,如select * from [user] @PageIndex int,--查询当页号 @PageSize int--每页显示记录 AS set nocount on declare @p1 int declare @currentPage int set @currentPage = 0 declare @RowCount int set @RowCount = 0 declare @PageCount int set @PageCount = 0 exec sp_cursoropen @p1 output,@strSql,@scrollopt=1,@ccopt=1,@rowcount=@r owCount output --得到总记录数 select @PageCount=ceiling(1.0*@rowCount/@pagesize) --得到总页数 ,@currentPage=(@PageIndex-1)*@PageSize+1 select @RowCount,@PageCount exec sp_cursorfetch @p1,16,@currentPage,@PageSize exec sp_cursorclose @p1 set nocount off GO =========================用户注册 ============================ /* 用户注册,也算是添加吧 */ Create proc [dbo].[UserAdd] ( @loginID nvarchar(50), --登录帐号 @password nvarchar(50), --密码 @email nvarchar(200) --电子信箱

sql存储过程及视图创建实例及语法

SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。 ?存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。 1、存储过程的优点 A、存储过程允许标准组件式编程 存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。 B、存储过程能够实现较快的执行速度 如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。 C、存储过程减轻网络流量 对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。 D、存储过程可被作为一种安全机制来充分利用 系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。 ?系统存储过程 系统存储过程是系统创建的存储过程,目的在于能够方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程主要存储在master数据库中,以“sp”下划线开头的存储过程。尽管这些系统存储过程在master数据库中,但我们在其他数据库还是可以调用系统存储过程。有一些系统存储过程会在创建新的数据库的时候被自动创建在当前数据库中。 常用系统存储过程有: exec sp_databases; --查看数据库 exec sp_tables; --查看表 exec sp_columns student;--查看列

SQLSERVER 存储过程 【教程】

理论知识:开始 一、TRUNCATE 快速地从一堆表中删除所有行。它和在每个表上进行无条件的DELETE 有同样的效果,不过因为它不做表扫描,因而快得多。在大表上最有用。 二、Select INTO 建表 把一个表中的数据复制到另外一个表中。 三、Insert INTO Select 四、补充:临时表 临时表存储在系统数据库tempdb中 临时表会被系统隐式地丢弃 五、存储过程(**) 一、简介: 存储过程(Stored Procedure),是一组为了完成特定功能的SQL 语句,集经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数,如果该存储过程带有参数来执行它, 在SQL Server 的系列版本中,存储过程分为两类:系统提供的存储过程和用户自定义存储过程。 系统SP,主要存储master 数据库中,并以sp_为前缀并且系统存储过程主要是从系统表中获取信息,从而为系统管理员管理SQL Server。用户自定义存储过程是由用户创建,并能完成某一特定功能,如:查询用户所需数据信息的存储过程。 存储过程具有以下优点: 1.存储过程允许标准组件式编程(模块化设计) 存储过程在被创建以后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句,而且数据库专业人员可随时对存储过程进行修改,但对应用程序源代码毫无影响。因为应用程序源代码只包含存储过程的调用语句,从而极大地提高了程序的可移植性。 2.存储过程能够实现快速的执行速度 如果某一操作包含大量的Transaction-SQL 代码,,或分别被多次执行,那么存储过程要比批处理的执行速度快很多,因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析优化,并给出最终被存在系统表中的执行计划,而批处理的Transaction-SQL 语句在每次运行时都要进行编译和优化,因此速度相对要慢一些。 3.存储过程能够减少网络流量 对于同一个针对数据数据库对象的操作,如查询修改,如果这一操作所涉及到的Transaction-SQL 语句被组织成一存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,否则将是多条SQL 语句从而大大增加了网络流量降低网络负载。 4.存储过程可被作为一种安全机制来充分利用系统管理员通过,对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限制。

asp调用mssql存储过程之完全示例.

?asp调用mssql存储过程之完全示例 可能有不少朋友使用SQL SERVER做开发也已经有段日子,但还没有或者很少在项目中使用存储过程,或许有些朋友认为根本没有必要使用存储过程等等。其实当你一个项目做完到了维护阶段时,就会发现存储过程给我们带来了好处了,修改方便,不能去改我们的应用程序,只需要改存储过程的内容,而且还可以使我们的程序速度得到提高。 SQL SERVER 联机丛书中的定义: 存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。 可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。 也可以创建在 Microsoft SQL Server 启动时自动运行的存储过程。 要使用存储过程,首先我们必需熟悉一些基本的T-SQL语句,因为存储过程是由于一组T-SQL语句构成的,并且,我们需要了解一些关于函数、过程的概念,因为我们需要在应用程序中调用存储过程,就像我们调用应用程序的函数一样,不过调用的方法有些不同。 下面我们来看一下存储过程的建立和使用方法。 一、创建存储过程 和数据表一样,在使用之前我们需要创建存储过程,它的简明语法是:

例: 以下是引用片段: CREATE PROC upGetUserName @intUserId INT, @ostrUserName NVARCHAR(20 OUTPUT -- 要输出的参数AS BEGIN -- 将uName的值赋给@ostrUserName 变量,即要输出的参数 SELECT @ostrUserName=uName FROM uUser WHERE uId=@intUserId END 其中 CREATE PROC 语句(完整语句为CREATE PROCEDURE)的意思就是告诉SQL SERVER,现在需要建立一个存储过程,upGetUserName 就是存储过程名称,@intUserId 和 @ostrUserName 分别是该存储过程的两个参数,注意,在SQL SERVER中,所有用户定义的变量都以“@”开头,OUTPUT关键字表示这个参数是用来输出的,AS之后就是存储过程内容了。只要将以上代码在“查询分析器”里执行一次,SQL SERVER就会在当前数据库中创建一个名为“upGetUserName”的存储过程。你可以打开“企业管理器”,选择当前操作的数据库,然后在左边的树型列表中选择“存储过程”,此时就可以在右边的列表中看到你刚刚创建的存储过程了(如果没有,刷新一下即可)。 二、存储过程的调用

存储过程写法

存储过程的定义和使用 一、启动SQL查询分析器 通过菜单[新建查询],启动SQL查询分析器。 系统将打开“连接到服务器”窗口 ?在服务器名称(指定SQL Server服务器)栏中,可选择需要连接的SQL Server服务器。 ?在身份验证中,可选择登录SQL Server服务器的验证方式。 如果实验用机的SQL Server安装时设定了混合验证方式,则“SQL Server 身份验证”方式可选。选择该方式,其登录名默认为:sa,密码默认是: 空。 点击按钮“确认”,SQL查询分析器将连接到指定的SQL Server服务器,并打开SQL查询分析器的界面 SQL查询分析器的界面:

SQL语句作用 的当前数据库 SQL语句输入窗口 对象浏览窗口 ?左侧窗口是“对象浏览器”窗口; ?右侧窗口是SQL语句的输入和调试窗口,可在该窗口中直接输入SQL语 句或打开一个SQL脚本文件(后缀名为*.sql的文件); ?上方的数据库列表显示了当前SQL语句作用的数据库。 二、创建数据库 使用SQL语句创建实验数据库SCMIS,并创建3张表:STUDENT、COURSE和SC,输入数据。 以下内容均使用SQL语句在SQL查询分析器中执行运行。 (a)在SQL SERVER2012中,在查询分析器中使用T-SQL语句: CREATE DATABASE SCMIS ON (NAME='SCMIS', FILENAME='E:\SCMIS.MDF', SIZE=10MB, MAXSIZE=50MB, FILEGROWTH=5%) LOG ON (NAME='SCMIS_Log', FILENAME='e:\SCMIS_Log.ldf', SIZE=2MB, MAXSIZE=5MB, FILEGROWTH=1MB)

SQL存储过程实例(练习和答案)

题目1 1、学校图书馆借书信息管理系统建立三个表: 学生信息表:student 图书表:book 借书信息表:borrow 请编写SQL语句完成以下的功能: 1)查询“计算机”专业学生在“2007-12-15”至“2008-1-8”时间段内借书的学生编号、 学生名称、图书编号、图书名称、借出日期;参考查询结果如下图所示: 2)查询所有借过图书的学生编号、学生名称、专业;参考查询结果如下图所示:

3)查询借过作者为“安意如”的图书的学生姓名、图书名称、借出日期、归还日期; 参考查询结果如下图所示: 4)查询目前借书但未归还图书的学生名称及未还图书数量;参考查询结果如下图所 示: 附加:建表语句:

标准答案:

题目2 程序员工资表:ProWage 创建一个存储过程,对程序员的工资进行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,给所有人加薪,每次加100,再进行分析,直到有一半以上的人大于2000元为止,存储过程执行完后,最终加了多少钱? 例如:如果有百分之五十的人薪水不到2000,给所有人加薪,每次加100元,直到有一半以上的人工资大于2000元,调用存储过程测试。 请编写T-SQL来实现如下功能: 1)创建存储过程,查询是否有一半程序员的工资在2200、3000、3500、4000、5000或6000 元之上,如果不到分别每次给每个程序员加薪100元,至之一半程序员的工资达到2200,3000,3500,4000,5000或6000元。

2)创建存储过程,查询程序员平均工资在4500元,如果不到则每个程序员每次加200元, 至到所有程序员平均工资达到4500元。 标准答案:

ASP+SQL+Server带条件查询的分页存储过程及其ASP调用实例

ASP+SQL Server 带条件查询的分页存储过程及其 ASP 调用实例 (该例子已经在环境 IIS+ASP+SQLServer 调试过可用,供 Web 初学者直接试用, 如有问题请及时留言指正) 1。准备 Server SQL 建立数据库表 Diary
数据库表 Diary 建立代码: if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xDiary]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[xDiary] GO CREATE TABLE [dbo].[xDiary] ( [DiaryID] [int] IDENTITY (1, 1) NOT NULL , [DiaryDate] [smalldatetime] NOT NULL , [DiaryName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL , [DiaryInfo] [ntext] COLLATE Chinese_PRC_CI_AS NOT NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO
2.创建记录总集的存储过程 cn_RecordCount
存储过程 Cn_RecordCount 代码: CREATE PROCEDURE [dbo].[cn_RecordCount] --返回记录总集的存储过程 @TableName nvarchar(100), --数据库表名 @strWhere varchar(500), --筛选条件 @count int output --记录集总数 AS declare @sqlStr nvarchar(1000) if @strWhere!='' set @sqlStr=N'select @count=count(*) from ' +@TableName+' where 1=1 '+@strWhere else set @sqlStr=N'select @count=count(*) from '+@TableName exec sp_executesql @sqlstr,N'@count int output',@count output GO
3.分页的存储过程 cn_PageView

相关文档
最新文档