




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章 用T-SQL编程第9章 用T-SQL编程 本章学习目标Transact-SQL相对于ANSI SQL最大的不同在于它提供了丰富的编程结构。灵活使用这些编程的控制结构,用户就可以实现任意复杂的应用规则,从而可以编出任意复杂的查询控制语句。在SQL-Server 2000中,用户还可以使用T-SQL语句编写服务器端的程序,这些程序由批处理、注释、程序中使用的变量、改变批中语句的执行顺序的流控制语言、错误和消息的处理等成分组成。本章主要对使用T-SQL语句编程方面的内容进行详细的讲解,在讲解的过程中采用循序渐进的方式,首先对多条语句的执行过程进行讲解,以激发读者的学习兴趣,接下来才对编程中具体涉及到的变量、语句、函数以及事务进行详细讲解。通过对本章的学习,读者应熟悉在SQL Server中执行多条语句的方式,熟悉变量以及事务等的定义、应用或调用,并能掌握使用各种流控制语句进行编程的方法。 学习重点与难点 执行多条T-SQL语句 变量和流控制语句 系统函数和用户自定义函数 事务及SQL-Server的锁机制91 执行多条T-SQL语句当要完成的任务不能由单独的T-SQL语句来完成时,SQL Server提供了批、脚本、存储过程以及触发器等几种方式来组织多条T-SQL语句。本节着重介绍批和脚本的内容,而关于存储过程和触发器的内容将在后面两章讨论。9.1.1 批所谓批,是从客户机传递到服务器上的一组完整的数据和SQL指令。一个批是由一条或多条T-SQL语句组成的语句集,这些语句一起提交给服务器并在服务器端作为一个整体来执行。SQL Server将批中的语句作为一个整体编译为一个执行计划。因为批中的语句是作为一个整体提交给服务器的,所以可以节省系统开销。在查询分析器中,使用“GO”命令标志一个批的结束。GO不是通用的T_SQL语句,它的作用只是通知查询分析器有多少语句包含在当前批中,查询分析器将两个GO之间的语句组成一个字符串交给服务器去执行。基于ODBC或OLE DB应用程序编程接口的应用程序在试图执行GO语句时,会产生一个错误。例如,下面的例子包括三个批:CREATE TABLE doc_exd ( column_a INT) GOINSERT INTO doc_exd VALUES (-1)GOALTER TABLE doc_exd WITH NOCHECK ADD CONSTRAINT exd_check CHECK (column_a 1)因为SQL Server为一个批生成一个单独的执行计划,所以一个批本身应该是完整的。不能在一个批中引用其他批定义的变量,也不能将注释从一个批开始,在另一个批中结束。下面的一组语句执行时就会出错:USE NorthwindGODECLARE MyVar INT/*Start of the split comment.GOEnd of the split comment */SELECT MyVar=29GO在查询分析器中执行这组语句会返回以下错误信息:缺少注释的结尾标记 */。在关键字 End 附近有语法错误。必须声明变量 MyVar。SQL Server统一优化、编译和执行一个批中的语句。如果在批中的语句出现编译错误(如语法错误),那么将不能生成执行计划,该批中的任何一个语句都不会被执行。有些情况下,如果在SQL指令中存放着一些像数据类型无法自动转换等错误的时候,编译器无法识别这些错误。在这种情况下,这个批处理只有在执行过程中才会出错。一般说来在这个错误指令以前的所有指令都会执行成功。在错误指令以后的指令将会视错误指令所引起的错误严重程度而决定是否执行下去。如果出现了运行时期的错误(比如违反约束或数字溢出),这时可能会有两个结果:u 多数运行时错误将停止执行批处理中当前语句和它之后的语句。u 少数运行时错误(如违反约束)仅停止执行当前语句,而继续执行批中其它语句。 无论是哪种运行时期错误,在出错语句之前的语句的执行结果不会受到影响。惟一的例外是如果批处理在事务中而且错误导致事务回滚。批有如下一些限制:u CREATE DEFAULT、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER 和 CREATE VIEW 语句不能与其他语句位于同一个批中。u 不能在同一个批处理中修改一个表的结构,然后引用刚修改的新列。u 如果批的第一条语句是EXECUTE(执行) 语句,则 EXECUTE 关键字可以省略,否则,不能省略。 9.1.2 脚本脚本是一系列顺序提交的批,由这些批组成的一系列T-SQL语句存储在一个文件中,该文件可以在查询分析器中执行。执行脚本就是依次执行其中的T-SQL语句。脚本用于保存重新创建数据库对象或重复执行的语句,可以使用查询分析器或任何文本编辑器编写,带.sql扩展名保存。一个脚本可以包含一个或多个批,脚本中的GO命令标志一个批的结束,如果一个脚本中没有包括任何GO命令,那么它被视为整个是一个批。脚本一般可以用于两个方面:将服务器上创建一个数据库的步骤永久地记录在脚本文件中。将语句保存为脚本文件,从一台计算机传递到另一台,这样可以方便地使两台计算机执行同样的操作。92 变量变量用于临时存放数据,其中的数据随着程序的运行而变化,变量有名字及数据类型两个属性。变量名用于标识该变量,数据类型确定了该变量存放值的格式以及允许的运算。变量名必须是一个合法的标识符。在SQL Server中标识符分为两类:(1)常规标识符。以ASCII字母、Unicode字母、下划线(_)、或#开头,后继可跟一个或若干个ASCII字符、Unicode字符、下划线(_)、美元符号($)、或#,但不能全为下划线(_)、或#。常规标识符不能是T-SQL保留字。常规标识符中不允许嵌入空格或其他特殊字符。(2)分隔标识符。包括在双引号(“ ”)或方括号( )内的常规标识符或不符合常规标识符规则的标识符。标识符允许的最大长度为128个字符。符合常规标识符规则的标识符可以分隔,也可以不分隔。对不符合标识符规则的标识符必须进行分隔。在SQL Server中变量可分为两类:全局变量和局部变量。9.2.1 局部变量局部变量是作用域局限在一定范围内的T-SQL对象。一般来说,局部变量在一个批处理(也可以是存储过程或触发器)中被声明或定义,然后这个批处理内的T-SQL语句就可以设置这个变量的值,或者是引用这个变量已经被赋予的值。当这个批处理结束后,这个局部变量的生命周期也就随之消亡。局部变量是用户定义的变量,其名字必须以开始。局部变量用于保存单个数据值。局部变量用DECLARE语句声明,所有局部变量在声明后均初始化为NULL。语法格式为:DECLARE varaible_name datatype ,n其中varaible_name为局部变量名,并以开头。Datatype是为该局部变量指定的数据类型。局部变量使用的数据类型可以是除text,ntext或image类型外所有的系统数据类型和用户定义数据类型。一般来说,如果没有特殊的用途,建议在应用时尽量使用系统提供的数据类型。这样做可以减少维护应用程序的工作量。例1、声明一个字符形变量E-mail,使用如下语句:DECLARE E_mail varchar(50)在一条DECLARE语句中可以声明多个局部变量,变量之间用逗号分隔。例2、下面语句声明三个局部变量:DECLARE lastname varchar(30),firstname varchar(20),tel varchar(30)当声明局部变量后,可用SET或SELECT语句为其赋值。1、用SET语句为局部变量赋值一个SET语句只能给一个变量赋值。其语法格式为:SET varaible_name=expression其中varaible_name为局部变量名。Expression为任何有效的SQL Server表达式。例3、创建两个局部变量pub_id和hire_date并赋值,然后在employee表中进行查询。USE pubsGODECLARE pub_id char(4), hire_date datetimeSET pub_id = 0877SET hire_date = 1/01/93SELECT fname, lnameFROM employeeWHERE pub_id = pub_id and hire_date = hire_date例4、使用查询给变量赋值。USE PubsGODECLARE rows intSET rows=(SELECT COUNT(*) FROM authors)GO2、用SELECT语句为局部变量赋值使用SELECT语句为局部变量赋值的语法格式为:SELECT varaible_name=expression ,n其中n表示可以给多个变量赋值。关于SELECT语句,需要说明以下几点:u SELECT varaible_name通常用于将单个值返回到变量中,如果expression为列名,则返回多个值,此时将返回的最后一个值赋给变量。u 如果SELECT语句没有返回值,变量将保留当前值。u 如果expression是不返回值的标量子查询,则将变量设为NULL。u 一个SELECT语句可以初始化多个局部变量。例5、先声明一个局部变量然后赋值,再将查询到的结果赋值给变量。由于查询语句没有返回值,所以变量保留当前值。USE SalesDECLARE var1 nchar(20)SELECT var1=刘三SELECT var1=姓名FROM CustomersWHERE 电话=85697451SELECT var1在查询分析器中执行这组语句,返回结果如图9-1所示:图9-1 SELECT语句没有返回值时,变量将保留当前值例6、当返回多个值时将最后一个值赋给变量。USE SalesDECLARE var1 nchar(20)SELECT var1=刘三SELECT var1=姓名FROM CustomersWHERE 电话 LIKE8%SELECT var1返回结果如图9-2所示:图9-2 返回多个值时将最后一个值赋给变量例7、赋值语句是不返回值的子查询,将变量赋值为NULL。DECLARE var1 nchar(20)SELECT var1=刘三SELECT var1=(SELECT 姓名FROM CustomersWHERE 电话=86957458)SELECT var1返回结果如图9-3所示:图9-3 赋值语句是不返回值的子查询,将变量赋值为NULL9.2.2 全局变量全局变量是用来记录SQL Server服务器活动状态的一组数据,是SQL Server系统提供并赋值的变量,用户不能建立全局变量,也不能给全局变量赋值或直接更改全局变量的值。通常将全局变量的值赋给局部变量,以便保存和处理。全局变量的名字以开始。SQL Server提供的全局变量分为两类:u 与每次处理相关的全局变量。如 rowcount表示最近一个语句影响的行数。u 与系统内部信息有关的全局变量。如version表示SQL Server的版本号。SQL Server一共提供了30多个全局变量。下面是一些常用全局变量的功能和使用方法。u CONNECTIONS:记录自最后一次服务器启动以来,所有针对此服务器进行连接数目,包括没有连接成功的尝试。使用CONNECTIONS可以让系统管理员很容易地得到今天所有试图连接本服务器的连接数目,例如:SELECT GETDATE() AS 时间,CONNECTIONS AS 连接数目 系统返回结果为:图9-4 用CONNECTIONS查询连接次数u CPU_BUSY:记录自最后一次服务器启动后,以ms为单位的CPU工作时间。u CURSOR_ROWS:返回在本次服务器连接中,打开游标取出数据行的数目。u DBTS:返回当前服务器中timestamp数据类型的当前值。u ERROR:返回执行上一条Transact-SQL语句所返回的错误号。在SQL Server服务器执行完一条语句后,如果该语句执行成功,则将返回ERROR的值为0,如果该语句执行过程中发生错误,则将返回错误信息,而ERROR将返回相应的错误编号,该标号将一直保持下去,直到下一条语句得到执行为止。在编写存储过程时,应该经常主动检查ERROR的值,特别是在对数据库进行了修改以后。如果返回的ERROR值非0,则表示发生了错误,应该采取相应的措施进行补救。又由于ERROR的值将会随着每一个SQL语句的执行而发生变化,所以应该在每次SQL语句执行完后,马上进行ERROR数值的检查。例如下面的程序语句:USE PubsGODECLARE del_error int,ins_error int-开始事务BEGIN TRAN-执行删除命令DELETE authorsWHERE au_id=409-56-16088-捕获执行完删除操作后的ERROR变量的值SELECT del_error=ERROR-执行插入操作INSERT authorsVALUES(“409-56-16088”,”Bennet”,”Abraham”,”416 658-9932”,”6223 Bateman ST.”,“Berkeley”,”CA”,”941605”,1)-捕获执行完插入操作后的ERROR变量的值SELECT ins_error=ERROR-测试捕获到的ERROR的值IF del_error=0 AND ins_error=0BEGIN-成功执行确定事务的操作PRINT “The author information has been replaced”COMMIT TRANENDELSEBEGIN-有错误发生,检查究竟是哪个语句有问题-然后回滚整个事务IF del_error0Print “An error occurred during execution of the DELETE statement.”IF ins_error0Print “An error occurred during execution of the INSRET statement.”ROLLBACK TRANENDGO在这个例子的一个事务中包含了两个操作,程序在每次数据库操作后都检查了ERROR全局变量的值。如果两个操作都正常结束,则确定这的事务,但是如果有一个操作出现问题,就回滚整个事务,使两个操作一个都不成功。这个例子带和很强的代表性,因为类似的问题在数据库编程过程中会经常用到。u FETCH_STATUS:返回上一次使用游标FETCH操作所返回的状态值。返回值为0表示操作成功;返回值为-1表示操作失败或已经超出了游标所能操作的数据行的范围;返回值为-2表示返回的值已经丢失。u IDENTITY:返回最近一次插入的identity列的数值。u IDLE:返回以ms为单位计算的SQL Server服务器自最近一次启动以来处于停顿状态的时间。u IO_BUSY:返回以ms为单位计算的SQL Server服务器自最近一次启动以来花在输入和输出上的时间。u LOCK_TIMEOUT:返回当前对数据锁定的超时设置。u PACK_RECEIVED:返回一共向网络上接受数据分组的数目。u PACK_SENT:返回自最近一次启动以来一共向网络上发送数据分组的数目。u PROCID:返回当前存储过程的ID标识。u REMSERVER:返回在登录记录中记载远程SQL Server服务器的名字。u ROWCOUNT:返回上一条SQL语句所影响到数据行的数目。对所有不影响数据库数据的SQL语句,这个全局变量返回的结果为0。在进行数据库编程时,经常要检测ROWCOUNT的返回值,以便明确所执行的操作是否达到了目标。u SPID:返回当前服务器进程的ID标识。u TOTAL_ERRORS:返回自SQL Server服务器启动后,所遇到读写错误的总数。u TOTAL_READ:返回自SQL Server服务器启动以来,读磁盘的次数。u TOTAL_WRITE:返回自SQL Server服务器启动以来,写磁盘的次数。u TRANCOUNT:返回当前连接中,处于活动状态事务的数目。u VERSION:返回当前SQL Server服务器的安装日期、版本及处理器的类型。9.2.3 注释注释是程序中不被执行的正文。注释的作用有两个:(1)说明代码的含义,增强代码的可读性;(2)可以把程序中暂时不用的语句注释掉,使它们暂时不被执行,等需要这些语句时,再将它们恢复。SQL Server的注释有两种:u /* */ :用于注释多行,中间为注释;注意多行注释不能跨批。u -(两个减号): 用于注释单行。该内容在前面以及后面的相关例子中都有使用,因此这里就不再举例了。93 流控制语句流控制语句是T-SQL语言对ANSI92 SQL标准的扩充,它可以用来控制一个批、存储过程或触发器中T-SQL语句的执行顺序。T-SQL的流控制关键字包括:BEGINEND、WAITFOR、GOTO、WHILE、IFELSE、BREAK、RETURN、CONTINUE等。9.3.1 IFELSE条件判断语句在程序中如果要对给定的条件进行判定,当条件为真或假时分别执行不同的T-SQL语句,可用IF ELSE语句实现。IF ELSE语句的语法格式为:IF logical_expressionexpression1 ELSEexpression2 如果逻辑判断表达式返回的结果是真,那么程序会执行expression1;如果逻辑判断表达式返回的结果是假,那么程序会执行expression2。ELSE和expression2并不是必须的,如果没有ELSE和expression2,那么当逻辑判断表达式返回的结果是假时,就什么操作也不做。在SQL Server中可使用嵌套的IF ELSE条件判断结构,而且对嵌套的层数没有限制。如果在IF ELSE语句的IF区和ELSE区都使用了CREATE TABLE语句或SELECT INTO语句,那么CREATE TABLE语句或SELECT INTO语句必须使用相同的表名。IF ELSE语句可用在批处理、存储过程(经常使用这种结构测试是否存在某个参数)及特殊查询中。例如,判断Pubs数据库的authors表中是否有记录的语句如下:USE PubsIF(SELECT COUNT(*) FROM authors)=0PRINT 没有记录ELSEPRINT 存在记录IF和ELSE只对后面的一条语句有效,如果IF或ELSE后面要执行的语句多于一条,那么这些语句需要用BEGINEND括起来组成一个语句块。下面的例子即用于判断Sales数据库的Goods表中是否有货品为CPU的货品记录,如果有,则显示“此货品存在”,并查询此货品库存量。USE SalesIF EXISTS(SELECT *FROM GoodsWHERE 品名=CPU)BEGINPRINT 此货品存在SELECT 品名,库存量FROM GoodsWHERE 品名=CPUEND9.3.2 BEGINEND语句块使用BEGINEND关键字可以将一组T-SQL语句封装成一个完整的SQL语句块。关键字BEGIN定义T-SQL语句块的起始位置,关键字END标识同一块T-SQL语句的结尾。SQL Server允许使用嵌套的BEGINEND语句块。其语法格式为:BEGINlogical_expressionEND下面是一个使用BEGINEND语句块的例子:USE PubsGO/*声明用于发布消息的变量*/DECLARE message varchar(255)/*进行逻辑判断*/IF EXISTS(SELECT PriceFROM titlesWHERE title_id LIKE BU% AND price$20)BEGINSET message=价格适中的书籍:PRINT messageSELECT titleFROM titlesWHERE price$20ENDELSE BEGINSET message=价格较贵的书籍:PRINT messageSELECT titleFROM titlesWHERE title_id LIKE BU% AND price$10ENDGO首先判断是否存在书价低于$20的书,如果存在就显示这些书的名字,这是一个封装起来的语句块,如果不存在就执行另一个语句块。9.3.3 WHILE循环语句WHILE语句的功能是在满足条件的情况下,重复执行同样的语句。其语法格式为:WHILE logical_expressionBEGINexpressionBREAKCONTINUEEND当逻辑判断表达式为真时,服务器将重复执行SQL语句组。BREAK的作用是在某些情况发生时,立即无条件地跳出循环,并开始执行紧接在END后面的语句。CONTINUE的作用是在某些情况发生时,跳出本次循环,开始执行下一次循环。下面就是一个使用WHILE语句的例子。USE PubsGOWHILE NOT EXISTS(SELECT price FROM titlesWHERE price$50BREAKELSECONTINUEENDPRINT 书价太贵了本例在没有查询到存在书价超出$30的情况下,反复执行BEGINEND语句块中的内容:首先将所有书的价格提高50%,并在存在最高价超过$50的情况下,跳出循环。9.3.4 CASECASE结构提供比IFELSE结构更多的选择和判断的机会。使用CASE语句可以很方便的实现多重选择的情况,从而可以避免编写多重的IFELSE嵌套循环。CASE结构有两种形式:即简单表达式和选择表达式。1、 简单表达式简单表达式的语法格式如下:CASE input_expressionWHEN when_expression THEN result_expression nELSE else_result_expressionEND其中,input_expression微微用于做条件判断的表达式;when_expression用于与input_expression比较,当与input_expression的值相等时执行后面的result_expression语句。当没有一个when_expression与input_expression的值相等时执行else_result_expression语句。下面即为一个简单表达式例子:USE pubsGOSELECT Category = CASE type WHEN popular_comp THEN Popular Computing WHEN mod_cook THEN Modern Cooking WHEN business THEN Business WHEN psychology THEN Psychology WHEN trad_cook THEN Traditional Cooking ELSE Not yet categorized END, CAST(title AS varchar(25) AS Shortened Title, price AS PriceFROM titlesWHERE price IS NOT NULLORDER BY type, priceCOMPUTE AVG(price) BY type2、选择表达式选择表达式的语法格式如下:CASEWHEN boolean_expression THEN result_expression nELSE else_result_expressionEND如果boolean_expression的值为True,就执行result_expression语句。如果没有一boolean_expression的值为True,则执行else_result_expression语句。下面即为一个选择表达式的例子:USE pubsGOSELECT Price Category = CASE WHEN price IS NULL THEN Not yet pricedWHEN price = 10 and price 20 THEN Coffee Table TitleELSE Expensive book!END,CAST(title AS varchar(20) AS Shortened TitleFROM titlesORDER BY price9.3.5 GOTOGOTO语句使一个批的执行转到另一个有标号的语句。GOTO语句和标号之间的语句永远不会被执行。其语法格式如下:GOTO label例如在Customers表中查询姓名为“王飞”的记录,如果存在就显示出“姓名”和“职位”,如果不存在就跳出。USE SalesIF (SELECT COUNT(*)FROM CustomersWHERE 姓名=王飞)=0GOTO NOACTIONSELECT 姓名,职位FROM CustomersWHERE 姓名=王飞NOACTION:PRINT 记录不存在9.3.6 RETURNRETURN语句可以在过程、批和语句块中的任何位置使用,作用是无条件地从过程、批或语句块中退出,在RETURN之后的其他语句不会被执行。使用RETURN语句的语法格式为:RETURN intger_expression其中,intger_expression是一个整型表达式。一般情况下,只有在存储过程中才会用到返回的整型结果,调用存储过程的语句可以根据RETURN返回的值,判断下一步应该执行的操作。除非专门说明,在SQL Server中,系统存储过程返回值为0时,表示调用成功,否则就是有问题发生。RETURN语句的具体用法在“存储过程”中详述。9.3.7 WAITFORWAITFOR语句可以将它之后的语句在一个指定的间隔之后执行,或在未来的某一个只时间执行。其语法格式如下:WAITFOR DELAY time| TIME time其中DELAY time用于指定 SQL Server必须等待的时间,最长可达24小时,time可以用datetime数据格式指定,用单引号括起来,但在值中不允许有日期部分,也可以用局部变量指定参数。TIME time 指定 SQL Server等待到某一时刻,time值的指定同上。执行WAITFOR语句后,在到达指定的时间之前,将无法使用与SQL Server的连接。若要查看活动的进程和正在等待的进程,使用sp_who。例如,等待2秒后查询Customers表。WAITFOR DELAY 00:00:02SELECT *FROM Sales.dbo.Customers又如,等待到当天15:04:45才执行查询。WAITFOR TIME 15:04:45SELECT *FROM Sales.dbo.Customers9.3.8 PRINT和RAISERROR1、PRINT语句PRINT语句的作用是在屏幕上显示用户信息。其语法格式为:PRINT string|local_variable|global_variable其中string可以是一字符串。local_variable和global_variable分别代表一个局部变量和一个全局变量,它必须是char或varchar类型,或可以隐式转化成char或varchar类型。例如:PRINT This message was printed on + RTRIM(CONVERT(varchar(30), GETDATE()2、RAISERROR语句RAISERROR是一个比PRINT功能更强大的返回信息的语句,它的作用是将错误信息显示在屏幕上。同时也可以记录在NT日志中。RAISERROR可以返回以下两种类型的信息:u 保存在sysmessages系统表中的用户自定义错误信息,在RAISERROR语句中用错误号表示。自定义错误信息用sp_addmessage系统存储过程添加到sysmessages系统表中。u RAISERROR语句中以字符串形式给出的错误信息。前面之所以说RAISERROR比PRINT强大,是因为RAISERROR能提供一些在PRINT中没有的功能,具体包括:(1)RAISERROR能给返回的信息指定的错误号、错误严重等级和状态。(2)RAISERROR可以要求该错误被记录在SQL Server错误日志和Windows NT应用程序日志中。(3)RAISERROR中的信息字符串可以像C语言中的printf语句一样有包含替换符的变量和参数。RAISERROR语句的语法格式为:RAISERROR ( msg_id | msg_str , severity , state , argument ,.n ) WITH option ,.n 其中:u msg_id是sysmessages系统表中用户自定义错误信息的错误号。错误号需通过系统存储过程sp_addmessage事先设置在sysmessages表中。任何用户自定义错误号都应大于50000。u msg_str是指直接给出的错误消息。msg_str可以是像C语言中的printf语句一样的格式化字符串。这种在RAISERROR语句中直接给出错误信息的错误号为50000。该错误号被保存在ERROR全局变量中。u severity是指错误的严重级别。用户可以使用从 0 到 18 之间的严重级别。19 到 25 之间的严重级别只能由 sysadmin 固定服务器角色成员使用。若要使用 19 到 25 之间的严重级别,必须选择 WITH LOG 选项。注意:20 到 25 之间的严重级别被认为是致命的。如果遇到致命的严重级别,客户端连接将在收到消息后终止,并将错误记入错误日志和应用程序日志。u state是指发生错误时的状态信息。可以是1到127之间的任意整数。u 错误的自定义选项。option 可以是LOG、NOWAIT以及SETERROR中的任何一个值。其中各个值及其相关描述如表9-1所示:表9-1 option各种取值及其相关描述值描述LOG将错误记入服务器错误日志和应用程序日志。记入服务器错误日志的错误目前被限定为最多 440 字节。NOWAIT将消息立即发送给客户端。SETERROR将 ERROR 的值设置为 msg_id 或 50000,与严重级别无关。例如,在屏幕上显示一条信息,信息中给出了当前使用的数据库的标识号和名称。信息是在语句中直接给出的,使用了格式化字符串。DECLARE dbid intSET dbid=DB_ID()DECLARE dbname nvarchar(128)SET dbname=DB_NAME()RAISERROR(The current database ID is:%d, the database name is : %s., 16,1, dbid,dbname) 将上例中的错误信息保存到SYSMESSAGE系统表中,然后在RAISERROR语句中用错误号调用。Sp_addmessage 50001,16, The current database ID is:%d, the database name is : %s.,us_englishGoDECLARE dbid intSET dbid=DB_ID()DECLARE dbname nvarchar(128)SET dbname=DB_NAME()RAISERROR(5001,16,1, dbid,dbname) 94 函数为了使用户对数据库进行查询和修改时更加方便,SQL Server在T-SQL中提供了许多内部函数以供用户调用。使用Transact-SQL函数的方法很简单,在T-SQL语句中引用这些函数,并提供调用函数所需的参数,服务器根据参数执行系统函数,然后返回正确的结果。T-SQL提供的函数可以分为:数学函数、字符串函数、日期函数、系统函数、统计函数及其他函数。此外,用户还可以自定义函数。9.4.1 数学函数SQL Server提供的数学函数能够在数学型表达式上进行数学运算,然后将结果或结果集返回给用户。能在SQL Server的数学函数中使用的数据类型包括:decimal、integer、float、real、money、smallmoney、smallint和tinyint。在默认情况下,数学函数吧传递给它的数字当作十进制整数对待。在SQL Server中,数学运算的顺序与普通数学运算一致,即:(1)执行括号里的运算;(2)执行乘方与开方运算;(3)按先乘除后加减的规则进行运算;(4)执行逻辑运算。下面就来介绍一些常用的SQL Server数学函数。u ABS(数值型表达式):求绝对值函数。返回数值型表达式的绝对值,返回值的数据类型与输入参数的数据类型一致。例如:SELECT ABS(-45.4)u ACOS(float 型表达式):反余弦函数。返回以弧度为单位的角度值,参数为real或float数据类型。u ASIN(float 型表达式):反正弦函数。返回以弧度为单位的角度值,参数为real或float数据类型。u ATAN(float 型表达式):反正切函数。返回以弧度为单位的角度值,参数为real或float数据类型。u ASII(字符型表达式):求ASII码函数。返回制服型数据类型的ASII值,返回的数值类型为整型。例如:SELECT ASII(”H”)u AVG(ALL|DISTINCT表达式):求平均值函数。求一组数据的平均值,如果这组数据中包含有NULL的数据,该数据将会被忽略。ALL关键字表示所有的数值将会计算在内,DISTINCT关键字表示相同实质的数据将只会计算一次,默认取值为ALL。例如:USE PubsSELECT AVG(advance)FROM titlesWHERE type=businessu COUNT(ALL|DISTINCT |*表达式):记数函数。求一组数据的个数,ALL和DISTINCT关键字的意义同上。COUNT(*)返回这一组里所有的数据,包括重复数值和NULL。例如:USE PubsSELECT COUNT(DISTINCT city),COUNT(ALL city)FROM authorsu DEGREES(numeric型表达式):角度转换函数。将以numeric型表达式给出的弧度转换成叫的类型的数值。u CEILING(数值型表达式):返回最小的大雨或等于给定数值型表达式的整数值。返回值的数据类型与参数的数据类型相同。u FLOOR(数值型表达式):返回最大的小于或等于给定数值表达式的整数值。返回值的数据类型与参数的数据类型相同。u LOG(float 型表达式):求自然对数函数。返回给定参数值的自然对数结果。u LOG10(float 型表达式):求常用对数函数。返回给定参数值的常用对数结果。u POWER(数值型表达式1,数值型表达式2):乘方运算函数。进行乘方运算,POWER(2,3)表示2的3次方。乘方运算函数返回值的数据类型与第一个参数的数据类型相同。SQL Server支持负数的乘方运算。由于返回值第一个参数的数据类型相同,所以当第一个参数为整数时,返回值被转换成了整数(0.125转换成整数是0),当第一个参数的一位小数时,返回值也相应保留一位小数。u EXP(float 型表达式):求自然指数运算。求指定float表达式的自然指数值。u PI():求圆周率运算。不使用参数,返回圆周率的常量值。u SQRT(float 型表达式):求指定float表达式的平方根,返回float型的结果。u SQUARE(float 型表达式):求平方值。返回指定float表达式的平方,返回float型的结果。u SIGN(数值型表达式):判断相应数值表达式的正负属性。在SQL Server中用+1表示正数,用-1表示负数。u RAND(整型表达式):产生随机数。返回一个位于0和1之间的随机数。整型表达式在这里起着产生随机数的起始值的作用。例如下面的语句:DECLARE COUNTER SMALLINTSET COUNTER=1WHILE COUNTER5BEGINSELECT RAND(COUNTER)SET COUNTER=COUNTER+1ENDGO此例产生4个随机数,分别使用1、2、3、4来作为各自随机数的起始值。u ROUND(数值型表达式,整数):四舍五入。将数值表达式四舍五入成整数指定精度的形式。在这里,整数可以是正数或负数,正数表示要进行运算的位置在小数点后,反之要运算的位置在小数点前。9.4.2 字符串函数Transact-SQL为方便用户进行字符型数据的操作,提供了功能全面的字符串函数。下面是一些常见的字符串函数及其功能介绍:u LEN(字符型表达式):返回给定字符串数据的长度。u DATALENGTH(表达式):返回该表达式的值所占用的字节数。在处理变长度数据类型时使用DATALENGTH非常有用。例如:LEN函数和DATALENGTH函数的比较。SELECT LEN(123),DATALENGTH(123),DATALENGTH(12345)返回结果是:3 3 4u LEFT(字符型表达式,整型表达式):返回该字符型表达式最左边给定整数个字符。例如:SELECT LEFT(Good morning,4)返回结果是:Goodu RIGHT(字符型表达式,整型表达式):返回该该字符型表达式最右边给定整数个字符。例如SELECT RIGHT(Good morning,7)返回结果是:morning(字符串,表示开始位置的表达式,表示长度的表达式)返回该该字符串在起止位置之间的子串。例如:SELECT SUBSTRING(“abcdef”,2,3)返回结果是:bcdu UPPER(字符型表达式):将字符型表达式全部转化为大写形式。u LOWER(字符型表达式):将字符型表达式全部转化为小写形式。u SPACE(整型表达式):返回由给定整数个空格组成的字符串。u REPLICATE(字符型表达式,整型表达式):将给定的字符型表达式的值复制给定的整数遍。例如:SELECT REPLICATE(Good morning,3)返回结果是:Good morningGood morningGood morningu STUFF(字符型表达式1,开始位置,长度,字符型表达式2):将字符型表达式1从开始位置截断给定长度的子串,然后将字符型表达式2从开始位置补充进去。例如:SELECT STUFF(Good morning,4,1,GOD)返回结果是:GooGOD morningu REVERSE(字符型表达式):返回一个与给定字符型表达式恰好顺序颠倒的字符型表达式。例如:SELECT REVERSE(abcdefg)返回结果是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贷款买房合同范本
- 文职岗位申请书
- 2025协议解除劳动合同书范本专业版
- 献爱心的申请书
- 工服押金申请书
- 希望工资高点申请书
- 地标志申请书
- 作业设计项目申请书
- 申请低风险额度申请书
- 安全检查前的安全培训课件
- 2025四川省水电投资经营集团有限公司所属电力公司员工招聘6人考试参考试题及答案解析
- 新疆劳动就业白皮书课件
- 视觉障碍老人护理指南
- 手术室无菌技术操作讲课
- 宠物医院建设方案(3篇)
- 2025年中学生法治素养竞赛题库及答案
- 《“高效办成一件事”2025年度第二批重点事项清单》知识解读
- 2025年飞行器设计与工程师考试试卷及答案
- 2025年三级律师试题题库及答案
- 布控球使用管理办法
- 智能化系统施工方案及技术措施
评论
0/150
提交评论