收藏 分销(赏)

第5章 T-SQL程序设计基础.ppt

上传人:s4****5z 文档编号:13990668 上传时间:2026-05-23 格式:PPT 页数:75 大小:1.12MB 下载积分:10 金币
下载 相关 举报
第5章 T-SQL程序设计基础.ppt_第1页
第1页 / 共75页
第5章 T-SQL程序设计基础.ppt_第2页
第2页 / 共75页


点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,5,章,T-SQL,程序设计基础,1.,T-SQL语言分类,2.,数据类型,3.,常量、变量和运算符,4.,函数,5.,批处理和流程控制,5.1 T-SQL,语言分类,T-SQL,语句分为四大类:,数据定义语句:,用来定义和管理数据库以及数据库中的各种对象的语句,这些语句包括,CREATE,、,ALTER,和,DROP,语句。,数据操纵语句:,用来查询、添加、修改和删除数据库中数据的语句,这些语句包括,SELECT,(查询数据)、,INSERT,(插入数据)、,UPDATE,(修改数据)和,DELETE,(删除数据)等。,数据控制语句:,主要包括完整性控制、并发控制和恢复以及安全性控制等功能。,一些附加语句:,是,T-SQL,语言为了编写脚本而增加的语句,包括,变量,、,运算符,、,函数,、,注释语句,、,流程控制,和,事务控制语句,等。,5.2,数据类型,数据类型对应着,SQL Server 2008,系统在内存或磁盘上开辟存储空间的大小,也决定了访问、显示、更新数据的方式。除了支持数值型、字符型、日期型、货币型等,系统提供的数据类型,外,,T-SQL,还支持,用户自定义数据类型,。,5.2.1,系统提供的数据类型,SQL Server 2008,中提供了丰富的数据类型,主要包括二进制、精确数字、近似数字、字符串、日期时间等几大类型。,类别,数据类型,类别,数据类型,类别,数据类型,二进制,字符串,BINARY,VARBINARY,IMAGE,近似数字,FLOAT,REAL,日期时间,DATETIME,DATE SMALLDATETIME,精确数字,BIT,INT,BIGINT,SMALLINT,TINYINT,DECIMAL,NUMERIC,MONEY,SMALLMONEY,字符串,CHAR,VARCHAR,TEXT,NCHAR,NVARCHAR,NTEXT,其它类型,TIMESTAMP,SQL_VARIANT,TABLE,CURSOR,UNIQUEIDENTIFIER,XML,表,5-1 SQL Server2008,系统提供的数据类型,1.,精确数字,整数类型,BIT:,值只能为0或1。如ON/OFF、YES/NO、TRUE/FALSE等,占1字节。,INT:,可以存储从-231231-1范围内的全部整数,占4个字节。,BIGINT:,可以存储-263263-1范围内的全部整数,占8个字节。,SMALLINT:,存储从-215215-1范围内的全部整数,占2个字节。,TINYINT:,可以存储0255之间的所有整数,占1个字节。,1.,精确数字,精确的小数数据类型,精确的小数数据类型包括,DECIMAL,和,NUMERIC,两种类型。这两种数据的取值范围都是从,-10,38,+1,到,10,38,-1,。所占存储空间大小为,2,17,个字节。它们的定义分别格式为:,DECIMAL(p,s),和,NUMERIC(p,s),p,(精度):,最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数。该精度必须是从,1,到最大精度,38,之间的值。默认精度为,18,。,s,(小数位数):,小数点右边可以存储的十进制数字的最大位数。小数位数必须是从,0,到,p,之间的值。仅在指定精度后才可以指定小数位数。默认的小数位数为,0,;因此,,0sp,。最大存储大小基于精度而变化。,1.,精确数字,货币数据类型,货币数据类型专门用于货币数据处理,包括,MONEY,和,SMALLMONEY,两种类型。,MONEY,:,以,money,数据类型存储的货币值的范围从,-263,263-1,,精确到货币单位的,1%,,所占存储空间大小为,8,个字节。,SMALLMONEY,:,以,SMALLMONEY,数据类型存储的货币值介于,-214748.3648,214748.3647,之间,精确到货币单位的,1%,。所占存储空间大小为,4,个字节。,2,.,近似数字,近似数据类型包括,FLOAT(浮点),和,REAL(实数),两种类型。,FLOAT(n):,该类型数据范围是-1.79E+3081.79E+308,所占存储空间大小取决于n。n为用于存储FLOAT数值尾数的位数,以科学记数法表示,因此可以确定精度和存储大小。如果指定了n,则它必须是介于1和53之间的某个值。n的默认值为53。当n取值范围在124之间时,存储空间为4个字节;当n取值范围在2553之间时,存储空间为8个字节。,REAL:,该类型数据范围是-3.40E+383.40E+38,所占存储空间大小为4个字节。相当于FLOAT(24)。,3.,日期和时间,DATE,:,存储从,0001,年,1,月,1,日到,9999,年,12,月,31,日间的日期,占,3,个字节。日期格式,YYYY-MM-DD,,其中,YYYY,表示年份,范围为,0001,至,9999,;,MM,表示月份,范围为,1,至,12,;,DD,表示日期,范围为,1,-31,。,DATETIME,:,存储从,1753,年,1,月,1,日到,9999,年,12,月,31,日的日期和时间数据,精确到,3%,秒。占,8,个字节。默认格式为,YYYY-MM-DD,hh:mm:ss.n,*,,其中,,YYYY-MM-DD,是日期部分,“,hh:mm:ss.n,*”,是时间部分,,hh,、,mm,和,ss,分别表示小时、分钟和秒;,n*,表示秒的小数部分,范围为,0,至,999,。,SMALLDATETIME,:,存储从,1900,年,1,月,1,日到,2079,年,12,月,31,日的日期和时间数据,可以精确到分钟。占,4,个字节。默认格式为,YYYY-MM-DD,hh:mm:ss,,含义同,DATETIME,。,4.,字符串,编码,编码是不同国家的语言在计算机中的一种存储和解释规范。目前的编码方式主要有两种:普通字符编码和统一字符编码(,Unicode,)。,(1)普通字符编码,:,普通字符编码对应多种字符集,统称为,ANSI字符集。ANSI字符集中的每个字符在计算机中所占字节数不确定。例如,美国的ASCII字符集中的每个字符站1个字节,而我国的标准字符集GB2312中的每个字符站2个字节。,(2)统一字符编码(Unicode),:,统一字符编码固定使用,2个字节表示一个字符,可以表示65535个字符,此种编码对应的字符集称为Unicode字符集。,4.,字符串,非,Unicode,字符数据类型,CHAR(n,),:,长度为,n,的固定长度非,Unicode,字符串,占,1,字节,存储空间为,n,个字节(,n,介于,0,8000,的整数)。当给定字符串长度超过,n,时,超出部分将被截断,如果给定字符串实际长度小于,n,,将用空格填充空域部分。如果未在数据定义或变量声明语句中指定,n,,则默认长度为,1,。,VARCHAR(n,),:,最大长度为,n,的可变长度的非,Unicode,字符串(,n,介于,0,8000,的整数),其存储大小为实际字符串所占字节数。当给定字符串串长度超过,n,时,超出部分将被截断,如果给定字符串实际长度小于,n,,按实际长度存储,不填充空格。,VARCHAR(max,),:是最大长度为,2,31,-1,的可变长度字符串。,TEXT,:,专门用于存储数量庞大的变长字符数据。最大所占存储空间可,2,31,-1,字节。,4.,字符串,Unicode字符数据类型,Unicode字符数据类型用于存储双字节字符,。包括:,NCHAR,NVARCHAR和NTEXT三种类型。,Unicode数据的存储空间,=,字符数,*2(字节),Unicode字符数据类型与非Unicode字符数据类型相比,其区别在于字符采用Unicode编码,每个字符站2个字节,使用形式和含义与非Unicode字符数据类型相同。,5.,二进制字符串,BINARY(n,),:,固定长度为,n,个字节的二进制字符串(,n,必须是介于,0,8000,之间的一个整数),占,n,字节。,VARBINARY(n,),:,最大长度为,n,个字节可变长二进制字符串(,n,必须是介于,0,8000,之间的一个整数),所占存储空间大小为实际二进制字符串长度。,VARBINARY(max,),:最大的存储大小为,2,31,-1,的可变长度二进制字符串。,IMAGE,:,可用于存储超过,8000,字节的数据,如,Microsoft Word,文档、,Microsoft Excel,图表以及图像数据等,占,0,2,31,-1,字节。,6.,其它数据类,CURSOR,:,游标的引用,占,8,字节。,SQL_VARIANT,:,数据类型可以应用在列、参数、变量和函数返回值中,,SQL_VARIANT,类型的数据可以存储除,TEXT,、,NTEXT,、,IMAGE,和,SQL_VARIANT,数据类型以外的各种数据。占,0,8000,字节。,TIMESTAMP,:,时间戳,数据库范围内的唯一值,占,8,字节。,TABLE,:,存储对表或者视图处理后的结果集。,UNIQUEIDENTIFIER,:,全局唯一标识符(,GUID,),占,16,字节。,XML,:,存储可扩展标记文本数据。,5.2.2,用户自定义数据类型,1,创建用户自定义数据类型,系统存储过程,sp_addtype,可以创建用户自定义数据类型。,【例5-1】在数据库TSG中创建自定义数据类型Number,,SMALLINT类型,允许空。,USE TSG,GO,EXEC,sp_addtype,Number,SMALLINT,NULL,5.2.2,用户自定义数据类型,2,查看用户自定义数据类型,存储过程,sp_help,可以查看用户自定义数据类型。,【例5-2】查看Number的特征。,EXEC,sp_help,Number,图5-1 例5-2的运行结果,5.2.2,用户自定义数据类型,3,删除用户自定义数据类型,存储过程,sp_droptype,可以删除用户自定义数据类型。,【例5-3】删除自定义的数据类型Number。,EXEC,sp_droptype,Number,5.3,常量、变量和运算符,常量,是一个常值,在程序运行中保持不变,一,经定义程序本身不能改变其值。,变量,是在程序运行过程中其值可以改变的量。,5.3.1,常量,1字符串常量,字符串常量括在单引号内,并包含字母数字字符(,a-z,、,A-Z,和,0-9,)以及特殊字符如感叹号,(!),、,at,符,(),和数字号,(#),。例如:,Cincinnati,、,OBrien,、,Process X is 50%complete.,字符串常量还可以采用,Unicode,字符编码格式。例如:,NA SQL,String,表示字符串,A,SQL,String,是一个Unicode字符串,。,5.3.1,常量,2二进制常量,二进制常量具有前辍,0 x,并且是十六进制数字字符串。这些常量不使用引号括起。例如,:,0 xAE,、,0 x12Ef,、,0 x69048AEFDD010E,、,0 x,(空二进制串),3日期/时间常量,日期,/,时间常量使用特定格式的字符日期值来表示,并被单引号括起来。例如:,2010-12-05,、,12/05/2010,、,20101205,第二种依赖于,DATEFORMAT,,是,SQL Server,默认的处理方式。,5.3.1,常量,4数值常量,1,)整型常量,整型常量用没有用引号括起来并且不包含小数点的数字字符串来表示。必须全部为数字,它们不能包含小数。例如:,2356,、,8,等都是整型常量。,2,)数值常量,数字常量分为精确数值常量和浮点常量。精确数值常量由没有用引号括起来并且包含小数点的数字字符串来表示。例如,,1894.1204,和,2.0,等,。,浮点常量使用科学记数法来表示。例如,,101.5E5,和,0.5E-2,等。,5.3.1,常量,4数值常量,3,)货币常量,货币常量以前缀为可选的小数点和可选的货币符号不使用引号括起的数字字符串来表示。例如:,$12,和,$542023.14,都为货币常量,前面的货币符号“,$”,是可选的。,4,),uniqueidentifier,常量,UNIQUEIDENTIFIER,常量是表示,GUID,的字符串。可以使用字符或二进制字符串格式指定。例如:,6F9619FF-8B86-D011-B42D-00C04FC964FF,0 xff19966f868b11d0b42d00c04fc964ff,5.3.2,变量,1,局部变量(,Local Variable,),局部变量是用户自定义的变量,它的作用范围仅在定义它的程序内部。局部变量名以“,”,开头,用,DECLARE,命令进行定义,语法格式如下:,DECLARE,变量名 变量类型,变量名 变量类型,使用,SELECT,或,SET,命令来设置变量的值,语法格式如下:,SELECT,变量名,=,变量值 或者,SET,变量名,=,变量值,5.3.2,变量,1,局部变量(,Local Variable,),【,例,5-4】,声明一个存放名称的变量,Name,,类型为,char,,长度为,10,,赋值“图书馆”并输出变量的值。,DECLARE Name char(10),SELECT Name=,图书馆,PRINT Name,图,5-2,例,5-4,的运行结果,5.3.2,变量,2,全局变量(,Global Variable,),不是由用户的程序定义的,是在服务器级定义的系统内部使用的变量,任何程序均可以随时使用。引用全局变量必须以标记符“,”,开头。,全局变量,含义,CONNECTIONS,返回自上次启动以来连接或试图连接的次数,CURSOR_ROWS,返回连接上最后打开的由表中当前存在的,ERROR,返回最后执行的,T-SQL,语句的错误代码,FETCH_STATUS,返回上一次,FETCH,语句的状态值,IDENTITY,返回最后插入的标识值,MAX_CONNECTIONS,返回,SQL,上允许的同时用户连接的最大数。,PROCID,返回当前存储过程的,ID,值,OPTIONS,返回当前,SET,选项的信息,ROWCOUNT,返回受上一语句影响的行数,任何不返回行的语句将这一变量设置为,0,SERVERNAME,返回运行,SQL,服务器名称,SERVICENAME,返回,SQL Server,正运行于哪种服务状态之下,如,MS SQL Server,,,MSDTC,,,SQL Server Agent,SPID,返回当前用户进程的服务器进程标识符,TRANCOUNT,返回当前连接的活动事务数,VERSION,返回,SQL Server,的版本信息,表,5-2,常用的全局变量,2.,全局变量(,Global Variable,),【例5-5】修改TSG数据库的Book表中某条记录的书号“CallNo”,用ERROR检测主键冲突。,USE TSG,GO,UPDATE Book SET,CallNo,=F121/L612,WHERE,CallNo,=G0/Z810,IF ERROR=2627,PRINT A constraint violation occurred,图,5-3,例,5-5,的运行结果,2.,全局变量(,Global Variable,),【例5-6】查看SQL,Server的版本号,。,SELECT VERSION,图,5-4,例,5-6,的运行结果,【例5-7】ROWCOUNT的使用。,USE TSG,GO,UPDATE BOOK SET Title=ZDMA,WHERE,CallNo,=999-888-7777,IF ROWCOUNT=0,print Warning:No rows were updated,图,5-5,例,5-7,的运行结果,5.3.3,注释与输出,1注释,注释语句不是可执行的语句,不参与程序的编译。,作用:,说明代码的功能或对代码的实现方式给出简要的解释或提示。,对,T-SQL,语句进行注释有两种方法:,(,1,)使用“,-”,进行单行注释。,(,2,)利用“,/*/”,进行块注释。,5.3.3,注释与输出,2,输出,(,1,),PRINT,语句可直接显示表达式结果,RAISERROR(msg_id|msg_str,SEVERITY,STATE,argumentl,n),(,2,),RASERROR,函数将错误信息显示在屏幕上,同时也可以记录在日志中。RASEERROR函数的基本语法格式如下:,msg_id,:,错误号,省略时系统将产生一个错误号为,50000,的错误消息;,msg_str,:,错误信息;,SEVERITY,:,错误的严重级别;,STATE,:,说明发生错误时的状态信息。,输出的例子,【,例,5-8】,查询索书号为,F121/L612,的书籍数量,如果,1,本以上,则显示数量,1,本以上,否则输出库存不足信息。,USE TSG,GO,DECLARE,CallNo,varchar(9),Title varchar(40),Number,smallint,SET,CallNo,=F121/L612,SELECT Title=Title,Number=Number,From Book,Where,CallNo,=,CallNo,IF(Number 1)PRINT Title+1本以上。,ELSE,RAISERROR(库存不足,报警!,10,1),5.3.4,运算符,运算符,用来执行数据之间的数学或比较运算,是指定要在一个或者多个表达式中执行操作的一种符号,。,T-SQL,中运算符主要有,6,大类:,算术运算符,赋值运算符,位运算符,比较运算符,逻辑运算符,字符串串联运算符,1.,算术运算符,包括:,加(+)、减(-)、乘,(*)、,除(/)和取模(%),等,。,【例5-9】,SELECT+3+2,加法,SELECT-4-1,减法,SELECT-5*2,乘法,SELECT 10/2,整数相除,10.0/2,小数除法,SELECT 10%2,取余,图,5-7,例,5-9,的运行结果,赋值运算符和位运算符,赋值运算符,“,=,”,:将数据值指派给特定的对象。,位运算符,操作数:整型或者二进制数据,(IMAGE类型除外),包括:,位与(&)、位或(|)、位异或()和位非(),等,。,3.,位运算符,1)&运算,从两个表达式取对应的位。当且仅当中两个位的值都为1时,结果位才被设置为1;否则,结果位被设置为0。,例如:,170,:,0000 0000 1010,1010,75,:,0000 0000 0100 1011,&-,10,:,0000 0000,0000,1010,2)|运算,取两个表达式的每个对应位,如果在输入表达式中有一个位为1或两个位均为1(对于正在解析的当前位),那么结果位将被设置为1;如果输入表达式中的两个位都不为1,则结果位将被设置为0。,3.,位运算符,3)运算,通过从两个表达式中取对应的位,如果在输入表达式的正在被解析的对应位中,任意一位(但不是两个位)的值为1,则结果位的值被设置为1;如果相对应的两个位的值都为0或者都为1,那么结果位的值被清除为0。,4)运算,(位非)运算符对表达式逐位执行逻辑位非运算。如果表达式的值为0,则结果集中的位将设置为1;否则,结果中的位将清0。换句话说,1改成0,而0则改成1。,位运算符举例,【例5-10】计算170和75进行“位与”、“位或”、“位异或”的结果以及对170进行“位非”计算的结果。,SELECT 170&75,位与,SELECT 170|75,位或,SELECT 17075,位异或,SELECT 170,位非,图,5-8,例,5-10,的运行结果,4,.,比较运算符,比较两个表达式的大小或是否相同,其比较的结果,:,TRUE,(表示表达式的结果为真),FALSE,(表示表达式的结果为假),UNKNOWN,除了TEXT、NTEXT 或 IMAGE 数据类型的表达式外,比较运算符可以用于所有其它表达式。,5.,逻辑运算符,把多个逻辑表达式连接起来。包括,AND,、,OR,和,NOT,。,运算结果:,TRUE,或,FALSE,值的布尔数据类型。,6.,字符串串联运算符,加号,(+),,可以进行字符串串联。例如,,表达式,ab+cd,的结果为,abcd,。,5.4,函数,函数是一组编译好的T-SQL语句,SQL Server支持两种函数类型:,内置函数:,是一组预定义函数,是,T-SQL,语言的一部分,用户可以直接使用它们实现希望的功能。,用户定义函数:,是由用户自行定义并编写的函数,用户可以根据需要编写和修改自定义函数,然后进行调用。,5.4.1,常用内置函数,SQL Servr 2008中的函数大概分为7类,:,数学函数,字符串函数,日期时间函数,聚集函数,转换函数,系统函数,用户自定义函数,1,.,字符串函数,函数,UPPER(str,),ASCII(str,),REPLICATE(str,n),CHAR(n,),PATINDEX(%pattern,%,str,),CHARINDEX(str1,str2,start),LEN(str,),STUFF(str1,start,length,str2),REVERSE(str,),SUBSTRING(str,start,length),SPACE(n,),LTRIM(str,),LEFT(str,n),RTRIM(str,),RIGHT(str,n),LOWER(str,),STR(f,p,s),表,5-3,常用字符串函数,1,.,字符串函数,【例5-11】删除字符串变量中起始处的空格。,DECLARE Str1 VARCHAR(40),SET Str1=,TWO SPACES BEFORE THIS STRING,SELECT Str1,SELECT THE RESULT IS:+LTRIM(Str1),图,5-9,例,5-11,的运行结果,1,.,字符串函数,【例5-12】编写一段程序输出数值147.58的整数和小数部分。,DECLARE,Str,CHAR(18),Pos SMALLINT,SET,Str,=STR(147.58,6,2),SET Pos=CHARINDEX(.,STR),PRINT RTRIM(Str)+的整数部分是:+LEFT(Str,Pos-1),PRINT,RTRIM(Str)+的小数部分是,:,+RIGHT(RTRIM(Str),LEN(RTRIM(Str)-pos+1),图,5-10,例,5-12,的运行结果,2.,数学函数,函数,函数,ABS(n,),MOD(m,n),ACOS(n,),PI(),ASIN(n,),POWER(m,n),ATAN(n,),RADIANS(n,),CEILING(n,),RAND(),COS(n,),ROUND(m,n),DEGREES(n,),SIGN(n,),EXP(n,),SIN(n,),FLOOR(n,),SQRT(n,),LOG(n,),SQUARE(n,),LOG10(n),TAN(n,),表,5-4,常用数学函数,2.,数学函数,【例5-13】对同一数值使用FLOOR、CEILING和ROUND函数。,SELECT FLOOR(1.2345),CEILING(1.2345),ROUND(1.2345,3),图,5-11,例,5-13,的运行结果,3.,日期和时间函数,函数,GETDATE(),DATEPART(datepart,date),DATENAME(datepart,date),DAY(date,),MONTH(date,),YEAR(date,),DATEADD(datepart,number,date),DATEDIFF(datepart,date1,date2),表,5-5,常见的日期和时间函数,3.,日期和时间函数,【例5-14】获取系统当前日期,并分别提取出月、日和年。,SELECT MONTH(GETDATE()月,DAY(GETDATE()日,YEAR(GETDATE()年,SELECT DATENAME(MONTH,GETDATE()月,DATENAME(DAY,GETDATE()日,DATENAME(YEAR,GETDATE()年,SELECT DATEPART(MONTH,GETDATE()月,DATEPART(DAY,GETDATE()日,DATEPART(YEAR,GETDATE()年,图,5-12,例,5-14,的运行结果,3.,日期和时间函数,【例5-15】计算2006年9月1日到当前日期经历了多少数、多少月和多少周。,SELECT DATEDIFF(DAY,2006-9-1,GETDATE(),天数,DATEDIFF(MONTH,2006-9-1,GETDATE(),月数,DATEDIFF(WEEK,2006-9-1,GETDATE(),周数,图,5-13,例,5-15,的运行结果,4.,转换函数,能够完成某些,数据类型的转换,。,(1),CAST(expression,type),:,将表达式expression转换为指定的type数据类型。,(2),CONVERT(type(length),expression,style),:,type为expression转换后的数据类型;,length表示转换后的数据长度;,style将日期时间类型的数据转换为字符型的数据时,该参数用于指定转换后的样式。,4.,转换函数,【,例,5-16】,将,/3,转换成相应度数对应的字符串。,SELECT CONVERT(VARCHAR,DEGREES(PI()/3),度数,1,CAST(DEGREES(PI()/3)AS VARCHAR),度数,2,图,5-14,例,5-16,的运行结果,5,.,系统函数,函数,DB_ID(name,),,,DB_NAME(id,),HOST_ID(name,),,,HOST_NAME(id,),OBJECT_ID(name,),,,OBJECT_NAME(id,),SUSER_ID(name,),,,SUSER_NAME(id,),USER_ID(name,),,,USER_NAME(id,),COL_NAME(table_id,col_id,),COL_LENGTH(table,col,),INDEX_COL(table,index_id,key_id,),DATALENGTH(expression,),表,5-7,部分系统函数,5,.,系统函数,【例5-17】利用系统函数获取一些信息。,SELECT CURRENT_USER,当前用户,DATALENGTH(,数据库,),长度,HOST_NAME(),计算机名,SYSTEM_USER,当前登录用户名,USER_NAME(1),根据,ID,返回用户名,图,5-15,例,5-17,的运行结果,5.4.2,用户自定义函数,根据函数返值类型不同分为两类:,表值函数,(包括内联表值函数和多语句表值函数),标量值函数,使用,SQL Server Management Studio,提供的模板,例如:在,TSG,数据库中创建一个标量值函数。,点击,【TSG】,【,可编程性,】,【,函数,】,【,新建标量值函数,】,。,1,.,内联表值函数,内联表值函数,返回一个,单条,SELECT,语句产生的结果表,。函数定义的基本语法格式为:,CREATE FUNCTION FunctionName(param1 AS,DataType,=default,.n),RETURNS TABLE,AS,RETURN(SELECT statement),FunctionName,是用户定义函数的名称,在数据库中应该是唯一的;,param1,是函数的参数;,default,为函数参数的默认值;,DataType,是数据类型。,1,.,内联表值函数,【,例,5-18】,创建一个函数,并调用该函数。功能是查询,TSG,数据库中的,Book,表中的所有记录。,USE TSG,GO,CREATE FUNCTION,SelectBook,(),RETURNS TABLE,AS,RETURN,SELECT*FROM Book -,返回,SELECT,查询结果,GO,SELECT*FROM,SelectBook,(),2.,多语句表值函数,多语句表值函数,返回一个由,T-SQL,语句建立的表,。其函数定义基本语法格式为:,CREATE FUNCTION FunctionName(param1,DataType,=default,n),RETURNS,return_variable,TABLE,AS,BEGIN,function_body,RETURN,END,return_variable,是要返回的表变量,;,table_type_definition,为表定义,;,function_body,是函数体定义,。,2.,多语句表值函数,【例5-19】创建一个函数,通过输入CallNo,查询借阅该书的读者姓名和所在部门。,CREATE FUNCTION,GetReader(book_no,char(13),RETURNS info,TABLE(Name,char(10),Department varchar(20),AS,BEGIN,INSERT INTO,info,SELECT,Name,Department,FROM Patron,JOIN Lend ON,Patron.PatronID,=,Lend.PatronID,JOIN Book ON,Lend.CallNo,=,Book.CallNo,WHERE,CallNo,=,book_no,RETURN,END,3,.,标量值函数,标量值函数,返回一个,确定类型的标量值,(除,TEXT,、,NTEXT,、,IMAGE,、,CURSOR,、,TIMESTAMP,和,TABLE,以外的类型)。其函数定义的基本语法格式为:,CREATE FUNCTION FunctionName(param1 AS,DataType,=default,.n),RETURNS,DataType,AS,BEGIN,Function_body,RETURN,DataType,END,3,.,标量值函数,【例5-20】创建一个函数,并调用函数。功能是获取系统当前日期,输出年份。,CREATE FUNCTION,CurrentDate,(),RETURNS INT,AS,BEGIN,RETURN,YEAR(GETDATE(),END,GO,DECLARE Year,int,SET Year=,TSG.dbo.CurrentDate,(),PRINT Year,5.5.1,批处理,“,批”:,是从客户端传递给服务器的一组完整的数据和,SQL,指令的集合,从应用程序一次性的发送到,SQL Server,执行。,“,GO”,:,是批处理的标志,两个“,GO”,之间的,T-SQL,语句称为一个批处理。,【,例,5-21】,创建数据库,TSG,,并将当前数据库切换到,TSG,。,CREATE DATABASE TSG,USE TSG,是否能成功执行?,CREATE DATABASE TSG,GO,USE TSG,正确的做法是:,5.5.1,批处理,考虑如下程序,:,DECLARE,MyVar,varchar(50)-,该变量声明仅在该,批,中有效。,SELECT,MyVar,=,今天天气真不错!,PRINT,第一个批处理执行结束,GO,PRINT,MyVar,-,产生错误,因为,MyVar,在该,批,中未定义而直接使用。,PRINT,第二个批处理执行结束,GO,PRINT,第三个批处理执行结束,GO,批处理要注意几个问题,并非所有语句都可以和其它语句组合在一个批中。CREATE,DEFAULT,、,CREATE,PROCEDURE,、,CREATE RULE,、,CREATE TRIGGER,、,CREATE VIEW必须独自成批处理,,,不能够与其他语句组合使用,。,如果EXECUTE,语句是批处理中的第一,条语句,,则不需要EXECUTE关键字,;,否则需要EXECUTE关键字。,RULE和DEFAULT不能在同一个批处理中绑定列同时又被使用。,CHECK约束不能在同一批处理中既定义又使用。,用SET语句改变的项,在批处理结束时生效。,在同一批处理中,不能修改一个表的某些列后马上使用这些新列,。,5.5.2,流程控制,流程控制语句,是指通过判断指定的某些值来,控制程序运行方向,的语句。,包括,:,BEGINEND,IFELSE,CASE,WHILE,GOTO,WAITFOR,1.BEGINEND,“BEGINEND”,语句,能够将多个,T-SQL,语句组合成一个语句块,并将它们视为一个单元处理。其语法格式为:,BEGIN,SQL,语句,|,语句块,END,2.IFELSE,“IFELSE”,语句,是条件判断语句,,ELSE,子句可选。,语法格式为:,IF,|BEGIN END,ELSE,|BEGIN END,3.CASE,“CASE”,语句,可以计算多个条件式,并将其中一个符合条件的结果表达式返回。,CASE,语句只能嵌入到,SELECT,语句的,SELECT,子句中。,CASE语句有两种格式。,语法格式,1,:,CASE,表达式,WHEN,表达式,_11,THEN,表达式,_12,WHEN,表达式,_n1,THEN,表达式,_n2,else,表达式,_m,END,3.CASE,【例5-22】在Patron表中,选取姓王读者的Name(读者姓名)和Gender(性别),如果Gender的值为男,则输出M;为女,则输出F。,USE TSG,GO,SELECT Name,性别,=CASE Gender,WHEN 男 THEN M,WHEN 女 THEN F,END,FROM Patron,WHERE Name LIKE 王%,图,5-17,例,5-22,的运行结果,3.CASE,语法格式,2,:,CASE,WHEN,条件表达式_1,THEN,表达式_1,WHEN,条件表达式,_n,THEN,表达式_n,else,表达式_m,END,【例5-23】在Book表中,选取姓“周”的作者所编著图书的Title(书名)和Number(数量),如果Number的值大于3,则输出“多”,否则输出“少”。,USE TSG,GO,SELECT Title,书名,CASE WHEN Number3 THEN 多,ELSE 少,END,数量,FROM Book,WHERE Author LIKE 周%,图,5-18,例,5-23,的运行结果,4.WHILECONTINUEBREAK,“WHILECONTINUEBREAK”,语句,是用于设置按条件重复执行,SQL,语句或语句块。只要指定的条件为真,就重复执行语句。,其语法格式为:,WHILE,条件表达式,BEGIN,SQL语句|语句块,BREAK,CONTIUNE,SQL语句|语句块,END,CONTINUE语句,:,可以使程序跳过,CONTINUE语句后面的语句,继续进行下一次循环。,BREAK语句,:,使程序完全跳出循环,结束,WHILE语句的执行。,5.GOTO,“GOTO”,语句,可以使程序直接跳转到指定的标有标识符的位置处继续执行。,语法格式为:,GOTO label,DECLARE sum SMALLINT,i SMALLINT,SET i=1;SET sum=0;,BEG:,IF(i=100),BEGIN,SET sum=,sum,+i;SET i=,i,+1,GOTO BEG,END,PRINT sum,【例5-24】求1100的累加和。,5.GOTO,例,5-24,,还可以用,WHILE,循环语句来
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服