Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10077058
  • 博文数量: 299
  • 博客积分: 9955
  • 博客等级: 中将
  • 技术积分: 4177
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-27 20:59
文章分类
文章存档

2015年(1)

2012年(2)

2011年(9)

2010年(47)

2009年(108)

2008年(132)

我的朋友

分类: Mysql/postgreSQL

2009-10-02 11:31:55

第21学时SQL Server编程
在前几个学时里,你已经学习了几乎所有编写SQL Server脚本必须掌握的知识。由一些
基本逻辑组成的这些脚本可以转换为功能强大的应用程序。SQL Server提供若干不同的逻辑
语句,可以加到你的脚本中。它们包括I F. . . E L S E逻辑和用于循环的W H I L E结构。S Q L也为生
成错误信息提供了功能,你可以把这些出错信息返回给用户。
本学时的要点包括:
• 通常意义上的编程
• 批
• 事务
• 流控制
• 注释
• 变量
21.1 通常意义上的编程
SQL Server可以用来生成功能强大的应用程序。这通常是通过使用脚本、触发器、存储
过程以及视图来实现的。当你首次设计这些应用程序时必须非常仔细。这种依赖于S Q L
S e r v e r以实现其所有功能的应用程序,小规模安装较为适合,问题出在大规模安装时,这种情
况下性能有时会受到影响。
在本学时里,我们将要学习许多用于SQL Server的编程术语和结构。如果你以前从未编
写过程序,其中一些程序结构似乎令人胆怯。但你完全不必担心,因为你所涉及到的数据库
不是正式使用的成品系统,里面不含有任何真实的商业数据。
21.2 批
在SQL Server编程中,术语“批( b a t c h )”将大量用到。可用两种情形定义批。第一种是批
过程。批过程是从大型机时代遗留下来的产物。由于在商用高峰时段内处理器周期有限,只
能对活动的系统做极小的改变。批就在非高峰期内运行完成剩余的变化,并把它们填充到各
自的区域和系统中去。虽然在SQL Server中这种过程仍称为批过程,但这并不是我们通常所
指的批。
另一种SQL Server中所提到的批是指工作单元。批是一组S Q L语句,它被应用程序同时发
送给SQL Server执行。SQL Server从批中读取所有语句,并把它们编译成可执行的单元。该可
执行单元就是执行计划。SQL Server然后就一次执行执行计划中的所有语句。
SQL Server可有多种方法来处理批中发生的错误:
• 如果批中有任何语句出现了语法错误, SQL Server都不会生成执行计划。因此,批中任
何语句都无法运行。例如:错拼单词“ S E L E C T”造成的语法错误。
• 大多数运行期间发生的错误,比如算术溢出,将使当前执行的语句终止并中断该语句之
后的运行。
• 大多数C R E AT E语句不能在同一个批中混合使用。换句话说,在同一个批里,你不可以
既运行C R E ATE TA B L E语句,也运行其他C R E AT E语句。
• 在同一个批中你不能运行一个A LTER TA B L E命令后接着引用增加到该表中的新列,这
是因为SQL Server提前编译批并在该表中查找那些列。因为那些列还未生成,所以导致
编译失败。
• 如果你在同一个批中运行多个存储过程,SQL Server要求它们运行时使用E X E C U T E语句。
为了在S Q L脚本中给批定界, SQL Server用到了关键字G O。用这个关键字时,我们要做
的是把G O放在一系列语句之后,使它们能作为一个单独的批运行。例如在程序清单2 1 - 1里,
我们在一个批中先打开一个数据库;在另一个批中建了一个表;在第三个批中执行了
I N S E RT、U P D AT E、D E L E T E语句,最后一个批删除已建立的表。所有这些可以一次运行,
SQL Server仅把这些语句分成不同部分。
程序清单21-1 批语句范例
批的另一个好处是它们可以把你的代码分成小段,即使前一个小段运行失败,其他的仍
然可以继续。这使得我们能使用事务的概念。
21.3 事务
事务是SQL Server防止你的数据出现不一致状态的基础结构。我们已经学习过事务是如
何工作的。在这一节中,我们将学习在SQL Server 开发环境下如何让事务为你工作。S Q L
S e r v e r中事务有两种,它们是隐式事务和显式事物。
21.3.1 隐式事务
隐式事务是SQL Server 为你而做的事务。隐式事务又称自动提交事务。如果运行一条
I N S E RT语句,SQL Server将把它包装到事务中,如果此I N S E RT语句失败, SQL Server将回滚
或取消这个事务。每条S Q L语句均被视为一个自身的事务。例如在程序清单2 1 - 2中,有四条
I N S E RT语句。第一、二、四条是有效的,第三条语句是无效的。因为它违反了该表中有关作
者标识必须唯一的约束。当程序运行时,第一、二、四条语句执行成功并插入表中。第三条
第2 1学时SQL Serv e r编程2 0 5
下载
语句失败并回滚。
程序清单21-2 隐式事务
在日常操作中,你可能依赖于隐式事务。在第三方应用程序中,这些应用程序的开发人
员则可能使用显式事务。
21.3.2 显式事务
显示事务是一种由你自己指定的事务。这种事务允许你自己决定哪批工作必须成功完成,
否则所有部分都不完成。为了给自己的事务定界,可以使用关键字BEGIN TRANSACTION和
ROLLBACK TRANSACTION或COMMIT TRANSACTION。
• BEGIN TRANSACTION—这个关键词用来通知SQL Server 一个事务就要开始了。
BEGIN TRANSACTION后面发生的每一条S Q L语句都是同一个事务中的一部分。
• ROLLBACK TRANSACTION—这个关键词用来通知SQL Server自BEGIN TRANSACTION
后的所有工作都应取消,对数据库中任何数据的改变都被还原,任何已经创建或删除的对
象被清除或恢复。
• COMMIT TRANSACTION—这个关键词用来通知SQL Server自BEGIN TRANSACTION
后的全部工作都要完成并成为数据库的一个永久性部分。在同一个事务中,你不能同时
使用ROLLBACK TRANSACTION和COMMIT TRANSACTION。
你必须意识到,即使你的脚本中有错误,而你又让SQL Server提交事务,该事务也将执
行。如果你打算依赖于现实事务保证数据完整性,必须在脚本中建立错误检查机制。程序清
单2 1 - 3中的代码显示了运用显式事务来回滚对e m p l o y e e s表的改动。
程序清单21-3 显式事务
2 0 6 SQL Server 7 24学时教程
下载
查询结果如图2 1 - 1所示。
从结果中你可以看出,我们在删除操作之后未能从S E L E C T语句返回任何行。这表明了实
际运行情况。如果用一个COMMIT TRANSACTION代替ROLLBACK TRANSACTION,S Q L
S e r v e r就会使这些改变成为永久性的。在你对一个表进行更新或删除时,这种语句很有用。假
如你开始一个事务,接着更新或删除,如果你不小心删除或更新了多于你期望的行时,可以
回滚事务。同样你也要记住,在开始事务到提交或回滚事务的这段时间里,该事务所影响到
的数据对服务器上的其他任何会话来说都是不可见的。
21.4 流控制
SQL Server提供了几种流控制关键字,可用于控制SQL Server如何去执行批或过程中的语
句。如果不使用流控制关键词, SQL Server将按顺序方式执行脚本中的语句。相反,如果使
用了流控制语言,就可以将语句分组并根据批或过程中的判断标准来控制它们的执行。必须
注意:流控制语句功能虽然强大,但它不能跨越多个批或过程。
21.4.1 BEGIN...END
B E G I N . . . E N D关键词对用来将一个S Q L语句块组织在一起,以达到一起执行的目的。它
之所以是一对重要的关键词,是因为它可以和许多其他的流控制关键词一起使用。该语句的
语法如下:
其中< s q l s t a t e m e n t >是任何合法的S Q L语句或语句组。需要用户加以注意的是它必须包含
在一个单独的批中。
21.4.2 IF...ELSE
大多数编过程序的人都知道I F. . . E L S E结构。该语句通常也写做I F. . . T H E N . . . E L S E语句,但
第2 1学时SQL Serv e r编程2 0 7
下载
图21-1 程序清单2 1 - 3的查
询结果
在SQL Server中去掉了T H E N。这种结构通常用来判别条件是否满足,接下来根据条件,或是
执行I F语句后的代码段,或是执行E L S E后的代码段。如果没有E L S E语句而且I F条件不成立,
SQL Server将跳过I F语句后的代码段,继续执行后面的程序。该命令的语法如下:
选项的意义如下:
可用的语句描述
< B o o l e a n e x p r e s s i o n > 用来判别Tr u e或F a l s e的表达式。可以使用S E L E C T语句作为这个表达式。这
样使用时,必须用圆括号括住S E L E C T语句
< s q l s t a t e m e n t s > 这既可以是单个S Q L语句,也可以是一组S Q L语句。如果在I F或E L S E语句后
面有多条S Q L语句,你必须把它们放在B E G I N . . . E N D块中
这种结构可以构建一些功能强大的应用程序代码。程序清单2 1 - 4显示了I F. . . E L S E语句的
一个简单应用,用来判定有多少作者住在加州,或者是否有作者住在加州。
程序清单21-4 IF. . . E L S E语句
21.4.3 WHILE
W H I L E语句用于创建一个循环, SQL Server将在该循环中连续执行一个功能,直到循环
条件为假。更新状态下当你在表中查找用于显示的特定值时,或者连续进行一个处理时,这
种执行方式尤其有用。最后,还可以通过设置一个永远为真的条件,如1 = 1,使循环一直进行
下去。该命令的语法如下:
选项的意义如下:
选项描述
< B o o l e a n e x p r e s s i o n > 用来判别Tr u e或F a l s e的表达式。可以使用S E L E C T语句作为这个表达式。这
样使用时,必须用圆括号括住S E L E C T语句
<s q l s t a t e m e n t s > 这既可以是单个S Q L语句,也可以是一组S Q L语句。如果在W H I L E语句后面
有多条S Q L语句,你必须把它们放在B E G I N . . . E N D块中
B R E A K 这个关键字用于终止循环。作为循环结束标志的E N D关键字之后的语句接着
执行
C O N T I N U E 该关键字使循环重新开始,而忽略C O N T I N U E后的所有语句
2 0 8 SQL Server 7 24学时教程
下载
程序清单2 1 - 5是W H I L E循环的一个例子。注意所有的数据变化均发生在同一个事务中,
所以它们在处理结束时要么完成,要么取消。
程序清单21-5 WHILE循环
21.4.4 GOTO和RETURN
最后一种流控制语句是G O TO语句。用户在使用它时必须十分谨慎,因为过多地使用它会
使代码难读,执行速度降低。该语句通常和R E T U R N语句一起使用。G O TO语句用于让S Q L
S e r v e r跳转到S Q L代码中的指定标记处,标记设计成如下形式:
要注意,标记除了向SQL Server指明跳转的地方外,在代码中没有什么其他用途。G O TO
和标记之间的语句跳过不被执行。与G O TO语句一起使用R E T U R N语句的目的是为了防止当
G O TO语句没执行,脚本顺序执行到标记处时,标记处的所有代码段也被执行。R E T U R N语
句用来无条件地终止一个批或过程。R E T U R N后面的语句都不能执行。
R E T U R N和G O TO语句的语法如下:
选项的意义如下:
选项描述
l a b e l n a m e 告诉SQL Server跳转到何处的一个表达式
< s q l s t a t e m e n t s > 这是一条或一组S Q L语句
< r e t u r n c o d e > 这是可以和R E T U M语句一起使用的整型编码。在存储过程中,这个编码可以返
回该过程运行的信息
第2 1学时SQL Serv e r编程2 0 9
下载
再次重申:使用G O TO语句必须非常谨慎,因为它会导致一些很糟糕的代码。为确保你的
代码易于阅读和被别人理解,要做的另一件事就是在代码中加上注释。
21.5 注释
注释代码是一件非常重要的事情,这样可以保证你和别人在阅读这些代码时弄清它的意
思。你应该在代码中放进注释,说明它用来做什么、使用什么参数、输出了什么。你还应该
在代码发生变化时加以注释并说明原因。
你也可以用注释符使目前不想运行的部分代码临时失效。这一功能在调试时非常有用。
SQL Server支持两种注释符:
• /*...*/ —这种注释符可用来注释一整块的程序,包括多个行。/ *用来表示注释开始, * /
用来表示注释结束。必须注意:在注释语句中不能使用单词G O。否则注释区就会破裂,
SQL Server将试图执行注释区的语句,导致系统出错。
• - - —这种注释符是用来注释单个行的,这可以用在每行的开头和结尾。当要在多行中
使用时,你必须在每行的开头都放上- -注释符。
注释的重要性怎么强调都不为过,注释中最重要的部分是解释使用这些代码的目的以及
它们怎样工作。如果你有一段时间没有理会一段代码,当代码需要变动时,注释变得更重要。
21.6 变量
变量在编程中占有极其重要的地位。一个变量完全由你来创建,并可为它赋值。本地变
量是由用户自己创建并赋值的,也只有创建它的用户可以看到它。全局变量是由一个用户创
建并赋值,但可被系统中所有人看到的变量。当定义变量时,通过定义变量的数据类型来告
诉SQL Server该变量处理什么样的数据。
21.6.1 创建变量
要在SQL Server中创建变量,你必须给变量一个名称并定义变量的数据类型。变量创建
后,SQL Server将给它赋N U L L值然后等待你给它一个值。变量用D E C L A R E语句来创建。当
声明一个新变量时,名称前面应有@符号作为该名称的第一个字符。该语句的语法如下:
选项的意义如下:
选项描述
@ v a r i a b l e n a m e 这是在程序中所用的变量名字
d a t a t y p e 这是数据类型,在第7学时“创建表”中讲述过。你必须在程序中给变量赋该类
型的值
例如:为了声明一个不超过6 4个字符的字符型变量a u t h o r n a m e,应使用以下语句:
21.6.2 赋值变量
既然已经了创建变量,你就可以给变量赋值。正如前面所述, SQL Server在变量创建时赋
给变量N U L L值。给一个变量赋值有两种方法,首选方法是用S E T语句,另一种是用S E L E C T
2 1 0 SQL Server 7 24学时教程
下载
语句。S E T语句的语法如下:
选项的意义如下:
选项描述
@ v a r i a b l e n a m e 这是要赋值的变量名
< v a l u e > 这是要赋给变量的值
为了用S E T语句给我们刚才创建的变量赋值,可运行以下语句:
可以用S E L E C T关键字为变量赋值,方法同S E T语句。不同之处仅在于单词S E T E C T代替
了S E T,如下:
现在你可以随心所欲在使用常量的地方使用变量了。
21.7 课时小结
在这一学时里,我们已学习了用于SQL Server编程的大部分语法。但没有对如何编程进
行深入的讨论。我们也学习了批和事务的概念,以及它们是如何相互作用的。接着我们学习
了流控制语言及其是如何工作的。然后我们学习了写SQL Server脚本过程中最重要的部分—
注释。你应该注释你所编写的每一段代码。最后我们还学习了变量及其用法。
21.8 专家答疑
问题:一个事务可以涉及多个批吗?
解答:是的,一个事务可以涉及多个批。
问题:注释真如文中所述的那样重要吗?
解答:为了能使你明白注释的重要性,我们首先回顾一下计算机编程的历史。在9 0年代
后期全世界被千年虫问题所困扰,这个问题的由来就是因为在过去的计算机和软件只识别年
份的最后两位数。当2 0 0 0年来临时,计算机理所当然地认为是1 9 0 0年,这就会埋下许多事故
的隐患。再回头修改那些问题时,遇到的难题之一便是许多软件没有注释,并且人们为日期
用了很多千奇百怪的名字。诸如使用编程者的妻子或狗的名字来为日期命名的笑话屡见不鲜。
如果代码能通过注释来进行很好地管理,这个问题当然容易解决。
21.9 课外作业
这些思考题和练习题是供你加深理解用的。答案可以在附录“答案”中找到。
21.9.1 思考题
1) 什么是批?
2) 用什么关键字来指定批?
3) 什么是事务?
4) 如果要取消一个事务,可以使用什么关键字?
5) 什么是流控制语言?
第2 1学时SQL Serv e r编程2 1 1
下载
6) 可以用什么流控制语句来创建一个循环结构?
7) 可以用什么字符来指定一行注释?
8) 什么是变量?
9) 如何指定一个变量?
21.9.2 练习题
写一个S Q L脚本用于创建一个名为Te s t Ta b l e的表,该表只有一个叫c o l u m n 1的列,数据类
型为整型。创建一个无穷循环结构,插入数值到表中,直到有1 0 0条记录。用变量记录已存储
到表中的记录数,当变量的值达到1 0 0时,使用B R E A K语句退出循环。
阅读(1101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~