《第12章 SQL的高级应用课件.ppt》由会员分享,可在线阅读,更多相关《第12章 SQL的高级应用课件.ppt(46页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第 12 章章SQL 的高级应用的高级应用 n学习目标:n了解事务处理的概念和方法n掌握执行、撤销和回滚事务n了解引入锁的原因和锁的类型n掌握如何设置事务和锁的相关操作12.1 事务事务(Transaction)12.1.1 事务的由来事务的由来n在在SQL Server 2008中使用中使用DELETE或或UPDATE语句对数据库进语句对数据库进行更新时,一次只能操作一个表,但行更新时,一次只能操作一个表,但SQL Server 2008又允许多又允许多个用户并发使用数据库。因此可能会带来数据库的数据不一致的个用户并发使用数据库。因此可能会带来数据库的数据不一致的问题。问题。n如现实中的转
2、账过程,它需要两条如现实中的转账过程,它需要两条UPDATE语句来完成业务流程:语句来完成业务流程:q从转出帐户从转出帐户A里减掉需转账的金额;里减掉需转账的金额;q在转入帐户在转入帐户B里加上转账的金额。里加上转账的金额。n这两个过程必须全部完成,整个转账过程才完成。否则,款项从这两个过程必须全部完成,整个转账过程才完成。否则,款项从A帐户扣除了,正好此时因为其他原因导致程序中断,这样,帐户扣除了,正好此时因为其他原因导致程序中断,这样,B账户账户没有收到款项,而没有收到款项,而A账户的钱也没有了,这样明显是错误的。账户的钱也没有了,这样明显是错误的。n为了解决这种类似的情况,数据库管理系统
3、提出了事务的概念:为了解决这种类似的情况,数据库管理系统提出了事务的概念:将一组相关操作绑定在一个事务中,为了使事务成功,必须成功将一组相关操作绑定在一个事务中,为了使事务成功,必须成功完成该事务中的所有操作。完成该事务中的所有操作。n事务对上面转账问题的解决方法是:把转出和转入作为一个整体,事务对上面转账问题的解决方法是:把转出和转入作为一个整体,形成一个操作集合,这个集合中的操作要么都不执行,要么都执形成一个操作集合,这个集合中的操作要么都不执行,要么都执行。行。12.1.2 事务的概念事务的概念n事务(事务(TRANSACTION)是由对数据库的若)是由对数据库的若干操作组成的一个逻辑工
4、作单元,这些操作作干操作组成的一个逻辑工作单元,这些操作作为要么都执行,要么都不做,是一个不可分割为要么都执行,要么都不做,是一个不可分割的整体。事务用这种方式保证数据满足并发性的整体。事务用这种方式保证数据满足并发性和完整性的要求。使用事务可以避免发生有的和完整性的要求。使用事务可以避免发生有的语句被执行,而另外一些语句没有被执行,从语句被执行,而另外一些语句没有被执行,从而造成数据不一致的情况。而造成数据不一致的情况。12.1.3 事务的特性事务的特性n事务的处理必须满足四原则,即原子性(事务的处理必须满足四原则,即原子性(A)、一致性()、一致性(C)、隔离性()、隔离性(I)和持久性(
5、和持久性(D),简称),简称ACID原则:原则:n原子性(原子性(Atomicity):事务必须是原子工作单元,事务中的操作要么全):事务必须是原子工作单元,事务中的操作要么全部执行,要么全不执行,不可只完成部分操作。原子性在数据库系统中,部执行,要么全不执行,不可只完成部分操作。原子性在数据库系统中,由恢复机制来实现;由恢复机制来实现;n一致性(一致性(Consistency):事务开始前,数据库处于一致性的状态;事):事务开始前,数据库处于一致性的状态;事务结束后,数据库必须仍处于一致性状态。数据库一致性的定义是由用务结束后,数据库必须仍处于一致性状态。数据库一致性的定义是由用户负责的,如
6、前面所述的银行转账,用户可以定义转账前后两个帐户金户负责的,如前面所述的银行转账,用户可以定义转账前后两个帐户金额之和应该保持不变;额之和应该保持不变;n隔离性(隔离性(Isolation):系统必须保证事务不受其他并发执行事务的影响,):系统必须保证事务不受其他并发执行事务的影响,即当多个事务同时运行时,各事务之间相互隔离,不可互相干扰。事务即当多个事务同时运行时,各事务之间相互隔离,不可互相干扰。事务查看数据时所处的状态,要么是另一个并发事务修改它之前的状态,要查看数据时所处的状态,要么是另一个并发事务修改它之前的状态,要么是另一个并发事务修改它之后的状态,事务不会查看中间状态的数据。么是
7、另一个并发事务修改它之后的状态,事务不会查看中间状态的数据。隔离性通过系统的并发控制机制实现;隔离性通过系统的并发控制机制实现;n持久性(持久性(Durability):一个已完成的事务对数据所做的任何变动在系统):一个已完成的事务对数据所做的任何变动在系统中是永久有效的,即使该事务产生的修改是不正确,错误也将一直保持。中是永久有效的,即使该事务产生的修改是不正确,错误也将一直保持。持久性通过恢复机制实现,发生故障时,可以通过日志等手段恢复数据持久性通过恢复机制实现,发生故障时,可以通过日志等手段恢复数据库信息。库信息。n事务四原则保证了一个事务或者成功提交,或者失败滚回,二者必居其事务四原则
8、保证了一个事务或者成功提交,或者失败滚回,二者必居其一,因此它对数据的修改具有可恢复性。即当事务失败时,它对数据的一,因此它对数据的修改具有可恢复性。即当事务失败时,它对数据的修改都会恢复到该事务执行前的状态。修改都会恢复到该事务执行前的状态。12.1.4 事务的工作原理n事务以事务以BEGIN TRANSACTION开始,以开始,以COMMIT TRANSACTION或或ROLLBACK TRANSACTION结束。结束。n其中,其中,COMMIT TRANSACTION表示事务正表示事务正常结束,提交给数据库,而常结束,提交给数据库,而ROLLBACK TRANSACTION表示事务非正常
9、结束,撤销表示事务非正常结束,撤销事务已经做的操作,回滚到事务开始时的状态。事务已经做的操作,回滚到事务开始时的状态。12.1.5 事务的执行模式nSQL Server的事务可以分为两类:显式事务和隐性的事务可以分为两类:显式事务和隐性事务事务n1. 隐性事务隐性事务n一条一条T-SQL语句就是一个隐性事务,也叫系统提供的语句就是一个隐性事务,也叫系统提供的事务。事务。n例如执行如下的创建表语句:例如执行如下的创建表语句:nCREATE TABLE aa (f1 int not null, f2 char(10), f3 varchar(30)n这条语句本身就构成了一个事务,他要么建立包含这条
10、语句本身就构成了一个事务,他要么建立包含3列的表,要么对数据库没有任何影响。不会出现建立列的表,要么对数据库没有任何影响。不会出现建立只含只含1列或者列或者2列的表的情况。列的表的情况。2. 显式事务显式事务n显式事务又称为用户定义的事务。事务有一个开头和一个结尾,它们指定了操作的边界。边显式事务又称为用户定义的事务。事务有一个开头和一个结尾,它们指定了操作的边界。边界内的所有资源都参与同一个事务。当事务执行遇到错误时,将取消事务对数据库所作的修界内的所有资源都参与同一个事务。当事务执行遇到错误时,将取消事务对数据库所作的修改。因此,我们需要把参与事务的语句封装在一个改。因此,我们需要把参与事
11、务的语句封装在一个BEGIN TRAN/COMMIT TRAN块中。块中。n一个显式事务的语句以一个显式事务的语句以BEGIN TRANSACTION开始,至开始,至COMMIT TRANSACTION或或ROLLBACK TRANSACTION结束。结束。n(1)BEGIN TRANSACTION语句定义事务的起始点语句定义事务的起始点n语法格式为:语法格式为:nBEGIN TRANSACTION 事务名称事务名称|事务变量名称事务变量名称n(2)COMMIT TRANSACTION提交事务提交事务n提交事务,意味着将事务开始以来所执行的所有数据修改成为数据库的永久部分,因此也标提交事务,意
12、味着将事务开始以来所执行的所有数据修改成为数据库的永久部分,因此也标志着一个事务的结束。一旦执行了该命令,将不能回滚事务。只有在所有修改都准备好提交志着一个事务的结束。一旦执行了该命令,将不能回滚事务。只有在所有修改都准备好提交给数据库时,才执行这一动作。给数据库时,才执行这一动作。n语法格式为:语法格式为:nCOMMIT TRANSACTION 事务名称事务名称|事务变量名称事务变量名称n(3)ROLLBACK TRANSACTION回滚事务回滚事务n当事务执行过程种遇到错误时,使用当事务执行过程种遇到错误时,使用ROLLBACK TRANSACTION语句使事务回滚到起点或语句使事务回滚到
13、起点或指定的保持点处。同时系统将清除自事务起点或到某个保存点所做的所有的数据修改,并且指定的保持点处。同时系统将清除自事务起点或到某个保存点所做的所有的数据修改,并且释放由事务控制的资源。因此这条语句也标志事务的结束。释放由事务控制的资源。因此这条语句也标志事务的结束。n语法格式为:语法格式为:nROLLBACK TRANSACTION 事务名称事务名称|事务变量名称事务变量名称|存储点名称存储点名称|含有存储点名称含有存储点名称的变量名的变量名12.1.6 使用事务时的考虑使用事务时的考虑n1. 事务应该尽可能短。事务应该尽可能短。n2. 避免事务嵌套避免事务嵌套 12.2 锁锁(Lock)
14、n有关锁定数据的讨论(包含如何持有锁,以及有关锁定数据的讨论(包含如何持有锁,以及如何避免与锁有关的问题),是一个非常复杂如何避免与锁有关的问题),是一个非常复杂的领域,掌握并使用锁对数据库初学者是比较的领域,掌握并使用锁对数据库初学者是比较困难的。但是,知道锁的概念,了解关于锁的困难的。但是,知道锁的概念,了解关于锁的背景知识是非常必要的,这样才能避免在设计背景知识是非常必要的,这样才能避免在设计查询时出现问题。查询时出现问题。12.2.1 事务的缺陷n为了提高系统效率、满足实际应用的要求,系为了提高系统效率、满足实际应用的要求,系统允许多个事务并发执行,即允许多个用户同统允许多个事务并发执
15、行,即允许多个用户同时对数据库的操作。但由于并发事务对数据的时对数据库的操作。但由于并发事务对数据的操作不同,可能会带来丢失更新、脏读、不可操作不同,可能会带来丢失更新、脏读、不可重复读和幻读等数据不一致的问题:重复读和幻读等数据不一致的问题:n1. 丢失更新(丢失更新(lose update)n2. 脏读(脏读(dirty read)n3. 不可重复读(不可重复读(unrepeateable read)n4. 幻读幻读 (Phantom Read)12.2.2 锁的概念n在单用户数据库中,由于只有一个用户修改信息,不会产生数据在单用户数据库中,由于只有一个用户修改信息,不会产生数据不一致的情
16、况,因此并不需要锁。当允许多个用户同时访问和修不一致的情况,因此并不需要锁。当允许多个用户同时访问和修改数据时,就需要使用锁来防止对同一个数据的并发修改,避免改数据时,就需要使用锁来防止对同一个数据的并发修改,避免产生丢失更新、脏读、不可重复读和幻像读等问题。产生丢失更新、脏读、不可重复读和幻像读等问题。n锁(锁(lock)的基本原则是允许一个事务更新数据,当必须回滚所)的基本原则是允许一个事务更新数据,当必须回滚所有修改时,能够确信在第一个事务修改完数据之后,没有其他事有修改时,能够确信在第一个事务修改完数据之后,没有其他事务在数据上进行过修改。即锁提供了事务的隔离性。务在数据上进行过修改。
17、即锁提供了事务的隔离性。n事务一旦获取了锁,则在事务终止之前,就一直持有该锁。如果事务一旦获取了锁,则在事务终止之前,就一直持有该锁。如果其他事务尝试访问数据资源的方式与该事务所持有的锁不兼容,其他事务尝试访问数据资源的方式与该事务所持有的锁不兼容,则其他事务必须停止执行,直到拥有锁的事务终止、不兼容的锁则其他事务必须停止执行,直到拥有锁的事务终止、不兼容的锁被释放,才可以使用解锁的数据资源。在被释放,才可以使用解锁的数据资源。在SQL Server 2008中,中,系统能够自动处理锁的行为。系统能够自动处理锁的行为。12.2.3 隔离性的级别隔离性的级别n由于多个进程可能会并发允许,由于多个
18、进程可能会并发允许,SQL Server 2008使用隔离级别允许用户控制操作数据时使用隔离级别允许用户控制操作数据时的一致性级别。的一致性级别。n1. 隔离的级别隔离的级别q(1)未提交读()未提交读(read uncommitted)q(2)已提交读()已提交读(read committed) q(3)可重复读()可重复读(repeateable read)q(4)可串行读()可串行读(serializable)q(12)快照()快照(snapshot)和已提交读快照()和已提交读快照(read committed snapshot)隔离级别的选择、设定隔离级别的选择、设定n用于事务的适当
19、隔离级别是非常重要的。由于获取和用于事务的适当隔离级别是非常重要的。由于获取和释放锁所需的资源因隔离级别不同而不同,因此隔离释放锁所需的资源因隔离级别不同而不同,因此隔离级别不仅影响数据库的并发性实现,而且还影响包含级别不仅影响数据库的并发性实现,而且还影响包含该事务的应用程序的整体性能。该事务的应用程序的整体性能。n通常,使用的隔离级别越严格,要获取并占有的资源通常,使用的隔离级别越严格,要获取并占有的资源就更多,因而对并发性提供的支持就越少,而整体性就更多,因而对并发性提供的支持就越少,而整体性能也会越低。能也会越低。n尽管隔离级别是为事务锁定资源服务的,但隔离级别尽管隔离级别是为事务锁定
20、资源服务的,但隔离级别是在应用程序级别指定的。当没有指定隔离级别时,是在应用程序级别指定的。当没有指定隔离级别时,系统缺省地使用系统缺省地使用“游标稳定性游标稳定性”隔离级别。隔离级别。n对于嵌入式对于嵌入式SQL应用程序,隔离级别在预编译或将应应用程序,隔离级别在预编译或将应用程序绑定到数据库时指定。用程序绑定到数据库时指定。n大多数情况下,隔离级别是用受支持的编译语言(如大多数情况下,隔离级别是用受支持的编译语言(如C或或C+)编写,通过)编写,通过 PRECOMPILE PROGRAM、BIND命令或命令或API的的ISOLATION选项来设置。选项来设置。12.2.4 锁的空间管理及粒
21、度锁的空间管理及粒度n当一个事务锁定特定资源时,在事务终止之前,其它当一个事务锁定特定资源时,在事务终止之前,其它事务对该资源的访问都可能被拒绝。锁保证了事务运事务对该资源的访问都可能被拒绝。锁保证了事务运行的正确性,但牺牲了系统的一部分并发性。为了获行的正确性,但牺牲了系统的一部分并发性。为了获取最大并发性,我们引入了锁的管理空间及粒度的概取最大并发性,我们引入了锁的管理空间及粒度的概念。念。n锁粒度指被封锁目标的大小。锁定粒度和数据库并发锁粒度指被封锁目标的大小。锁定粒度和数据库并发访问度是一对矛盾,锁定粒度大,系统的开销小但并访问度是一对矛盾,锁定粒度大,系统的开销小但并发度会降低;锁定
22、粒度小,系统开销大,但并发度会发度会降低;锁定粒度小,系统开销大,但并发度会提高。提高。SQL Server中,可被锁定的资源从小到大分中,可被锁定的资源从小到大分别是行、页、扩展盘区、表和数据库。别是行、页、扩展盘区、表和数据库。12.2.5 锁的类别锁的类别nSQL Server 2008使用不同类型的锁来锁定资使用不同类型的锁来锁定资源,也叫锁的模式,决定了并发事务如何访问源,也叫锁的模式,决定了并发事务如何访问资源。资源。n从数据库系统的角度来看,共有六种锁,分别从数据库系统的角度来看,共有六种锁,分别是:是:q共享锁共享锁q更新锁更新锁q排他锁排他锁q意向锁意向锁q架构锁架构锁q大容
23、量更新锁。大容量更新锁。 12.2.6 如何在如何在SQL Server中查看数据库中中查看数据库中的锁的锁n可以使用快捷键可以使用快捷键“Ctrl+2”来查看锁信息,也可来查看锁信息,也可以通过系统存储过程以通过系统存储过程sp_lock来查看数据库的来查看数据库的锁。锁。n1. 使用使用SSMS查看锁信息查看锁信息n2. 使用系统存储过程使用系统存储过程sp_lock查看锁的信息查看锁的信息12.2.7 死锁及其防止死锁及其防止n在数据库并发执行中,两个或更多个事务对锁的争用会引起称为在数据库并发执行中,两个或更多个事务对锁的争用会引起称为死锁的情况。死锁的情况。n在在SQL Server
24、 2008中解决死锁的方法是:系统自动进行死锁检中解决死锁的方法是:系统自动进行死锁检测,终止操作较少的事务以打断死锁,并向作为死锁牺牲品的事测,终止操作较少的事务以打断死锁,并向作为死锁牺牲品的事务发送错误信息。务发送错误信息。n处理死锁最好的方法是防止死锁的发生,即不让满足死锁条件的处理死锁最好的方法是防止死锁的发生,即不让满足死锁条件的情况发生。为此,用户需要遵循以下原则:情况发生。为此,用户需要遵循以下原则: q(1)尽量避免并发地执行涉及到修改数据的语句)尽量避免并发地执行涉及到修改数据的语句q(2)要求每个事务一次就将所有要使用的数据全部加锁,否则就)要求每个事务一次就将所有要使用
25、的数据全部加锁,否则就不予执行不予执行q(3)预先规定一个加锁顺序。所有的事务,都必须按这个顺序对)预先规定一个加锁顺序。所有的事务,都必须按这个顺序对数据进行加锁。例如,不同的过程在事务内部对对象的更新执行数据进行加锁。例如,不同的过程在事务内部对对象的更新执行顺序应尽量保持一致顺序应尽量保持一致q(4)每个事务的执行时间不可太长,尽量缩短事务的逻辑处理过)每个事务的执行时间不可太长,尽量缩短事务的逻辑处理过程,及早提交或回滚事务。对程序段长的事务可考虑将其分割为程,及早提交或回滚事务。对程序段长的事务可考虑将其分割为几个事务。几个事务。q(5)一般不要修改)一般不要修改SQL SERVER
26、事务的默认级别。不推荐强行事务的默认级别。不推荐强行加锁加锁12.3 游标游标n对一个表进行查询操作的可以使用户得到数据对一个表进行查询操作的可以使用户得到数据库中有关数据,这些数据是作为结果集,即表库中有关数据,这些数据是作为结果集,即表的形式存在的。在实际应用中,一个复杂的应的形式存在的。在实际应用中,一个复杂的应用程序往往采用非数据库语言(如用程序往往采用非数据库语言(如C、VB、ASP或其他开发工具)内嵌或其他开发工具)内嵌T-SQL的形式来开的形式来开发,而这些非数据库语言无法将表作为一个单发,而这些非数据库语言无法将表作为一个单元来处理,这就需要一种机制来保证每次处理元来处理,这就
27、需要一种机制来保证每次处理表中的一行或几行。为了解决这个问题,我们表中的一行或几行。为了解决这个问题,我们引入了游标的概念,来实现对表中的数据逐行引入了游标的概念,来实现对表中的数据逐行处理。处理。12.3.1 游标(游标(Cursor)概述)概述1. 游标的概念游标的概念n游标是一种处理数据的方法,具有对结果集进行逐行处理的能力。游标是一种处理数据的方法,具有对结果集进行逐行处理的能力。可以把游标看为一种特殊的指针,它与某个查询结果相联系,可可以把游标看为一种特殊的指针,它与某个查询结果相联系,可以指向结果集的任意位置,可以将数据放在数组、应用程序中或以指向结果集的任意位置,可以将数据放在数
28、组、应用程序中或其他地方,允许用户对指定位置的数据进行处理。其他地方,允许用户对指定位置的数据进行处理。n使用游标,可以实现以下功能:使用游标,可以实现以下功能:q允许对允许对SELECT返回的表中每一行进行相同或不同的操作,而不返回的表中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;是一次对整个结果集进行同一种操作;q从表中的当前位置检索一行或多行数据;从表中的当前位置检索一行或多行数据;q游标允许应用程序还提供对当前位置的数据进行修改、删除的能游标允许应用程序还提供对当前位置的数据进行修改、删除的能力;力;q对与其他用户对结果集包含的数据所做的修改,支持不同的可见对与其
29、他用户对结果集包含的数据所做的修改,支持不同的可见性级别。性级别。n在实现上,游标总是与一条在实现上,游标总是与一条SQL 选择语句相关联。因为游标由结选择语句相关联。因为游标由结果集和结果集中指向特定记录的游标位置组成。当决定对结果集果集和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。进行处理时,必须声明一个指向该结果集的游标。2. 游标的使用步骤游标的使用步骤nSQL Server对游标的使用要遵循以下顺序:对游标的使用要遵循以下顺序:(1)声明游标()声明游标(DECLARE):将游标与):将游标与T-SQL语句的结果集语句的结果集相关联,
30、并定义游标的名称、类型和属性,如游标中的记录相关联,并定义游标的名称、类型和属性,如游标中的记录是否可以更新、删除。是否可以更新、删除。(2)打开游标()打开游标(OPEN):执行):执行T-SQL语句以填充数据。语句以填充数据。(3)读取数据()读取数据(FETCH):从游标的结果集中检索想要查看):从游标的结果集中检索想要查看的行,进行逐行操作。的行,进行逐行操作。(4)关闭游标()关闭游标(CLOSE):停止游标使用的查询,但并不删):停止游标使用的查询,但并不删除游标定义,可以使用除游标定义,可以使用OPEN语句再次打开。语句再次打开。(5)释放游标()释放游标(DEALLOCATE)
31、:删除游标并释放其占用的):删除游标并释放其占用的所有资源。所有资源。n在上面的在上面的5个步骤中,前面的个步骤中,前面的4个是必须的。个是必须的。12.3.2 声明游标声明游标n声明游标的声明游标的DECLARE语法格式为:语法格式为:DECLARE 游标名称游标名称CURSORLOCAL|GLOBAL-游标的作用域游标的作用域FORWORD_ONLY|SCROLL-游标的移动方向游标的移动方向STATIC|KEYSET|DYNAMIC|FAST_FORWARD -游标的类型游标的类型READ_ONLY|SCROLL_LOCKS|OPTIMISTIC-游标的访问类型游标的访问类型TYPE_W
32、ARNING-类型转换警告信息类型转换警告信息FOR SELECT查询语句查询语句-SELECT查询语句查询语句FOR READ ONLY|UPDATEOF 列名称列名称,n-可修改的列可修改的列n声明游标后,除了可以使用游标名称引用游标外,还声明游标后,除了可以使用游标名称引用游标外,还可以使用游标变量来引用游标。游标变量的声明格式可以使用游标变量来引用游标。游标变量的声明格式为:为:DECLARE 变量名变量名 CURSORn声明变量后,变量必须和某个游标相关联才可以实现声明变量后,变量必须和某个游标相关联才可以实现游标操作。即使用游标操作。即使用SET赋值语句,将游标与变量关联。赋值语句
33、,将游标与变量关联。【例【例12-8】创建游标】创建游标cur1,使,使cur1可以对可以对student表所表所有的数据行进行操作,并将游标变量有的数据行进行操作,并将游标变量var_cur1与与cur1相关联相关联n对应的对应的T-SQL语句为:语句为:DECLARE cur1 CURSORFOR SELECT * FROM studentDECLARE var_cur1 CURSORSET var_cur1=cur112.3.3 打开游标打开游标n声明以后,如果要从游标中读取声明以后,如果要从游标中读取数据数据必须要打必须要打开游标。打开游标是指打开已经声明但尚未打开游标。打开游标是指打
34、开已经声明但尚未打开的游标,并执行游标中定义的查询。开的游标,并执行游标中定义的查询。n语法格式为:语法格式为:OPEN 游标名称游标名称n如果游标声明语句中使用了如果游标声明语句中使用了STATIC 关键字,关键字,则打开游标时产生一个临时表来存放结果集;则打开游标时产生一个临时表来存放结果集;如果声明游标时作用了如果声明游标时作用了KEYSET 选项,则选项,则OPEN 产生一个临时表来存放键值。所有的临产生一个临时表来存放键值。所有的临时表都存在时表都存在tempdb 数据库中。数据库中。n在游标被成功打开之后,全局变量在游标被成功打开之后,全局变量CURSOR_ROWS用来记录游标内的
35、用来记录游标内的数据数据行数。行数。CURSOR_ROWS的返回值有以下的返回值有以下四个,如表四个,如表 【例【例12-9】创建游标】创建游标cur1,使,使cur1可以对可以对student表所表所有的数据行进行操作,然后打开该游标,输出游标中有的数据行进行操作,然后打开该游标,输出游标中行数行数n对应的对应的T-SQL语句为:语句为:USE stuinfogoDECLARE cur1 CURSORFOR SELECT * FROM studentgoOPEN cur1SELECT 游标游标cur1数据行数数据行数=CURSOR_ROWSn执行结果为执行结果为-1,说明该游标是一个动态游标
36、,其值未,说明该游标是一个动态游标,其值未确定。确定。12.3.4 读取游标读取游标n当游标被成功打开以后,就可以使用当游标被成功打开以后,就可以使用FETCH 命令从游标中逐行地读取数据,以进行相关处命令从游标中逐行地读取数据,以进行相关处理。其语法规则为:理。其语法规则为:FETCHNEXT | PRIOR | FIRST | LAST | ABSOLUTEn|nvar| RELATIVE n|nvarFROM-读取数据的位置读取数据的位置GLOBAL 游标名称游标名称 | 游标变量名称游标变量名称INTO 游标变量名称游标变量名称 ,n-将读取的游标数据存放到指定变量中将读取的游标数据存
37、放到指定变量中nFETCH语句执行时,可以使用全局变量语句执行时,可以使用全局变量FETCH_STATUS返回上次执行返回上次执行FETCH 命令的状态。在每次用命令的状态。在每次用FETCH从游标中读取从游标中读取数据数据时,都应检查该变量,以确定上次时,都应检查该变量,以确定上次FETCH 操作是否成功,来决定如何进行下一操作是否成功,来决定如何进行下一步处理。步处理。FETCH_STATUS 变量有三个不变量有三个不同的返回值同的返回值,如表如表【例【例12-10】打开游标】打开游标cur1,从游标中提取数据,从游标中提取数据,并查看并查看FETCH命令执行状态命令执行状态对应的对应的T
38、-SQL语句为:语句为:OPEN cur1FETCH NEXT FROM cur1SELECT NEXT_FETCH执行情况执行情况=FETCH_STATUSn执行可以看到返回执行可以看到返回student表第一条学生的记表第一条学生的记录,录,FETCH_STATUS函数值为函数值为0。说明。说明执行成功。执行成功。 12.3.5 关闭游标关闭游标n 游标使用完成后要及时关闭。关闭游标使用游标使用完成后要及时关闭。关闭游标使用CLOSE 语句,但不释放游标占用的语句,但不释放游标占用的数据数据结构。结构。其语法规则为:其语法规则为: CLOSE GLOBAL 游标名称游标名称 | 游标变游标
39、变量名称量名称【例【例12-11】关闭游标】关闭游标cur1n对应的对应的T-SQL语句为:语句为:CLOSE cur1 12.3.6 删除游标删除游标n游标关闭后,其定义仍在,需要时可用游标关闭后,其定义仍在,需要时可用OPEN语句打开继续使用。若确认游标不再使用,可语句打开继续使用。若确认游标不再使用,可以删除游标,释放其所占用的系统空间。删除以删除游标,释放其所占用的系统空间。删除游标用游标用DEALLOCATE语句,定义格式为:语句,定义格式为:DEALLOCATE GLOBAL 游标名称游标名称 | 游标变量名称游标变量名称【例【例12-12】删除游标】删除游标cur1n对应的对应的
40、T-SQL语句为:语句为:DEALLOCATE cur1 12.4 创建分区创建分区n分区是分区是SQL Server 2005新引入的功能,在新引入的功能,在SQL Server 2008中得到更加广泛地运用与拓中得到更加广泛地运用与拓展。对于大型数据库来讲,采用分区技术可以展。对于大型数据库来讲,采用分区技术可以将数据存储在不同的分区,将复杂的查询问题将数据存储在不同的分区,将复杂的查询问题简单化。简单化。 分区是SQL Server 2005新引入的功能,在SQL Server 2008中得到更加广泛的运用与拓展。对于大型数据库来讲,采用分区技术可以将数据存储在不同的分区,将复杂的查询问
41、题简单化。 SQL Server 2008是一个全面的、集成的、端到端的数据解决方案,为企业中的用户提供了一个用于企业数据管理和商业智能开发的安全、可靠、高效的平台。12.4.1 12.4.1 分区概述分区概述分区技术的分类 1. 硬件分区2. 垂直分区3. 水平分区创建分区函数 分区函数指定用于分区数据的键的数据类型、分区数量、分区依据列以及每个分区的边界值。 使用CREATE PARTITION FUNCTION 语句创建分区函数。该命令的基本语法如下:CREATE PARTITION FUNCTION partition_function_name (input_parameter_ty
42、pe)AS RANGE LEFT/RIGHTFOR VALUES (boundary_value,n);创建分区方案 创建分区函数以后,必须将其与指定的分区方案相关联。分区方案将在分区函数中定义的分区映射到将物理存储这些分区的文件组。可将所有的分区映射到同一个文件组,也可将部分或全部分区映射到不同的文件组,根据具体需要定。 使用CREATE PARTITION SCHEME 语句创建分区方案。该命令的基本语法如下:CREATE PARTITION SCHEME partition_scheme_nameAS PARTITION partition_function_name TO (file_
43、group_name/PRIMARY,n);创建分区表 若一个表中包含了大量的、以多种不同方式使用的数据,且通常情况下的查询不能按照预期的情况完成,那么这时就可以考虑使用分区表。分区表是将数据水平划分为多个单元的表,这些单元可以分布到数据库中的多个不同的文件组中。 CREATE TABLE 表名称( 列名 数据类型,列名 数据类型,列名 数据类型,)ON 分区方案名称(该表分区的列)管理分区 分区过程不是静态的,可对分区表执行三个主要操作:切换分区、合并分区和拆分分区。可用到这SPLIT、MERGE和SWITCH三个运算符管理分区。 切换分区: 使用ALTER TABLE 语句的SWITCH
44、子句可将已填充的表或分区与空的表或分区进行交换。合并分区: 可使用ALTER PARTITION FUNCTION 语句合并分区。执行合并操作时,在这个语句中,指定了边界值的分区将被删除,并且该数据合并到相邻的分区中。拆分分区 也使用ALTER PARTITION FUNCTION 语句来拆分分区。将创建新分区,并相应的重新分配数据。新的分区创建在基于分区函数的每一个分区方案中指定为下一个文件组的文件组中。使用向导创建分区表12.5 SQL Server服务体系n在SQL Server 2008中,除了本书前面章节介绍的最常用的数据库管理部分,还包含了许多新特性,包括报表服务、集成服务和分析服
45、务等,所有这些组件都基于.NET Framework的程序库。通过本节的学习,读者将会对SQL Server 2008所提供的服务体系有一个系统的全新的认识与了解。SQL Server服务体系报表服务 SQL Server 2008报表服务(SQL Server Reporting Services,SSRS)是基于服务器的报表平台,它可以用来创建和管理包含关系数据源和多维数据源中的数据的表格、矩阵、图形和自由格式的报表。 SQL Server 2008 Reporting Services服务体系的组件和工具 运行SQL Server 2008 Reporting Services服务 集成
46、服务 SQL Server集成服务(SQL Server Integration Services ,SSIS)是SQL Server产品中最新的ETL工具。SQL Server 2005版本中发布的ETL工具是SQL Server 2000数据转换服务(Data Transformation Services ,DTS)的替代。 分析服务 SQL Server 2008分析服务(Microsoft SQLServer Analysis Services,SSAS)是微软SQL Server 2008中的多维联机分析处理(Online Analytical Processing,OLAP)组件,它在商业智能(Business Intelligence,BI)分析方案中集成关系型和OLAP数据。 在SQL Server 2008中,Analysis Services 进行了重大的更改。这些更改可能导致基于 SQL Server 的早期版本的应用程序、脚本或功能无法继续使用。在用户进行升级时可能会遇到一些问题。