《中职 数据库应用基础(SQL Server 2016)项目7教学课件.pptx》由会员分享,可在线阅读,更多相关《中职 数据库应用基础(SQL Server 2016)项目7教学课件.pptx(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、中职 数据库应用基础(SQL Server 2016)项目7教学课件工信版p 理解Transcact-SQL基本组成p 掌握流程控制语句的使用方法p 掌握函数的使用方法p 掌握游标的使用方法p 掌握处理事务的方法 项目目标 7.1.1 Transact-SQL语言组成1.数据定义语言数据定义语言(DDL)用于创建数据库和各种数据库对象。2.数据操作语言数据操作语言(DML)主要用于操作向表中添加数据、更改表中的数据以及从表中删除数据。3.数据控制语言数据控制语言主要用于执行与安全管理相关的操作,以确保数据库的安全。4.事务管理语言事务管理语言主要用于执行开始、提交和回滚事件相关的操作。5.附加
2、语言元素附加的语言元素主要包括标识符、变量和常量、运算符、数据类型、函数、流程控制语句、错误处理语言以及注释语句等。任务7.1 理解Transcact-SQL7.1.2 批处理与脚本批处理就是包含一个或多个Transact-SQL语句的组,从应用程序一次性地发送到SQL Server进行执行。SQL Server将批处理的语句编译为一个可执行单元,称为执行计划。执行计划中的语句每次执行一条。使用GO命令可以向SQL Server实用工具发出一批Transact-SQL语句结束的信号。GO并不是Transact-SQL语句,它是sqlcmd实用工具和SQL Server Management S
3、tudio代码编辑器识别的命令,可以解释为应该向SQL Server实例发送当前批语句的信号。当前批语句由上一个GO命令后输入的所有语句组成。GO命令与Transact-SQL语句不能在同一行中,但是GO后面可以跟一个正整数,以指定GO之前的批处理执行的次数,GO命令行也可以包含注释。任务7.1 理解Transcact-SQL7.1.3 标识符创建数据库对象时需要使用标识符对其进行命名。在SQL Server中,所有内容都可以有标识符,例如服务器、数据库以及表、视图、列、索引、触发器、过程、约束和规则等数据库对象都可以有标识符。大多数对象要求有标识符,但对有些对象(例如约束)而言,标识符是可选
4、的。对象标识符是在定义对象时创建的,随后可以使用标识符来引用该对象。标识符的排序规则取决于定义标识符时所在的级别。为实例级对象(例如登录名和数据库名)的标识符指定的是实例的默认排序规则。为数据库对象(例如表、视图和列名)的标识符指定的是数据库的默认排序规则。标识符分为常规标识符和分隔标识符两类。常规标识符符合标识符的格式规则,当在Transact-SQL语句中使用常规标识符时不用将其分隔开。分隔标识符包含在双引号()或方括号()内。在Transact-SQL语句中,符合标识符格式规则的标识符可以分隔,也可以不分隔;对不符合所有标识符规则的标识符则必须用双引号或括号进行分隔。常规标识符和分隔标识
5、符包含的字符数必须在1128之间。对于本地临时表,标识符最多可以有116个字符。当使用标识符作为对象名称时,完整的对象名称由四个标识符组成:服务器名称、数据库名称、架构名称和对象名称。标识符的语法格式如下。服务器.数据库.架构.对象任务7.1 理解Transcact-SQL7.1.4 常量1.字符串常量字符串常量必须使用一对单引号括起来,可以包含字母(az、AZ)、汉字、数字字符(09)以及其他特殊字符,如感叹号(!)、at符()和数字符(#)等。例如,数据库应用基础,SQL Server 2016数据库。2.Unicode字符串Unicode字符串的格式与普通字符串相似,但它前面有一个N标识
6、符。N前缀必须是大写字母。例如,Michl 是字符串常量,而NMichl 则是Unicode常量。3.二进制常量二进制常量用十六进制数字字符串来表示,以0 x作为前缀,不使用引号。例如,0 xAE,0 x12Ef,0 x69048AEFDD010E,0 x(二进制空串)。4.bit常量bit常量用数字0或1表示,不使用引号。如果使用一个大于1的数字,它将会被转换为数字1。5.datetime常量datetime常量使用特定格式的字符日期值来表示,并使用单引号括起来。日期常量示例:2019-10-01,October 1,2019,10/01/2019。时间常量示例:20:30:12,08:30
7、 PM。任务7.1 理解Transcact-SQL6.integer常量integer常量用一串数字来表示,不含小数点,不使用引号。例如,123,2020。7.decimal常量decimal常量用一串数字来表示,可以包含小数点,不使用引号。例如,1894.1204,2.0。8.float和real常量float和real常量使用科学记数法表示。例如,101.5E5,0.5E-2。9.money常量money常量用一串数字,可以包含或不包含小数点,以一个货币符号($)作为前缀,不使用引号。例如,$12,$542023.14。10.uniqueidentifier常量uniqueidentifi
8、er常量是表示全局唯一标识符(GUID)值的字符串,可使用字符串或二进制字符串格式来表示。例如,6F9619FF-8B86-D011-B42D-00C04FC964FF和0 xff19966f868 b11d0b42d00c04fc964ff表示相同的GUID。11.指定负数和正数若要指明一个数是正数还是负数,应对数字常量前面加上正号(+)或负号(),由此得到有符号数字值的常量。任务7.1 理解Transcact-SQL7.1.5 局部变量1.声明局部变量DECLARE 局部变量名 AS 数据类型,.2.设置局部变量的值SET 局部变量名=表达式3.显示局部变量的值当使用SELECT语句时,如
9、果省略局部变量后面的赋值号(=)和相应的表达式,则可以将局部变量的值显示出来。此外,也可以使用PRINT语句可以向客户端返回局部变量的值或者用户自定义的消息,语法格式如下。PRINT 字符串常量|局部变量名|字符串表达式任务7.1 理解Transcact-SQL7.1.6 表达式表达式是标识符、值和运算符的组合,Transact-SQL可以对其求值以获取结果。访问或更改数据时,可以在多个不同的位置使用数据。例如,可以将表达式用作要在查询中检索的数据的一部分,也可以用作查找满足一组条件的数据时的搜索条件。表达式可以是常量、函数、列名、变量、子查询、CASE、NULLIF或COALESCE,也可以
10、用运算符对这些实体进行组合以生成表达式。在表达式中,应使用单引号将字符串和日期值括起来。使用运算符可以执行算术、比较、串联或赋值操作。例如,可以测试数据以确保客户数据的国家/地区列已填充或非空。在查询中,可以查看表(应与某种类型的运算符一起使用)中的数据的任何用户都可以执行操作。必须具有相应权限才能成功更改数据。在Transact-SQL中,使用运算符可以执行下列操作:永久或临时更改数据;搜索满足指定条件的行或列;在数据列之间或表达式之间进行判断;在开始或提交事务之前,或者在执行特定代码行之前测试指定条件。任务7.1 理解Transcact-SQL7.1.7 空值空值(NULL)表示值未知。空
11、值不同于空白或零值。没有两个相等的空值。比较两个空值或将空值与任何其他值相比均返回未知,这是因为每个空值均为未知。空值一般表示数据未知、不适用或将在以后添加数据。例如,学生的成绩在生成成绩单时可能不知道。在SQL-92标准中,引入了关键字IS NULL和IS NOT NULL来测试是否存在空值。若要在查询中测试空值,可在WHERE子句中使用IS NULL或IS NOT NULL。在SQL Server Management Studio代码编辑器中查看查询结果时,空值在结果集中显示为NULL。若要在表列中插入空值,可在INSERT或UPDATE语句中显式声明NULL,或不让列出现在INSERT
12、语句中,或使用ALTER TABLE语句在现有表中新添一列。不能将空值用于区分表中两行所需的信息,例如外键或主键。在程序代码中,可以检查空值以便只对具有有效(或非空)数据的行执行某些计算。如果包含空值列,则某些计算(如平均值)就会不准确,因此执行计算时删除空值很重要。如果数据中可能存储有空值而又不希望数据中出现空值,就应该创建查询和数据修改语句,删除空值或将它们转换为其他值。如果数据中出现空值,则逻辑运算符和比较运算符有可能返回TRUE或FALSE以外的第三种结果,即UNKNOWN。这种三值逻辑是导致许多应用程序出现错误的根源。任务7.1 理解Transcact-SQL7.1.8 注释语句1.
13、行内注释使用双连字符(-)可以将注释文本插入单独行中、嵌套在Transact-SQL命令行的结尾或嵌套在Transact-SQL语句中,服务器不对这些注释进行计算。语法如下:-注释文字2.块注释使用正斜杠-星号字符对(/*.*/)也可以添加注释文本,服务器不计位于/*与*/之间的文本。语法格式如下:/*注释文字*/任务7.1 理解Transcact-SQL7.2.1 BEGIN.END语句BEGIN.END语句用于将一系列的Transact-SQL语句组合成一个语句块(相当于其他高级语言中的复合语句),从而可以执行一组Transact-SQL语句,语法格式如下。BEGIN 语句|语句块END其
14、中语句和语句块别表示使用BEGIN.END语句块定义的任何有效的Transact-SQL语句或语句组。BEGIN.END语句块允许嵌套。任务7.2 使用流程控制语句7.2.2 IF.ELSE语句IF.ELSE语句在满足指定条件时执行一组Transact-SQL语句,当不满足指定条件时执行另一组Transact-SQL语句,语法格式如下。IF 布尔表达式 语句|语句块ELSE 语句|语句块其中布尔表达式的返回值为TRUE或FALSE。如果布尔表达式中含有SELECT语句,则必须用圆括号将SELECT语句括起来。语句|语句块是任何Transact-SQL语句或用语句块定义的语句分组。除非使用语句块
15、,否则IF或ELSE条件只能影响一个Transact-SQL语句的性能。如果需要定义语句块,请使用BEGIN.END语句。如果布尔表达式返回TRUE,则执行IF关键字及其条件之后的Transact-SQL语句。可选的ELSE关键字引入另一个Transact-SQL语句,当布尔表达式返回FALSE时执行该语句。任务7.2 使用流程控制语句7.2.3 CASE函数1.简单CASE函数CASE 输入表达式 WHEN 匹配表达式1 THEN 结果表达式1 WHEN 匹配表达式2 THEN 结果表达式2.ELSE 结果表达式nEND其中输入表达式指定使用简单CASE格式时所计算的表达式,可以是任意有效的
16、表达式。WHEN 匹配表达式指定使用简单CASE格式时要与输入表达式进行比较的简单表达式。匹配表达式是任意有效的表达式。输入表达式与每个匹配表达式的数据类型必须相同,或者必须是隐式转换的数据类型。THEN 结果表达式指定当输入表达式=匹配表达式计算结果为TRUE时返回的表达式。结果表达式可以是任意有效的表达式。ELSE 结果表达式n指定比较运算计算结果不为TRUE时返回的表达式。如果忽略此参数且比较运算计算结果不为TRUE,则CASE返回NULL。结果表达式n是任意有效的表达式。所有结果表达式的数据类型必须相同或必须是隐式转换的数据类型。任务7.2 使用流程控制语句7.2.3 CASE函数2.
17、CASE搜索函数CASE WHEN 布尔表达式1 THEN 结果表达式1 WHEN 布尔表达式2 THEN 结果表达式2.ELSE 结果表达式nENDWHEN 布尔表达式指定当使用CASE搜索格式时所计算的布尔表达式。THEN 结果表达式指定当布尔表达式的计算结果为TRUE时返回的表达式,可是任意有效的表达式。ELSE 结果表达式n指定比较运算计算结果不为TRUE时返回的表达式。如果忽略此参数且比较运算计算结果不为TRUE,则CASE返回NULL。结果表达式n是任意有效的表达式。所有结果表达式的数据类型必须相同或必须是隐式转换的数据类型。任务7.2 使用流程控制语句7.2.4 WAITFOR语
18、句WAITFOR语句在达到指定时间或时间间隔之前,或者指定语句至少修改或返回一行之前,阻止执行批处理、存储过程或事务,语法格式如下。WAITFOR DELAY 等待的时段|TIME 完成的时间其中DELAY指定可以继续执行批处理、存储过程或事务之前必须等待的时段,最长可以是24小时。TIME指定的运行批处理、存储过程或事务的时间。完成的时间指定何时执行WAITFOR语句。等待的时间和完成的时间可以使用datetime数据可接受的格式来指定,也可以将其指定为局部变量,但不能指定日期。因此,不允许指定datetime值的日期部分。使用WAITFOR语句可以挂起批处理、存储过程或事务的执行,直到发生
19、以下情况:已超过指定的时间间隔;到达一天中指定的时间。任务7.2 使用流程控制语句7.2.5 WHILE语句WHILE语句设置重复执行SQL语句或语句块的条件,只要指定的条件为真,就重复执行语句;也可以使用BREAK和CONTINUE关键字在循环内部控制WHILE循环中语句的执行。语法格式如下。WHILE 布尔表达式 语句|语句块|BREAK|CONTINUE其中参数布尔表达式的计算结果为TRUE或FALSE。如果布尔表达式中含有SELECT语句,则必须用括号将SELECT语句括起来。语句和语句块分别是Transact-SQL语句或用语句块定义的语句分组。若要定义语句块,可以使用控制流关键字B
20、EGIN和END。BREAK导致从最内层的WHILE循环中退出,将执行出现在END关键字(循环结束的标记)后面的任何语句。如果嵌套了两个或多个WHILE循环,则内层的BREAK将退出到下一个外层循环,将首先运行内层循环结束之后的所有语句,然后重新开始下一个外层循环。CONTINUE使WHILE循环重新开始执行,忽略CONTINUE关键字后面的任何语句。任务7.2 使用流程控制语句7.2.6 TRY.CATCH语句TRY.CATCH语句对Transact-SQL实现类似于C#和C+语言中的异常处理的错误处理。Transact-SQL语句组可以包含在TRY块中。如果在TRY块内部发生错误,则会将控
21、制传递给CATCH块中包含的另一个语句组。语法格式如下。BEGIN TRY 语句|语句块END TRYBEGIN CATCH 语句|语句块END CATCH;其中语句为任何Transact-SQL语句;语句块为批处理或封装在BEGIN.END块中的任何Transact-SQL语句组。使用TRY.CATCH可以捕捉所有严重级别大于10但不终止数据库连接的错误。TRY块后必须紧跟相关联的CATCH块。在END TRY与BEGIN CATCH语句之间放置任何其他语句都将生成语法错误。TRY.CATCH构造不能跨越多个批处理,也不能跨越多个Transact-SQL语句块。任务7.2 使用流程控制语句7
22、.3.1 函数概述不论是内置函数还是用户自定义函数都可以用在任意表达式中。例如,用在SELECT语句的选择列表中可以返回一个值,用在SELECT、INSERT、DELETE或UPDATE语句的WHERE子句搜索条件中可以限制查询符合条件的行,用在视图的搜索条件中可以使视图在运行时与用户或环境动态地保持一致,用在CHECK约束或触发器中可以在插入数据时查找指定的值,用在DEFAULT约束或触发器中可以在INSERT语句未指定值时提供一个值,如此等等。使用函数时应始终带上圆括号,即使没有任何参数也是如此。但是,与DEFAULT关键字一起使用的niladic函数例外。在某些情况下,用来指定数据库、计
23、算机、登录名或数据库用户的参数是可选的。如果未指定这些参数,则默认将这些参数赋值为当前的数据库、主机、登录名或数据库用户。函数可以嵌套使用,可以将一个函数作为另一个函数的参数来使用。按照函数的返回值是否确定,可以将函数分为严格确定函数、确定函数和非确定函数。如果一个函数对于一组特定的输入值始终返回相同的结果,则该函数就是严格确定函数。对于用户定义的函数,判断其是否确定的标准相对宽松。如果对于一组特定的输入值和数据库状态,函数始终返回相同的结果,则该函数就是确定函数。如果函数是数据访问函数,即使它不是严格确定的,也可以从这个角度认为它是确定的。任务7.3 使用函数7.3.2 字符串函数(1)返回
24、字符表达式最左侧字符的ASCII码值:ASCII(字符串表达式)(2)CHAR函数将一个int类型的ASCII码转换为字符:CHAR(整型表达式)(3)LEFT函数返回字符串中从左边开始指定个数的字符:LEFT(字符表达式,整型表达式)(4)LEN函数返回指定字符串表达式的字符数(不包括尾随空格):LEN(字符串表达式)(5)LOWER函数将大写字符数据转换为小写后返回一个字符表达式:LOWER(字符表达式)(6)LTRIM函数在删除前导空格后返回一个字符表达式:LTRIM(字符表达式)(7)NCHAR函数返回具有指定整数代码的Unicode字符:NCHAR(整型表达式)(8)REPLACE函
25、数用另一个字符串值替换指定字符串值的所有出现:REPLACE(字符串表达式,要查找的子字符串,替换字符串)(9)REPLICATE函数以指定次数重复字符串值:REPLICATE(字符串表达式,整型表达式)(10)REVERSE函数按相反顺序返回字符串值:REVERSE(字符串表达式)任务7.3 使用函数7.3.2 字符串函数(11)RIGHT函数从字符串右侧取出具有指定长度的字符:RIGHT(字符串表达式,整型表达式)(12)RTRIM函数在截取所有尾随空格后返回一个字符串:RTRIM(字符串表达式)(13)SPACE函数返回一串重复的空格:SPACE(整型表达式)(14)STR函数返回从数字
26、数据转换的字符数据:STR(浮点表达式,长度,小数位数)(15)STUFF函数将一个字符串插入另一个字符串,它会在第一个字符串中从指定的起始位置删除指定长度的字符,然后在该位置插入第二个字符串:STUFF(字符表达式,起点,长度,替换字符表达式)(16)SUBSTRING函数返回字符表达式、二进制表达式、文本表达式或图像表达式的一部分(子字符串):SUBSTRING(表达式,起始位置,长度)(17)UNICODE函数返回由Unicode标准定义的整数值,用于输入表达式的第一个字符:UNICODE(字符表达式)(18)UPPER函数将小写字符数据转换为大写后返回一个字符表达式:UPPER(字符表
27、达式)任务7.3 使用函数7.3.3 数学函数(1)ABS函数返回指定数值表达式的绝对值:ABS(数值表达式)(2)CEILING函数返回大于或等于指定数值表达式的最小整数:CEILING(数值表达式)(3)FLOOR函数返回小于或等于指定数值表达式的最大整数:FLOOR(数值表达式)(4)POWER函数返回指定表达式值的指定次的幂:POWER(底数,指数)(5)RAND函数返回从0到1的伪随机浮点值:RAND(种子)(6)ROUND函数返回一个数值,舍入到指定的长度或精度:ROUND(数值表达式,长度)(7)SQRT函数返回指定float值的平方根:SQRT(浮点表达式)(8)SQUARE函
28、数返回指定浮点值的平方:SQUARE(浮点表达式)任务7.3 使用函数7.3.4 日期函数(1)DATEADD函数返回给指定日期加上一个时间间隔(带符号整数)后所得到的新的日期时间值:DATEADD(日期部分,数字,日期)(2)DATEDIFF函数返回两个日期之间的差值(带符号整数):DATEDIFF(日期部分,起始日期,终止日期)(3)DATEPART函数返回一个整数,表示指定日期中的指定部分:DATEPART(日期部分,日期)(4)DAY函数返回一个整数,表示日期date中的“日”部分:DAY(日期)(5)GETDATE函数返回当前数据库系统时间戳作为datetime值:GETDATE()
29、(6)MONTH函数返回表示指定日期中月份的整数:MONTH(日期)(7)SYSDATETIME函数返回包含运行SQL Server实例的计算机系统的日期和时间的datetime2值:SYSDATETIME()(8)YEAR函数返回一个整数,表示指定日期的年份:YEAR(日期)任务7.3 使用函数7.3.5 转换函数1.CAST函数CAST函数用于将某种数据类型的表达式显式地转换为另一种数据类型,语法格式如下。CAST(表达式 AS 数据类型(长度)其中表达式参数指定要转换其数据类型的表达式,可以是任何有效的表达式;数据类型指定要转换的目标数据类型,不能使用别名数据类型;长度是一个可选整数,用
30、于指定目标数据类型的长度,默认值为30。2.CONVERT函数若要指定转换后数据的样式,可使用CONVERT函数进行数据类型转换。语法格式如下。CONVERT(数据类型(长度),表达式,样式)其中表达式、数据类型和长度参数的含义与CAST函数中相应参数相同。任务7.3 使用函数7.3.6 系统函数(1)ERROR函数返回执行的上一个Transact-SQL语句的错误号:ERROR(2)IDENTITY函数返回最后插入的标识值:IDENTITY(3)ROWCOUNT函数返回受上一语句影响的行数:ROWCOUNT(4)SERVERNAME函数返回运行SQL Server的本地服务器的名称:SERV
31、ERNAME(5)SERVICENAME函数返回SQL Server正在其下运行的注册表项的名称:SERVICENAME(6)VERSION函数返回当前的SQL Server安装的版本、处理器体系结构、生成日期以及操作系统:VERSION(7)DB_ID函数返回数据库标识号(ID):DB_ID(数据库名称)(8)DB_NAME函数返回数据库名称:DB_NAME(数据库标识号)(9)HOST_ID函数返回工作站标识号:HOST_ID()(10)HOST_NAME函数返回工作站名:HOST_NAME()(11)IDENT_CURRENT函数返回为指定的表或视图生成的最后一个标识值:IDENT_CU
32、RRENT(表名称)(12)IDENT_INCR函数返回在表或视图中创建标识列时指定的增量值:IDENT_INCR(表或视图)任务7.3 使用函数7.3.6 系统函数(13)IDENT_SEED函数返回在表或视图中创建标识列时指定的种子值:IDENT_SEED(表或视图)(14)ISDATE函数确定输入表达式是否为有效日期:ISDATE(表达式)(15)ISNULL函数使用指定的值来替换NULL值:ISNULL(待检查表达式,替换表达式)(16)ISNUMERIC函数确定表达式是否为有效的数值类型:ISNUMERIC(表达式)(17)NEWID函数创建uniqueidentifier类型的唯一
33、值:NEWID()(18)OBJECT_ID函数返回架构范围内对象的数据库对象标识号:OBJECT_ID(对象名称,对象类型)(19)OBJECT_NAME函数返回架构范围内对象的数据库对象名称:OBJECT_NAME(对象标识号)(20)SUSER_ID函数返回用户的登录标识号:SUSER_ID(登录名)(21)SUSER_NAME函数返回用户的登录标识名:SUSER_NAME(服务器用户标识号)(22)USER_ID函数返回数据库用户的标识号:USER_ID(用户名)(23)USER_NAME函数基于标识号返回数据库用户名:USER_NAME(标识号)任务7.3 使用函数7.3.7 用户定
34、义函数1.用户定义函数概述用户定义函数是接受参数、执行操作(例如复杂计算)并将操作结果以值的形式返回的例程。返回值可以是单个标量值或结果集。使用用户定义函数有以下优点:允许模块化程序设计,执行速度更快,减少网络流量。所有用户定义函数都是由标题和正文两部分组成的。函数可以接受零个或多个输入参数,返回标量值或表。标题定义包括以下内容:具有可选架构/所有者名称的函数名称,输入参数名称和数据类型,可以用于输入参数的选项,返回参数数据类型和可选名称,可以用于返回参数的选项。正文定义了函数将要执行的操作或逻辑,可以是一个或多个Transact-SQL语句,或对.NET程序集的引用。SQL Server 2
35、016支持以下四种类型的用户定义函数。(1)标量值函数(2)内联表值函数(3)多语句表值函数(4)CLR函数任务7.3 使用函数7.3.7 用户定义函数2.创建用户定义函数创建标量值函数时,CREATE FUNCTION语句的语法格式如下。CREATE FUNCTION 架构名称.函数名称(参数名称 AS 类型构架名称.参数数据类型=默认值,.)RETURNS 返回值数据类型 WITH ENCRYPTION|SCHEMABINDING,.AS BEGIN 函数体 RETURN 标量表达式 END;3.调用用户定义函数当调用标量值用户定义函数时,必须至少提供由架构名称和函数名称两部分组成的名称。
36、任务7.3 使用函数7.3.7 用户定义函数4.修改用户定义函数若要对用户定义函数进行修改,可使用SSMS来实现,操作方法如下:在对象资源管理器中展开包含用户定义函数的数据库,在该数据库下方依次展开“可编程性”和“函数”,右键单击“标量值函数”,然后选择“修改”命令,此时会在SQL编辑器中生成一个ALTER FUNCTION语句;在这里对函数定义进行修改,然后执行ALTER FUNCTION语句。5.删除用户定义函数对于不再需要使用的用户定义函数,可以在对象资源管理器中将其从所在数据库中删除。操作方法是:在对象资源管理器中展开包含用户定义函数的数据库,在该数据库下方依次展开“可编程性”、“函数
37、”和“标量值函数”(或“表值函数”)节点,右键单击要删除的函数并选择“删除”,然后在“删除对象”对话框中单击“确定”按钮。也可以使用DROP FUNCTION语句从当前数据库中删除用户定义函数,语法格式如下。DROP FUNCTION 架构名称.函数名称,.任务7.3 使用函数7.4.1 理解游标游标通过以下方式来扩展结果处理:允许定位在结果集的特定行;从结果集的当前位置检索一行或一部分行;支持对结果集中当前位置的行进行数据修改;为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持;提供脚本、存储过程和触发器中使用的Transact-SQL语句,以访问结果集中的数据。SQ
38、L Server支持两种请求游标的方法。p Transact-SQL。在Transact-SQL中可以使用根据SQL-92游标语法制定的游标的语法。p 数据库应用程序编程接口(API)游标函数。SQL Server支持数据库API的游标功能,包括ADO(ActiveX数据对象)、OLE DB和ODBC(开放式数据库连接)。本书中主要讨论Transact-SQL游标的使用方法。关于API游标,请参阅有关技术资料。任务7.4 使用游标7.4.2 定义游标1.SQL92语法DECLARE 游标名称 INSENSITIVE SCROLL CURSORFOR SELECT语句FOR READ ONLY|
39、UPDATE OF 列名称,.;2.Transact-SQL扩展语法DECLARE 游标名称 CURSORLOCAL|GLOBALFORWARD_ONLY|SCROLLSTATIC|KEYSET|DYNAMIC|FAST_FORWARDREAD_ONLY|SCROLL_LOCKS|OPTIMISTICTYPE_WARNINGFOR SELECT语句FOR UPDATE OF 列名称,.;任务7.4 使用游标7.4.3 打开游标使用OPEN语句打开Transact-SQL服务器游标:OPEN GLOBAL 游标名称|游标变量名称其中GLOBAL指定游标是全局游标。游标名称指定已声明游标的名称。如
40、果全局游标和局部游标都使用该游标名称,则当指定GLOBAL时指的是全局游标,否则指的是局部游标。游标变量名称指定已声明游标变量的名称,该变量引用一个游标。打开游标后可以使用ERROR函数来检查打开操作是否成功:如果该函数返回0,则表明游标打开成功,否则表明游标打开失败。还可以使用CURSOR_ROWS函数来获取在连接上打开的上一个游标中符合条件的行数,其返回值为整数并且有以下四种可能。p-m:游标被异步填充。返回值(-m)是键集中当前的行数。p-1:游标为动态游标。因为动态游标可以反映所有更改,所以游标符合条件的行数不断变化。因此,永远不能确定已检索到所有符合条件的行。p 0:目前没有已打开的
41、游标,对于上一个打开的游标没有符合条件的行或上一个打开的游标已被关闭或被释放。p n:游标已完全填充。返回值(n)是游标中的总行数。任务7.4 使用游标7.4.4 通过游标提取数据使用FETCH语句从该游标中检索特定的行:FETCH NEXT|PRIOR|FIRST|LAST|ABSOLUTE n|nvar|RELATIVE n|nvar FROMGLOBAL 游标名称|游标变量名称INTO 变量名称,.任务7.4 使用游标7.4.5 通过游标更新数据如果希望要在通过Transcact-SQL服务器游标提取某行后修改或删除该行,可以先定义一个可更新的游标,即在游标定义语句中指定FOR UPDA
42、TE子句。如果需要,还可以指定要更新哪些列。定义可更新游标后,可以在UPDATE或DELETE语句中使用一个WHERE CURRENT OF 子句,从而对游标当前所指向的数据行进行修改或删除。7.4.6 关闭和释放游标1.关闭游标CLOSE GLOBAL 游标名称|游标变量名称2.释放游标DEALLOCATE GLOBAL 游标名称|游标变量名称任务7.4 使用游标7.5.1 事务概述一个逻辑工作单元要成为一个事务,必须具有ACID四个属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。(1)原子性。事务必须是原
43、子工作单元;在一个事务中所做的数据修改,要么全都执行,要么全都不执行。(2)一致性。事务在完成时,必须使所有的数据都保持一致状态。(3)隔离性。由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。(4)持久性。事务完成之后,它对于系统的影响是永久性的。任务7.5 处理事务7.5.2 编写有效事务要编写有效事务,应遵循以下指导原则。(1)不要在事务处理期间要求用户输入。(2)浏览数据时尽量不要打开事务,在所有预备数据分析完成之前建议不要启动事务。(3)尽可能使事务保持简短。(4)考虑为只读查询使用快照隔离,以减少阻塞。(5)灵活地使用更低的事务隔离级别。(6)灵活地使用更低的游标并发选项。
44、(7)在事务中尽量使访问的数据量最小,以减少锁定的行数,并减少事务之间的争夺。任务7.5 处理事务7.5.3 启动事务在Transcact-SQL中,可以使用BEGIN TRANSACTION语句标记一个显式本地事务的起始点,该语句使TRANCOUNT按1递增,语法格式如下。BEGIN TRAN|TRANSACTION 事务名称|事务名称变量 WITH MARK 描述;其中事务名称指定分配给事务的名称,必须符合标识符规则,包含的字符数不能大于32。仅在最外面的BEGIN.COMMIT或BEGIN.ROLLBACK嵌套语句对中使用事务名称。事务名称变量表示用户定义的、含有有效事务名称的变量名称,
45、该变量的数据类型必须是char、varchar、nchar或nvarchar。WITH MARK子句指定在日志中标记事务,其中 描述 是描述该标记的字符串。如果使用了WITH MARK,则必须指定事务名称。WITH MARK允许将事务日志还原到命名标记。任务7.5 处理事务7.5.4 设置事务保存点使用BEGIN TRANSACTION启动一个事务后,可以使用SAVE TRANSACTION语句在这个事务内设置保存点,语法格式如下。SAVE TRAN|TRANSACTION 保存点名称|保存点变量;其中参数保存点名称指定分配给保存点的名称,它必须符合标识符的规则,但长度不能超过32个字符。保存
46、点变量表示包含有效保存点名称的用户定义变量的名称,该变量必须使用char、varchar、nchar或nvarchar数据类型。用户可以在事务内设置保存点或标记。保存点可以定义在按条件取消某个事务的一部分后,该事务可以返回的一个位置。如果将事务回滚到保存点,则根据需要必须完成其他剩余的Transact-SQL语句和COMMIT TRANSACTION语句,或者必须通过将事务回滚到起始点完全取消事务。若要取消整个事务,可使用ROLLBACK TRANSACTION语句,以撤消事务的所有语句和过程。任务7.5 处理事务7.5.5 提交事务使用COMMIT TRANSACTION语句可以提交事务,即
47、标志一个成功的隐性事务或显式事务的结束,语法格式如下。COMMIT TRAN|TRANSACTION 事务名称|事务名称变量;其中事务名称参数指定由前面的BEGIN TRANSACTION分配的事务名称,该参数向程序员指明COMMIT TRANSACTION与哪些BEGIN TRANSACTION相关联,以帮助阅读代码。事务名称变量表示用户定义的、含有有效事务名称的变量,必须使用char、varchar、nchar或nvarchar数据类型。如果TRANCOUNT为1,COMMIT TRANSACTION使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,释放事务所占用的资源,并将T
48、RANCOUNT减少到0。如果TRANCOUNT大于1,则COMMIT TRANSACTION使TRANCOUNT按1递减并且事务将保持活动状态。任务7.5 处理事务7.5.6 回滚事务如果在事务中出现错误或用户决定取消事务,则可以使用ROLLBACK TRANSACTION语句将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点,语法格式如下。ROLLBACK TRAN|TRANSACTION 事务名称|事务名称变量|保存点名称|保存点变量;其中参数事务名称是在BEGIN TRANSACTION语句中为事务分配的名称。嵌套事务时,事务名称必须是最外面的BEGIN TRANSACTION语句中的名称。事务名称变量是用户定义的、包含有效事务名称的变量。必须使用char、varchar、nchar或nvarchar数据类型来声明变量。保存点名称是SAVE TRANSACTION语句中指定的。当条件回滚应只影响事务的一部分时,可以使用保存点名称。保存点变量是用户定义的、包含有效保存点名称的变量。必须使用char、varchar、nchar或nvarchar数据类型来声明变量。ROLLBACK TRANSACTION将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点,清除自事务的起点或到某个保存点所做的所有数据修改,并且释放由事务所控制的系统资源。任务7.5 处理事务