




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQLServer编程—语法与流程控制第1页Transact-SQL语言特点Transact-SQL语言是微软对SQL语言扩展。Transact-SQL语言是一个交互式查询语言,含有功效强大、简单易学特点。Transact-SQL语言有4个特点:一是一体化特点,集数据定义语言、数据操纵语言、数据控制语言和附加语言元素为一体。二是两种使用方式,交互式和嵌入到高级语言使用方式。前者适合于非数据库专业人员使用,后者适合于数据库专业开发人员使用。三是非过程化语言,只需要提出“干什么”,不需要指出“怎样干”,语句操作过程由系统自动完成。四是,类似于人思维习惯,轻易了解和掌握。第2页Transact-SQL语言组成元素数据控制语言语句数据定义语言语句数据操纵语言语句附加语言元素第3页数据控制语言语句安全性管理是分布式数据库系统主要特征。安全性管理就是确保数据库中数据和操作不能被未授权用户使用和执行。数据控制语言语句就是用来进行安全性管理,它能够确定哪些用户能够查看或修改数据、或执行数据库中操作等,这些语句主要包含GRANT、DENY、REVOKE等语句。语句功效说明GRANT授予权限可把语句许可或对象许可权限授予其它用户和角色REVOKE收回权限与GRANT功效相反,但不影响该用户或角色从其它角色中作为组员继承许可权限DENY收回权限,并禁止从其它角色继承许可权限功效与REVOKE相同,不一样之处:除收回权限外,还禁止从其它角色继承许可权限第4页数据定义语言语句数据定义语言语句用来执行数据库任务、创建数据库以及数据库中各种对象,这些语句包含CREATE、ALTER、DROP等语句。在MicrosoftSQLServer系统中,数据库及其对象包含数据库、表、缺省、规则、视图、触发器、存放过程等。这些对象创建、修改和删除等管理都能够经过使用CREATE、ALTER、DROP等语句来完成。语句功效说明CREATE创建数据库或数据库对象不一样数据库对象,其CREATE语句语法形式不一样ALTER对数据库或数据库对象进行修改不一样数据库对象,其ALTER语句语法形式不一样DROP删除数据库或数据库对象不一样数据库对象,其DROP语句语法形式不一样第5页数据操纵语言语句数据操纵语言语句,用来在数据库中操纵各种对象,检索和修改数据,这些语句包含SELECT、INSERT、UPDATE、DELETE等。这些语句都是操纵数据库最惯用到语句。语句功效说明SELECT从表或视图中检索数据是使用最频繁SQL语句之一INSERT将数据插入到表或视图中
UPDATE修改表或视图中数据既可修改表或视图一行数据,也可修改一组或全部数据DELETE从表或视图中删除数据可依据条件删除指定数据第6页附加语言元素附加语言元素不是ISOSQL-3标准内容,而是Transact-SQL语言为了编程而增加语言元素。这些语言元素包含变量、运算符、函数、流程控制语言和注释等等。下面就要介绍这些Transact-SQL语法要素第7页一、批处理命令批处理是多条Transact-SQL语句组成集合。SQLServer将批处理语句进行编译形成一个可执行单元,称为执行计划。执行计划中语句一次执行每一条语句,假如在编译过程中出现语法错误,那么批处理中全部语句均无法正常执行。假如在运行阶段出现错误时,普通都会中止当前以及其后语句执行,只有在少数情况下,如违反约束时,仅中止当前犯错语句而继续执行其它语句。第8页在建立批处理时,应该遵照以下规则:不能在批处理中引用其它批处理中所定义变量。CREATEDEFAULT、CREATEPROCEDURE、CREATERULE、CREATETRIGGER和CREATEVIEW语句不能在批处理中与其它语句组合使用。不允许在一个批处理中更改表结构、并引用新字段。假如EXECUTE语句是批处理中第一句,则不需要EXECUTE关键字。假如EXECUTE语句不是批处理中第一条语句,则需要EXECUTE关键字。EXECUTE/EXEC用于执行用户定义函数、系统存放过程、用户自定义存放过程或一个扩展存放过程。在一个Transact-SQL批处理内部,EXEC能控制一个字符串运行一个完整批处理需要使用GO语句作为结束标识。GO实际上并不是Transact-SQL语句,向SQLServer描述由Transact-SQL语句组成批处理第9页二、注释注释是程序代码中不执行文本字符串。在SQLServer中,能够使用两种类型注释字符:一个是ANSI标准注释符“--”,它用于单行注释;另一个是与C语言相同注释符号,即“/**/”。第10页注释语句嵌于行内注释语句块注释语句SELECTproductname
,(unitsinstock-unitsonorder)--
计算存货
,supplierID
FROMproductsGO/*这部分代码检索产品表全部行而且显示单价,增加了10%单价和产品名称。
*/USEnorthwindSELECTunitprice,(unitprice*1.1),productname
FROMproductsGO示例2示例1第11页三、标识符标准标识符:第一个字符必须是字母(a~z或A~Z),第一个字符后能够是数字、字母或各种符号特殊标识符:当标识符第一个字符是符号时,代表它有特殊用处以@开头标识符代表局部变量或参数以@@开头标识符代表全局变量或参数以#开头标识符代表暂时表或存放过程以##开头标识符代表一个全局暂时对象限定标识符当对象名称包含空格时当保留关键字被用作对象名或对象部分名字时第12页限定标识符限定标识符能够用中括号表示括号标识符([])
用双引号表示引用标识符(“”)SELECT*FROM[含空格表名]SELECT*FROM“含空格表名”第13页标识符命名标准使用短名字尽可能使用有意义名字使用简单明了命名约定使用能够区分出对象类型标识符视图存放过程保持对象名和用户名一致性sales表和sales角色第14页四、数据类型数字型:包含各种整数如int、tinyint、smallint和bigint日期型:包含datetime和smalldatetime字符型:包含char、nchar、varchar和nvarchar二进制型:在存放与结构上与字符型数据相同,包含binary和varbinary惟一标识符(GUID):代表一个全局特殊标识符,是一个16位16进制值SQL变量:代表SQLServer所支持各种数据类型图像和文本:属于大型二进制对象结构(BLOB),代表定长或变长数据类型表:代表一个表结构,在SQLServer中,能够把表保留在字段中游标:用于存放过程编程中,也会和低层客户接口同时使用。游标从不用于数据定义语言(DDL)语句中用户自定义数据类型:基于系统数据类型,由数据库管理员生成第15页五、常量常量,也称为字面值或标量值,是表示一个特定数据值符号,在运行过程中其值不会变量。常量格式取决于它所表示值数据类型。包含:字符型常量,整型常量,实型常量,日期常量等。Example:
‘Thisis…’1212.3‘-09-09’第16页六、变量变量对于一个语言来说是必不可少组成部分。变量有两种形式,局部变量:用户自己使用DECLARE语句定义,名字前要有一个标识符“@”。全局变量:系统提供,引用全局变量时,名字前要有两个标识符“@@”。第17页局部变量局部变量只含有局部作用范围
只能在定义它语句、批处理或过程中使用用DECLARE@语句定义局部变量用SET或SELECT@语句给局部变量赋值【例】创建局部变量@var1、@var2,并赋值,然后输出变量值。DECLARE@var1varchar(20),@var2varchar(40)SET@var1='中国'/*一个SET语句只能给一个变量赋值*/SET@var2=@var1+'是一个伟大国家'select@var1,@var2go第18页【例】创建一个名为sex局部变量,并在SELECT语句中使用该局部变量查找表student中全部女同学学号、姓名。DECLARE@sexchar(2)SET@sex='女'SELECTSNO,SNAMEFROMstudentWHERESSEX=@sexGO【例】使用查询给变量赋值。DECLARE@studentchar(8)SET@student=(SELECTSNAMEFROMstudentWHERESNO='15121')SELECT@studentGO用SELECT语句赋值语法格式:SELECT{@local_variable=expression}[,…n]第19页全局变量全局变量:用两个@标识,由SQLServer提供,用户不能创建全局变量设置变量提供SQLServer当前各种特征和参数设置信息统计变量提供SQLServer自开启后运行信息系统变量提供最近对表操作信息第20页一些惯用全局变量:@@CONNECTIONS:返回自上次开启SQLServer以来连接或试图连接次数。@@MAX_CONNECTIONS:返回SQLServer上允许同时用户连接最大数。@@ERROR:返回最终执行T-SQL语句错误代码。@@TRANCOUNT:返回当前连接活动事务数。@@VERSION:返回SQLServer当前安装日期、版本和处理器类型。@@SERVERNAME:返回运行SQLServer当地服务器名称。@@SERVICENAME:返回SQLServer正在其下运行注册表键名。若当前实例为默认实例,则返回MSSQLServer;若当前实例是命名实例,则该函数返回实例名。第21页@@SPID:返回当前用户进程服务器进程标识符(ID)。@@ROWCOUNT:返回受上一语句影响行数。@@NESTLEVEL:返回当前存放过程执行嵌套层次(初始值为0)。@@LANGUAGE:返回当前使用语言名。@@OPTIONS:返回当前SET选项信息。@@CPU_BUSY:返回自上次开启SQLServer以来CPU工作时间,单位为毫秒(基于系统计时器分辨率)。@@IDLE:返回SQLServer自上次开启后闲置时间,单位为毫秒(基于系统计时器分辨率)。@@IDENTITY:返回最终插入标识值。INSERTINTOjobs(job_desc,min_lvl,max_lvl)VALUES('Accountant',12,125)SELECT@@IDENTITYAS'Identity'
第22页使用全局变量时应该注意以下几点:①全局变量不是由用户程序定义,它们是在服务器级定义。②用户只能使用预先定义全局变量。③引用全局变量时,必须以“@@”开头。④局部变量名称不能与全局变量名称相同,不然会在应用程序中出现不可预测结果。第23页七、函数在Transact-SQL语言中,函数被用来执行一些特殊运算以支持SQLServer标准命令。Transact-SQL编程语言提供了三种函数:㈠行集函数:行集函数能够在Transact-SQL语句中看成表引用。㈡聚合函数:聚合函数用于对一组值执行计算并返回一个单一值。㈢标量函数:标量函数用于对传递给它一个或者多个参数值进行处理和计算,并返回一个单一值。第24页系统函数聚集函数标量函数行集函数SELECT*
FROMOPENQUERY
(OracleSvr,'SELECTname,idFROMowner.titles')USEnorthwindSELECTAVG(unitprice)ASAvgPriceFROMproductsGOUSEnorthwindSELECTDB_NAME()AS'database‘GO第25页SQLServer中最惯用几个函数字符串函数日期和时间函数数学函数转换函数系统函数聚合函数用户自定义函数第26页1字符串函数字符串函数能够对二进制数据、字符串和表示式执行不一样运算,大多数字符串函数只能用于char和varchar数据类型以及明确转换成char和varchar数据类型,少数几个字符串函数也能够用于binary和varbinary数据类型。另外,一些字符串函数还能够处理text、ntext、image数据类型数据。第27页字符串函数分类:基本字符串函数:UPPER、LOWER、SPACE、REPLICATE、STUFF、REVERSE、LTRIM、RTRIM。字符串查找函数:CHARINDEX、PATINDEX。长度和分析函数:DATALENGTH、RIGHT、SUBSTRING。转换函数:ASCH、CHAR、STR、SOUNDEX、DIFFERENCE。第28页1.Upper功效:返回将小写字符数据转换为大写字符表示式。语法:UPPER(character_expression)其中,character_expression由字符数据组成表示式。能够是常量、变量,也能够是字符或二进制数据列,它返回类型为varchar。2.Lower功效:将大写字符数据转换为小写字符表示式。语法:LOWER(character_expression)其中,character_expression是字符或二进制数据表示式。character_expression能够是常量、变量或列。第29页Upper()和Lower()函数举例USEpubsGOSELECTlower(SubString(title,1,20))AS书名小写,upper(Substring(title,1,20))AS书名大写,LOWER(UPPER(SUBSTRING(title,1,20)))AsLowerUpperFROMtitlesWHEREpricebetween11.00and20.00第30页USEpubsGOSELECTRTRIM(au_lname)+','+SPACE(5)+LTRIM(au_fname)FROMauthorsORDERBYau_lname,au_fnameGO3.Space功效:返回由重复空格组成字符串。语法:SPACE(integer_expression)integer_expression是表示空格个数正整数。假如integer_expression为负,则返回空字符串。第31页举例:DECLARE@string_to_trimvarchar(60)SET@string_to_trim='前面有五个空格'SELECT'现在没有空格:'+LTRIM(@string_to_trim)GO4.Ltrim()功效:删除起始空格后返回字符表示式。语法:LTrim(character_expression)character_expression是字符或二进制数据表示式。第32页举例:DECLARE@string_to_trimvarchar(60)SET@string_to_trim='后面有四个空格'SELECT'现在没有空格:'+CHAR(13)+RTRIM(@string_to_trim)GO5.RTrim功效:截断全部尾随空格后返回一个字符串。语法:RTrim(character_expression)character_expression是字符或二进制数据表示式。第33页SELECTSTUFF('abcdef',2,3,'ijklmn')GO6.STUFF功效:删除指定长度字符并在指定起始点插入另一组字符。语法:STUFF(character_expression,start,length,character_expression)character_expression由字符数据组成表示式Start是一个整型值,指定删除和插入开始位置。Length是一个整数,指定要删除字符数。第34页7.REVERSE功效:返回字符表示式反转。语法:REVERSE(character_expression)举例:selectReverse('abcd')第35页举例:USEpubsGOSELECTlength=DATALENGTH(pub_name),pub_nameFROMpublishersORDERBYpub_nameGOselectdatalength('abcd')8.DATALENGTH功效:返回任何表示式所占字节数。语法:DATALENGTH(expression)expression是任何类型表示式。第36页9.SubString功效:返回字符、binary、text或image表示式一部分。语法:SUBSTRING(expression,start,length)expression是字符串、二进制字符串、text、image列或包含列表示式。不要使用包含聚合函数表示式。Start是一个整数,指定子串开始位置。Length是一个整数,指定子串长度(要返回字符数或字节数)。第37页举例:(1)在字符串上使用SUBSTRINGUSEpubsSELECTau_lname,SUBSTRING(au_fname,1,1)FROMauthorsORDERBYau_lname(2)在text、ntext和image数据上使用SUBSTRINGUSEpubsSELECTpub_id,SUBSTRING(logo,1,10)ASlogo,SUBSTRING(pr_info,1,10)ASpr_infoFROMpub_infoWHEREpub_id='1756'SELECTSUBSTRING('abcdefgh',1,5)第38页10.STR功效:由数字数据转换来字符数据。语法:STR(float_expression[,length[,decimal]])float_expression是带小数点近似数字(float)数据类型表示式。不要在STR函数中将函数或子查询用作float_expression。Length是总长度,包含小数点、符号、数字或空格。默认值为10。Decimal是小数点右边位数。举例:(1).SELECTSTR(123.45,6,1)(2).SELECTSTR(123.45,2,2)注意:当表示式超出指定长度时返回**第39页11.LEFT功效:返回从字符串左边开始指定个数字符。语法:LEFT(charexpression,intexpression)。Charexpression字符或二进制数据表示式,能够是常量、变量或列。intexpression是正整数,假如为负,则返回空字符串。举例:(1)selectleft('abc123',5)(2)USEpubsGOSELECTLEFT(title,5)FROMtitlesORDERBYtitle_idGO第40页2日期和时间函数日期和时间函数用于对日期和时间数据进行各种不一样处理和运算,并返回一个字符串、数字值或日期和时间值。在SQLServer中,日期和时间函数类型如表所表示。第41页表日期和时间函数类型函数参数DATEADD(datepart,number,date)DATEDIFF(datepart,date1,date2)DATENAME(datepart,date)DATEPART(datepart,date)DAY(date)GETDATE()MONTH(date)YEAR(date)第42页1.GetDate()功效:返回当前系统日期和时间。语法:GETDATE()举例:selectGetDate()as当前日期和时间2.Day()功效:返回代表指定日期天日期部分整数。语法:DAY(date)举例:
selectday(GetDate())as当前日selectday('/09/28')注意:常量字符串加‘’第43页3.Month()功效:返回代表指定日期月份整数。语法:Month(date)举例:selectMonth(GetDate())as当前月selectMonth('/09/28')注意:常量字符串加‘’4.Year()功效:返回代表指定日期年份整数。语法:Year(date)举例:selectYear(GetDate())as当前年份selectYear('/09/28')第44页5.Dateadd()功效:返回一个日期加上一个指定时间间隔数后时间SELECTdateadd(year,1,getdate())6.Datediff()功效:返回两个指定日期间时间间隔Selectdatediff(y,’-1-1’,getdate())7.datename()功效:返回指定日期指定部分字符串形式表示Selectdatename(year,getdate())8.datepart()功效:返回指定日期指定部分整数形式表示第45页3数学函数数学函数用于对数字表示式进行数学运算并返回运算结果。数学函数能够对SQLServer提供数字数据(decimal、integer、float、real、money、smallmoney、smallint和tinyint)进行处理。第46页1.Floor()功效:返回小于或等于所给数字表示式最大整数。语法:FLOOR(numeric_expression)举例:SELECTFLOOR(123.45),FLOOR(-123.45),FLOOR($123.45)2.Round()功效:返回数字表示式并四舍五入为指定长度或精度。语法:ROUND(numeric_expression,length[,function])
举例:SELECTROUND(123.9994,3),ROUND(123.9995,3)
第47页3.power()功效:返回给定表示式乘指定次方值。语法:POWER(numeric_expression,y)举例:selectpower(3,2)4.rand()功效:返回0到1之间随机float值。语法:rand(seed)举例:selectrand()第48页4转换函数普通情况下,SQLServer会自动处理一些数据类型转换。比如,假如比较char和datetime表示式、smallint和int表示式、或不一样长度char表示式,SQLServer能够将它们自动转换,这种转换被称为隐性转换。不过,无法由SQLServer自动转换或者是SQLServer自动转换结果不符合预期结果,就需要使用转换函数做显示转换。转换函数有两个:CONVERT和CAST。第49页CONVERT和CAST函数将某种数据类型表示式显式转换为另一个数据类型。CAST和CONVERT提供相同功效。语法CAST(expressionASdata_type)CONVERT(data_type[(length)],expression)第50页举例USEpubsSELECTtitle,ytd_salesFROMtitlesWHERECAST(ytd_salesASchar(20))LIKE'15%'ANDtype='trad_cook‘USEpubsGOSELECTSUBSTRING(title,1,30)ASTitle,ytd_salesFROMtitlesWHERECONVERT(char(20),ytd_sales)LIKE'3%'GO第51页5聚合函数主要包含AVG,COUNT,MAX,MIN,SUM等。聚合函数对一组值执行计算并返回单一值。除COUNT函数之外,聚合函数忽略空值。聚合函数经常与SELECT语句GROUPBY子句一同使用。举例USEpubsGO--AggregatefunctionsSELECTtype,SUM(price),SUM(advance)FROMtitlesWHEREtypeLIKE'%cook'GROUPBYtypeORDERBYtypeGO第52页6用户自定义函数内置函数。用户自定义函数可带参数,也可不带,但数据类型不能是时间戳(timestamp)、游标(cursor)和表(table)。1.函数定义利用createfunction语句创建函数。2.函数调用函数调用形式:全部者名.函数名(实参1,…实参n)3.用户函数删除利用dropfunction语句进行函数删除。第53页八、运算符
运算符类别所包含运算符赋值运算符=(赋值)算术运算符+(加)、-(减)、*(乖)、/(除)、%(取模)按位运算符&(位与)、|(位或)、^(位异或)字符串串联运算符(连接)比较运算符=(等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、<>(或!=不等于)、!<(大于)、!>(小于)逻辑运算符all(全部)、and(与)、any(任意一个)、between(二者之间)、exists(存在)、in(在范围内)、like(匹配)、not(非)、or(或)、some(任意一个)一元运算符、+(正)、-(负)、~(取反)第54页九、表示式各种符号和运算符组合对单个数据进行操作表示式结果数据类型由表示式中组员决定USEnorthwindSELECTOrderID,ProductID,(UnitPrice*Quantity)asExtendedAmountFROM[OrderDetails]WHERE(UnitPrice*Quantity)>10000GO示例第55页十、流控制语言元素语句级:流程控制语句是指那些用来控制程序执行和流程分支命令,在SQLServer中,流程控制语句主要用来控制SQL语句、语句块或者存放过程执行流程。go、print、executeBEGIN…END块IF…ELSE无条件转移GOTOWHILE、break、continueReturnWaitforTry。。。catch行级CASE语句第56页Go语句:是批处理结束语句。批处理是一起提交并作为一个组执行若干sql语句Print语句:向客户端返回用户定义消息printgetdate()Execute:用于执行transact-sql批中命令字符串、字符串或执行以下模块之一:系统存放过程、用户定义存放过程、标量值用户定义函数或扩展存放过程。Sqlserver扩展了execute语句,以使其可用于向链接服务器发送传递命令Executesp_help第57页第58页IF…ELSE语句IF…ELSE语句是条件判断语句,其中,ELSE子句是可选,最简单IF语句没有ELSE子句部分。IF…ELSE语句用来判断当某一条件成立时执行某段程序,条件不成立时执行另一段程序。SQLServer允许嵌套使用IF…ELSE语句,而且嵌套层数没有限制。IF…ELSE语句语法形式IFBoolean_expression
{sql_statement|statement_block}
[ELSE
{sql_statement|statement_block}]第59页例:下面示例显示带有语句块IF条件。假如书平均价格不低于$15,那么就显示文本:平均价格超出$15.USEpubsGOIF(SELECTAVG(price)FROMtitlesWHEREtype='mod_cook')<$15
BEGINPRINT‘以下是当代烹调类书籍:'PRINT''SELECTSUBSTRING(title,1,35)ASTitleFROMtitlesWHEREtype='mod_cook'ENDELSE
PRINT'平均价格超出$15.'
第60页IF…ELSE语句在实际程序中,IF…ELSE语句中不止包含一条语句,而是一组SQL语句。为了能够一次执行一组SQL语句,这时就需要使用BEGIN…END语句将多条语句封闭起来。其语法格式为:BEGIN
sql_statement
|statement_block
END
第61页GOTO语句GOTO语句能够使程序直接跳到指定标有标识符位置处继续执行,而位于GOTO语句和标识符之间程序将不会被执行。GOTO语句和标识符能够用在语句块、批处理和存放过程中,标识符能够为数字与字符组合,但必须以“:”结尾。GOTO语句语法形式定义标签:
label:改变执行:
GOTOlabel第62页无条件转移(goto)--从sc表中取得sno为“15121”统计个数Declare@maxcounterint,@counterintSelect@maxcounter=count(*),@counter=1FromscWheresno=‘15121’Loop:If@counter<@maxcounterBeginselect@counterset@counter=@counter+1
gotoloopend第63页WHILE..CONTINUE..BREAK语句WHILE…CONTINUE…BREAK语句用于设置重复执行SQL语句或语句块条件。只要指定条件为真,就重复执行语句。其中,CONTINUE语句能够使程序跳过CONTINUE语句后面语句,回到WHILE循环第一行命令。BREAK语句则使程序完全跳出循环,结束WHILE语句执行。WHILEBoolean_expression
sql_statement|statement_block
[BREAK]
sql_statement|statement_block
[CONTINUE]第64页例:一个小循环程序DECLARE@XintSET@X=0 WHILE@x<3BEGIN
SET@x=@X+1
PRINT'x='+convert(char(1),@x)--类型转换函数convert
ENDGO执行结果:x=1x=2x=3第65页【例】利用循环计算1+2+3+…+99+100值。在查询分析器中运行以下命令:DECLARE@sumint,@iintSET@sum=0SET@i=1WHILE@i<=100BEGINSET@sum=@sum+@iSET@i=@i+1ENDPRINT@sum运行结果为:5050。第66页【例】利用WHILE循环计算当前时间距离年1月1日之间天数。在查询分析器中运行以下命令:DECLARE@numint,@sjDATETIMESET@sj=GETDATE()PRINT'当前时间为:'+CAST(@sjASCHAR(20))SET@num=0WHILE1=1BEGINSET@sj=DATEADD(day,1,@sj)SET@num=@num+1IFDATEPART(yy,@sj)=
BREAKENDPRINT'距离年1月1日还有'+CAST(@numASVARCHAR(10))+'天'第67页Waitfor语句语法:waitfordelay时间|time时间Delay用来设定等候时间Time用来设定等候结束时间点时间必须是datetime类型数据,如14:25:36,不能包含日期--系统等候2小时30分钟后执行Waitfordelay‘2:30:0’Select*fromstudent第68页Try…catch类似于c++和c#异常处理功效。用来处理transact-sql代码中错误。UsestudbGoBegintrydeclare@erintset@er=0select3/@er--产生除数为0错误EndtryBegincatchselecterror_number()asenumber,error_severity()aseseverity,error_procedure()asepro,error_state()asestate,error_line()aseline,error_message()asemessEndcatchgo第69页CASE函数CASE函数能够计算多个条件式,并将其中一个符合条件结果表示式返回。CASE函数按照使用形式不一样,能够分为简单CASE函数和搜索CASE函数。第70页CASE搜索函数:CASE
WHENBoolean_expressionTHENresult_expression
[...n]
[
ELSEelse_result_expression]
END第71页简单CASE函数:
CASEinput_expression
WHENwhen_expressionTHENresult_expression
[...n]
[ELSEelse_result_expression]
END【例】依据系统时间判断当前日期所对应星期值而且输出结果。在查询分析器中运行以下命令:DECLARE@dtDATETIMESET@dt=DATEPART(w,GETDATE())SELECTCASE@dtWHEN1THEN'星期天' WHEN2THEN'星期一' WHEN3THEN'星期二' WHEN4THEN'星期三' WHEN5THEN'星期四' WHEN6THEN'星期五' WHEN7THEN'星期六'
END该实例中,首先经过DATEPART函数取得当前时间所对应星期数,范围为1至7,其中1代表星期天,7代表星期六,结构一个条件分支。然后将系统星期数值经过CASE函数转换为对应字符串信息并显示结果。第72页例:显示各读者可借书数量。USELibraryGOSELECTRname,rt.TypenameAS类型,限借阅量=
CASEr.TypeID
WHEN3THEN'能够借x本书!' WHEN2THEN'能够借y本书!' WHEN1THEN'能够借z本书!' ELSE'无要求'ENDFROMReaderr,ReaderTypertWHEREr.TypeID=rt.TypeIDGO第73页【例】取得系统时间,而且判断当前时间在一天中所处时间段,而且在查询分析器中输出提醒信息。在查询分析器中运行以下命令:DECLARE@sjDATETIMESET@sj=DATEPART(hh,GETDATE())SELECTCASEWHEN@sj>=20and@sj<24THEN'晚上'WHEN@sj>=14and@sj<20THEN'下午'WHEN@sj>=12and@sj<14THEN'中午'WHEN@sj>=10and@sj<12THEN'早晨'WHEN@sj>=0and@sj<10THEN'临晨'END本例中首先经过DATEPART函数取得当前时间中小时数,并保留在@sj变量中,然后结构CASE函数,用于确定不一样条件分支。将变量@sj分别与CASE函数中条件依次进行比较,直到满足条件时输出结果。第74页阅读以下程序,功效?DECLARE@ntinyintSET@n=5IF(@nBETWEEN4and6)BEGINWHILE(@n>0)BEGINSELECT@nAS'Number',CASEWHEN
(@n%2)=1
THEN‘ODD'
ELSE‘EVEN'
ENDAS'Type'SET@n=@n-1ENDENDELSEPRINT'NOANALYSIS‘GO第75页CASE派生函数COALESCE
返回表示式列表中第一个非NULL表示式NULLIF
假如两个表示式相等返回NULL,不然返回第一个表示式ISNULL假如第一个表示式为非NULL,返回第一个表示式,不然返回第二个表示式COALECSE(表示式1,表示式2,…,表示式n)NULLIF(表示式1,表示式2)ISNULL(表示式1,表示式2)第76页十一、游标使用什么是游标游标是取用一组数据并能够一次与一个单独统计进行交互方法。SQL是面向集合,行集是由SQL产生或处理多条统计集合。有时,确实不能经过在整个行集中修改或者甚至选取数据来取得所需要结果,需要逐一处理这些行。第77页游标使用需要不止一个语句。主要部分有:申明;打开;使用或导航;关闭;释放。第78页申明游标基本语法以下所表示:DECLARE<游标名>CURSORFOR<SELECT语句>游标名除了不需要“@”前缀外,与任何其它变量名一样,游标名必须服从SQLServer命名规范。SELECT语句能够是任何有效返回结果集SELECT语句。要注意,一些结果集是不可更新。只申明游标是不够,我们还必须打开它:OPEN<游标名>会执行作为FOR子句对象查询,不过在我们能够使用地方,依然没有任何东西。必须进行以下两件事情:获取(或FETCH)第一条统计;有必要话,循环,获取其余统计。第79页发出第一个FETCH——这是一个表明要检索特定统计命令。另外,还必须说明想要把值放置在哪一个变量中。FETCHNEXTFROM游标名称INTO变量名1,变量名2,变量名3,...现在,有了第一条统计,接下来,我们能够执行游标集上操作:WHILE@@FETCH_STATUS=0 BEGIN SQL语句执行过程...... FETCHNEXTFROM游标名称INTO变量名1,变量名2,变量名3,... END第80页每当提取一行时,就会更新@@FETCH_STATUS以通知我们提取进行得怎样。其可能值是:0Fetch语句成功——一切正常;-1Fetch语句失败——找不到统计(还没有抵达游标末尾,但自打开游标以后,统计已经被删除),很快将在本章后面做深入讨论;-2Fetch语句失败——这一次是因为已经超出了游标中最终一条(或者第一条)统计,一样,在本章后面将更详细地讨论。依据这里目标可知,一旦退出循环,说明我们已经完成了对游标使用,所以,关闭游标:CLOSE游标名称然而,关闭游标并没有释放与游标相关联内存。关闭游标只是释放了与游标相关联锁。为了确保完全释放游标使用全部资源,必须释放游标:DEALLOCATE游标名称第81页使用游标--游标普通格式:DECLARE
游标名称CURSORFORSELECT字段,字段,字段,...FROM表名WHERE...OPEN
游标名称FETCHNEXTFROM游标名称INTO变量名,变量名,变量名,...WHILE@@FETCH_STATUS=0 BEGIN SQL语句执行过程...... FETCHNEXTFROM游标名称INTO变量名,变量名,变量名,... ENDCLOSE游标名称DEALLOCATE游标名称第82页--使用游标打印输出学生学号DECLARE@XHVARCHAR(10)DECLARESTUCURCURSORFORSELECTSNOFROMSTUDENTOPENSTUCURFETCHNEXTFROMSTUCURINTO@XHWHILE@@FETCH_STATUS=0BEGINPRINT@XHFETCHNEXTFROMSTUCURINTO@XHENDCLOSESTUCURDEALLOCATE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 油气田开发项目全过程咨询、管理与技术服务考核试卷
- 2025年版关于办公室装修合同范本下载
- 2025设备租赁合同空白合同
- 2025电缆线路维修合同
- 2025年合作协议制作与发布合同
- 2025《中文劳动合同范本》
- 隧道、洞室工程暗挖专项施工方案编制
- 二零二五门面租房合同书模板
- 二零二五劳动合同法服务期期限是多长时间
- 二零二五聘用教师合同范例
- 2025陕西建筑安全员C证(专职安全员)考试题库
- 2025年上半年福建福州广播电视台招聘重点基础提升(共500题)附带答案详解
- 消毒供应中心规范培训
- 2025重庆华地资环科技有限公司校园招聘9人笔试参考题库附带答案详解
- 易制毒化学品销售人员岗位职责
- 小区二次供水水箱清洗消毒的监督流程课件
- 自主智能系统知到课后答案智慧树章节测试答案2025年春哈尔滨工程大学
- GB/T 6433-2025饲料中粗脂肪的测定
- 2019版 浙科版 高中生物学 必修2 遗传与进化《第二章 染色体与遗传》大单元整体教学设计2020课标
- 【MOOC期末】《介入放射学》(东南大学)中国大学慕课答案
- DB50T 771-2017 地下管线探测技术规范
评论
0/150
提交评论