当前位置:文档之家› T-SQL编程扩展知识

T-SQL编程扩展知识

T-SQL编程扩展知识
T-SQL编程扩展知识

T-SQL编程

本章目录

一、课程大纲与内容

二、练习

一、课程大纲与内容

3.1变量

3.1.1局部变量

3.1.2T-SQL参数

3.1.3应用程序变量

3.2输出语句

3.3流程控制语句

3.3.1Begin…End语句

3.3.2If…Else语句

3.3.3While语句

3.3.4Case语句

3.3.5Goto语句

3.3.6Return语句

3.3.7Try…Catch语句

3.3.8Execute语句

3.4常用函数

3.4.1结构和类别

3.4.2聚合函数

3.4.3时间和日期函数

3.4.4数学函数

3.4.5系统函数

3.4.7元数据函数

3.4.8字符串函数

3.4.9配置函数

3.4.10排名函数

3.4.11自定义函数

3.4.12常用函数使用示例

3.5T-SQL综合应用

-------------------------------------------------------------------------------------------3.1变量

3.1.1局部变量

局部变量是批处理和脚本中,可以保存数据值的对象。声明或定义此变量后,批处理中的一个语句可以将此变量设置为一个值,该批处理中后面的语句可以从此变量获取这个值。

例如:

use student;

go

declare@var int;

set@var=1234;

select*from student

where sno=@var;

go

说明:declare@var int,生成了数值型的变量@var。

set@var=1234,对变量进行赋值。

where sno=@var,使用变革进行条件的设置。

3.1.2T-SQL参数

T-SQL参数是用于在存储过程中、执行该存储过程的批处理、脚本直接传递数据的对象。参数可以是输入参数也可以是输出参数。

例如:

use student;

go

create procedure sampleproc@parm int as

select sno,sname

from student

where sno=@parm

go

exec sampleproc@parm=105;

说明:@parm int为存储过程的输入参数。

用exec sampleproc@parm=105执行;结果为105。

3.1.3应用程序变量

应用程序编程语言(如C、C++、Basic和Java)使用变量保存数据。变量是可以保存数据值的存储区域。每一个应用程序变量都有数据类型和大小。数值变量还有精度(变量可以保存的数字位数)和小数位数(小数点右边的数字位数)。为了使应用程序可以处理从Transact-SQL语句返回的数据,它必须具有将Transact-SQL数据移至应用程序变量的机制。数据库API支持绑定概念,即将Transact-SQL语句中的结果集列、参数、返回代码或参数标记绑定到应用程序变量。

为了检索结果集中的数据,应用程序使用与下文所示相似的执行步骤:

(1)执行Transact-SQL语句。

(2)调用数据库API函数以确定结果集中的列数。

(3)对于每个结果集列,应用程序可以:

(a)调用返回列的属性(数据类型大小等)的数据库API函数。

(b)分配应用程序变量,其属性与列的属性兼容。

(c)调用数据库API函数将结果集列绑定或映射到应用程序变量。

(4)使用数据库API函数一次提取一行结果集行。每次提取时,每个结果集列的值均放入该列所绑定的应用程序变量中。

应用程序可以改变此执行步骤。例如,如果应用程序正在对已知表执行硬编码Transact-SQL语句,由于预先知道结果集列的属性,因此应用程序不必调用数据库API来获得这些属性。

3.2输出语句

同C语言的PRINTF()函数一样,T-SQL中也支持输出语句,用于输出显示处理的数据结果。

常用的输出语句有两种,他们的语法分别是:

PRINT局部变量或字符串

SELECT局部变量AS自定义列名

其中,第二种方法就是查询语句的特殊应用。

示例:

PRINT‘服务器的名称’+@@SERVERNAME

SELECT@@SERVERNAME AS‘服务器的名称’

用PRINT方法输出的结果将在消息窗口以文本方式显示,用SELECT方法将在网格窗口以表格方式显示。

由于使用PRINT语句要求单个局部变量或字符串表达式作为参数,所以如果我们这样编写SQL语句将出错:PRINT‘当前错误号’+@@ERROR

因为全局变量@@ERROR返回的是整型数值。那如何解决呢?我们可以使用转换函数,把数值转换成为字符串,如下:

PRINT‘当前错误号’+CONVERT(VARCHAR(5),@@ERROR)

@@ERROR用于便是最近一条SQL语句是否有错,如果有错,将返回非零的值。

@@INDENTITY可用来查询最后插入的标识值。

3.3流程控制语句

3.3.1Begin…End语句

使用begin...end...语句将一组T-SQL语句组成语句组,并作为一个单元运行。begin...end允许嵌套。

示例:

use student;

go

begin transaction;

go

if@@trancount=0

begin

select*from student where sno='105';

rollback transaction;

print N'Rolling back ths transaction two times would cause an error.' end;

rollback transaction;

print N'Rolled back the transaction.'

go

执行结果:Rolled back the transaction.

如果不包括BEGIN…END愉快,将执行两个rollback transaction语句,并返回两条print语句。

3.3.2If…Else语句

If…Else用于指导执行条件。Else关键字可选。If…Else可以嵌套使用,

use student;

declare@ErrorCode int;

if(@ErrorCode<>0)

begin

print'Errors encountered,rolling back.';

print'Last error encountered:'+cast(@ErrorCode as varchar(20));

rollback;

end;

else

begin

print'no errors encountered,committiing.';

commit;

end;

return@ErrorCode;

注意:if后跟的表达式必须为布尔表达式。回滚是指退出到执行前的操作。

3.3.3While语句

While用于设置重复执行sql语句或语句块的条件。只要条件为真就重复执行语句。可以使用break和continue关键字,在循环内部控制while循环中语句的执行。

例如:

use student;

select*from student;

go

while(select avg(column_b)from student)>200

begin

update student set column_b=column_b/2;

select min(column_b)from student;

if(select min(column_b)from student)<100

break;

else

continue;

end;

注意:

(a)如果使用两个或多个while循环,内层的break将退出到下一个外层循环。

(b)While后接的表达式,返回true或false。

(c)Break导致从最内层的while循环中退出,continue是while循环重新开始执行,忽略continue关键字后面的任何语句。

(d)示例中,产品的平均价格大于200,则循环将所有价格除以2,然后显示最低价格。如果价格大于等于100,循环重新开始,并再次将价格除以2,直

至最低价格小于100,才退出while循环。

3.3.4Case语句

Case语句用于计算条件列表,并返回对个可能结果表达式。有两种形式:简单case 函数形式,将一个表达式与一组简单表达式进行比较,以得到结果;case搜索函数形式,计算一组表达式,以得到结果。

示例1:简单case函数形式,检查表达式是否相等

use student;

select*from student;

go

select sname as'学生姓名',N'学号'=

case sno

when'103'then N'陆君的学号'

when'101'then N'李军的学号'

when'105'then N'匡明的学号'

when'108'then N'曾华的学号'

when'107'then N'王丽的学号'

else N'其他人的学号'

end

from student

order by sname;

go

示例2:将数据进行分类。将价格分段归类。

select productNumber as N'产品编号',Name as N'名称',N'价格范围'= case

when listprice=0then N'0元'

when listprice<50then N'50元以下'

when listprice>=50and listprice<250then N'250元以下'

when listprice>=250and listprice<1000then N'1000元以下' else N'1000元以上'

end

from product

order by productname;

go

3.3.5Goto语句

Goto语句将执行流更改到其他位置(标签处),跳过Goto后面的语句,并从标签处开始继续处理。可在过程、批处理或语句块中任何位置使用,但是不能跳转到该批处理以为的的标签。Goto也可以嵌套使用。

use student;

go

declare@table0sysname

declare@count int

set@table0=N'student'

set@count=0;

loop0:

if(@@ERROR=0)

BEGIN

EXEC('SELECT'''+@table0+'''=count(*)from'+@table0)

set@count=@count+1;

print str(@count)+N'执行完成!'

END;

if(@@ERROR=0AND@count<2)goto loop0;

go

说明:使用Goto循环代替了While循环。

3.3.6Return语句

Return语句从查询或过程中无条件退出,可以在任何时候使用,其后面的语句不执行。

示例:显示使用return返回存储过程的参考值,该语句经常在存储过程中使用

--1、创建存储过程

create procedure findjobs@nm sysname=null

as

if@nm is null

begin

print'you must give a user name'

return--2返回

end;

else

begin

select https://www.doczj.com/doc/2313445599.html,,o.id,o.uid

from sysobjects o inner join master.syslogins l

on o.uid=l.uid

where https://www.doczj.com/doc/2313445599.html,=@nm;

end;

--3执行存储过程

exec findjobs;

--4执行存储过程

exec findjobs@nm='sa'

如果执行findjobs时没指定用户名作为参数,则return将使过程向用户屏幕发出消息“you must give a user name”然后退出。

3.3.7Try…Catch语句

try...catch语句在SQL Server2005数据库中是新加入的,它用于实现类似于C#和C++语言中的异常处理的错误处理。T-SQL语句组可以包含在try块中。如果try块内部发生错误,则会将控制传递给catch块中包含的另一个语句组。

示例:在临时性过程中使用try...catch语句,使用select语句生成被零除的错误,该错误会导致跳转至相关的catch块的执行,

例如:

use student;

go

begin try

select1/0;--会产生除错误

end try

begin catch

select

ERROR_NUMBER()AS ErrorNumber,

ERROR_SEVERITY()AS ErrorSeverity,

ERROR_STATE()AS ErrorState,

ERROR_PROCEDURE()AS ErrorProcedure,

ERROR_LINE()AS ErrorLine,

ERROR_MESSAGE()AS ErrorMessage;

end catch;

go

由catch块捕获该错误,并以检索错误消息函数显示相关信息,执行结果如下:

(0行受影响)

ErrorNumber ErrorSeverity ErrorState ErrorProcedure ErrorLine ErrorMessage 8134161NULL2遇到以零作除数

错误。

(1行受影响)

使用try...catch...处理事务,在事务出错时进行回滚,正常执行时提交

use student;

select*from student;

go

begin transaction;

begin try

insert into student values('120','张三','猪','2009-09-09','98833',null)

-–这里的性别中我们首先创建约束只能为‘男’或者‘女’

end try

begin catch

select

ERROR_NUMBER()AS ErrorNumber,

ERROR_SEVERITY()AS ErrorSeverity,

ERROR_STATE()AS ErrorState,

ERROR_PROCEDURE()AS ErrorProcedure,

ERROR_LINE()AS ErrorLine,

ERROR_MESSAGE()AS ErrorMessage;

if@@trancount>0

rollback transaction

end catch;

if@@trancount>0

commit transaction

go

执行结果为:

ErrorNumber ErrorSeverity ErrorState ErrorProcedure ErrorLine ErrorMessage 547160NULL4INSERT语句与

CHECK约束

"CK_STUDENT"

冲突。该冲突发生

于数据库

"student",表

"dbo.STUDENT",

column'SSEX'。

(1行受影响)

3.3.8Execute语句

execute语句执行T-SQL批中的命令字符串、字符串或执行下列模块之一:系统存储

过程,用户定义存储过程,标量值用户定义函数或者扩展存储过程。SQL SERVER2005数据库还提供了扩展的execute语句,可以向链接服务器发送传递命令。

示例:

use student;

go

execute('select*from student');

go

--示例2执行存储过程,带参数

--创建一个存储过程:

USE[student]

GO

/******对象:StoredProcedure[dbo].[sampleproc]脚本日期:01/05/2010 09:34:30******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

create procedure[dbo].[sampleproc]@parm int as

select sno,sname

from student

where sno=@parm

-----------------------执行存储过程-----------------------------------

use student;

go

execute sampleproc105;

go

3.4常用函数

3.4.1结构和类别

函数由两部分组成:函数头和函数体。函数可接受0个或多个输入参数,返回数据值或表。

函数头,也称为标题头,一般包含如下结构:有架构、所有者名称的函数名称;输入参数名称和数据类型;可以用于输入参数的选项;返回参数数据类型和可选名称;返回参数数据类型和可选名称;可以用于返回参数的选项。

函数体,也称为正文,它定义了函数将要执行的操作和逻辑,它包含以下两个部分:执行函数逻辑的一个或多个T-SQL语句;.NET程序集的引用。

根据返回值的类型和是否由系统提供,分为标量函数、表值函数和内置函数。标量函数又分为内联标量函数、多语句标量函数;表值函数又分为内联表值函数、多语句表值函数。

内联标量函数:指用户定义标量函数返回在returns子句中定义的类型的“单个数据值”,函数体是单个T-SQL语句。

多语句标量函数:是多语句的标量函数。定义在BEGIN…END块中的函数体,包含一组返回单个值的T-SQL语句。

内联表值函数:返回table数据类型。没函数主体。

多语句表值函数:函数体中,以在BEGIN…END块中包含一组T-SQL语句。

内置函数:也称系统函数,返回标量数据类型或table数据类型的函数,不能修改。

3.4.2聚合函数

聚合函数只能在以下位置作为表达式使用:select语句的选择列表;compute或compute by子句;having子句。

(1)AVG

函数功能:返回组中值的平均值。空值将被忽略。

语法:AVG([ALL|DISTINCT]expression)

(2)MAX

函数功能:返回表达式的最大值。

语法:MAX([ALL|DISTINCT]expression)

(3)MIN

函数功能:返回表达式的最小值。

语法:MIN([ALL|DISTINCT]expression)

(4)SUM

函数功能:返回表达式中所有值的和,或只返回DISTINCT值。SUM只能用于数字列。空值将被忽略。

语法:SUM([ALL|DISTINCT]expression)

(5)COUNT

函数功能:返回组中项目的数量

语法COUNT({[ALL|DISTINCT]expression]|*})

--首先创建一张示例表

create table test

(

sno int primary key identity(1,1)not null,

age int,

salary float

)

插入一些测试数据:

insert into test values(21,81.5);

insert into test values(22,82.5);

insert into test values(23,83.0);

insert into test values(24,86.5);

insert into test values(25,88.5);

insert into test values(26,87.5);

insert into test values(27,89.5);

insert into test values(28,99.5);

使用AVG函数

select avg(salary)from test;--返回结果为87.3125

使用SUM函数

select sum(salary)from test;--返回结果为698.5

T-SQL提供聚合函数

函数名功能说明

AVG返回组中各值的平均值

CHECKSUM返回按照表的某一行或一组表达式计算出来的校验和值

CHECKSUM_AGG返回组中各值的校验和

COUNT返回组中的项数

COUNT_BIG返回组中的项数

GROUPING包含用于对数据进行分组的表达式

MAX返回表达式中的最大值

MIN返回表达式中的最小值

SUM返回表达式中所有值或仅非重复值的和

STDEV返回指定表达式中所有值的标准方差

STDEVP返回指定表达式中所有值的总体标准方差

VAR返回指定表达式中所有值的方差

VARP返回指定表达式中的所有值的总体方差

3.4.3时间和日期函数

(1)DATEADD

函数功能在向指定日期加上一段时间的基础上,返回新的datetime值。

语法:DATEADD(datepart,number,date)

样例:SELECT DATEADD(day,21,pubdate)AS timeframe FROM titles (2)DATEPART

函数功能返回代表指定日期的指定日期部分的整数

语法:DATEPART(datepart,date)

样例:SELECT DATEPART(month,GETDATE())AS'Month Number'

(3)DAY

函数功能返回代表指定日期的天的日期部分的整数。

语法:DAY(date)

(4)GETDATE

函数功能按datetime值的Microsoft?SQL Server?标准内部格式返回当前系统日期和时间。

语法:GETDATE()

(5)GETUTCDATE

函数功能返回表示当前UTC时间(世界时间坐标或格林尼治标准时间)的datetime 值。当前的UTC时间得自当前的本地时间和运行SQL Server的计算机操作系统中的时区设置。

语法:GETUTCDATE()

(6)MONTH

函数功能返回代表指定日期月份的整数。

语法:MONTH(date)

样例:SELECT"Month Number"=MONTH('03/12/1998')

(7)YEAR

函数功能返回表示指定日期中的年份的整数。

语法:YEAR(date)

3.4.4数学函数

(1)ABS

函数功能返回给定数字表达式的绝对值。

语法:ABS(numeric_expression)

(2)RAND

相关主题
文本预览
相关文档 最新文档