第十一章 SQL Server程序设计
11.1 程序中的批处理、脚本、
注释
11.2 程序中的事务
11.3 SQL Server变量
11.4 SQL语言流程控制
11.5 案例应用举例练 习 题目录
11.1 程序中的批处理、脚本、
注释
11.1.1 批处理
11.1.2 脚本
11.1.3 注释
11.1.1 批处理什么是批处理呢?批处理就是一个或多个
T—
SQL语句的集合,从应用程序一次性发送到
SQL Server并由 SOL Server编译成一个可执行单元,此单元称为执行计划。执行计划中的语句每次执行一条。
建立批处理时,应当注意的几点。
11.1.2 脚本脚本是以文件存储的一系列 SQL语句,即一系列按顺序提交的批处理。
T-SQL脚本中可以包含一个或多个批处理。
GO语句是批处理结束的标志。如果没有 GO语句,则将它作为单个批处理行。
脚本可以在查询分析器中执行,也可以在
isql或 osql实用程序中执行。
11.1.3 注释注释是指程序中用来说明程序内容的语句,
它不能执行且不参与程序的编译。注释用于语句代码的说明,或暂时禁用的部分语句。为程序加上注释不仅能增强程序的可读性,而且有助于日后的管理和维护,在程序中使用注释是一个程序员良好的编程习惯。 SQL Server支持两种形式的注释语句。
1,行内注释
2.块注释
11.2 程序中的事务
11.2.1 事务概述
11.2.2 事务处理语句
11.2.3 分布式事务
11.2.4 锁定
11.2.1 事务概述由于事务的执行机制,确保了数据能够正确地被修改,避免造成数据只修改一部分而导致数据不完整,或是在修改途中受到其他用户的干扰。事务有 4个原则,统称 ACID原则。
·原子性 (Atomic)。
·一致性 (ConDemoltent)。
·隔离性 (Isolated)。
·持久性 (Durable)。
事务可分为两种类型:系统提供的事务和用户定义的事务。
系统提供的事务是指在执行某些 T-SQL语句时,
一条语句就构成了一个事务,这些语句是:
ALTER TABLE CREATE DELETE
DROP FETCH GRANT INSERT
OPEN REVOKE SELECT UPDATE
TRUNCATE TABLE
11.2.2 事务处理语句事务处理语句包括 BEGIN TRANSACTION、
COMMIT TRANSACTION和 ROLLBACK
TRANSACTION语句。
·BEGIN TRANSACTION语句
BEGIN TRANSACTION语句作为事务的开始,
其语法格式为:
BEGIN TRANSACTION
[transaction_name|@tran_name_variable]
[WITH MARK[‘description’]]
·COMMIT TRANSACTION语句
COMMIT是提交语句,它使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,也标志一个事务的结束,其语法格式为:
COMMIT TRANSACTION
[transaction_name|@tran_name_variable]
·ROLLBACK TRANSACTION语句
ROLLBACK TRANSACTION语句是回滚语句,
它使得事务回滚到起点或指定的保存点处,它也标志一个事务的结束,其语法格式为:
ROLLBACK TRANSACTION
[transaction_name|@tran_name_variable
|savepoint_name|@savepoint_variable]
11.2.3 分布式事务
SQL Server 2000可支持包括多于一台服务器的事务,它是用 MSDTC(Microsoft分布事务合作 )服务来支持的。
有 3种方法可使用分布式事务:
·用 DB— Lib API(应用程序接口 )编写分布事务程序,它超出了本书的范围。
·使用 T— SQL语法 BEGIN DISTRIBUTED
TRANSACTION。
·可用 SET REMOTE_PROC_TRANSACTION
为单个会话启动分布式事务。
11.2.4 锁定当多个用户对数据库访问时,为了确保事务完整性和数据库一致性,需要使用锁定。如果没有锁定,SQL Server就没有防止多个用户同时更新同一数据的机制。一个锁就是在多用户环境中对某一种正在使用的资源的一个限制,
它阻止其他用户访问或修改资源中的数据。
SQL Server为了保证用户操作的一致性,自动对资源设置和释放锁。
1,锁定粒度在 SQL Server中,可被锁定的资源从小到大分别是行、页、扩展盘区、表和数据库,被锁定的资源单位称为锁定粒度,上述五种资源单位其锁定粒度按由小到大排列。
2,锁模式通常,SQL Server中有三类锁。
·共享锁:也称为读锁,是加在正在读取的数据上的。
·更新锁:更新锁防止别人在改变数据的过程中修改数据。
·排他锁:当要改变数据时使用排他锁。其他事务不能读取或修改排他锁锁定的数据。
3,死锁死锁是指两个事务阻塞彼此进程而互相冲突的情况。
11.3 SQL Server变量
11.3.1 全局变量
11.3.2 局部变量
11.3.1 全局变量全局变量是系统提供且预先声明的变量。
全局变量在所有存储过程中随时有效,用户利用全局变量,可以访问服务器的相关信息或者有关操作的信息。用户只能引用不能改写,且不能定义和全局变量同名的局部变量,引用时要在前面加上 @@标记 。
11.3.2 局部变量局部变量是用户自己定义的,只在定义它的批处理或存储过程中使用。一般用于变量计数或作为其他变量值的存储元。
1,声明局部变量
DECLARE语句的浯法格式为:
DECLARE @局部变量 数据类型 [1…n]
2.给局部变量赋值所有变量声明后,均被初始化为 NULL。
(1)用 SELECT语句为局部变量赋初值用 SELECT为局部变量赋初值的语法格式如下:
SELECT @变量名 =表达式 [,…n]
(2)用 SET语句为局部变量赋初值用 SET语句为局部变量赋初值的语法格式如下:
SET @变量名 =表达式 [,…n]
3.局部变量的作用域局部变量的作用域指可以引用该变量的范围,局部变量的作用域从声明它的地方开始到声明它的批处理或存储过程束。也就是说,局部变量只能在声明它的批处理、存储过程或触发器中使用,一旦这些批处理或存储过程结束,
局部变量将自消除。
11.4 SQL语言流程控制
11.4.1 BEGIN…END 语句块
11.4.2 IF…ELSE 语句
11.4.3 CASE结构
11.4.4 WAITFOR语句
11.4.5 PRINT语句
11.4.6 WHILE语句
11.4.1 BEGIN…END 语句块
BEGIN…END 语句的语法格式为:
BEGlN
{语句组 }
END
BEGIN…END 语句块可以嵌套。
11.4.2 lF…ELSE 语句
IF…ELSE 语句的语法格式为:
IF 布尔表达式语句 1
[ELSE
语句 2]
其中布尔表达式表示一个测试条件,其取值为 TRUE或 FALSE。
11.4.3 CASE结构
CASE具有两种格式。
1.简单 CASE表达式
CASE 条件表达式
WHEN 表达式值 1 THEN 结果表达式 1
[WHEN 表达式值 2 THEN 结果表达式 2
[…]]
[ELSE 结果表达式 n]
END
2.搜索 CASE表达式
CASE
WHEN 逻辑表达式 1THEN 结果表达式 1
[WHEN 逻辑表达式 2THEN 结果表达式 2
[… ]]
[ELSE 结果表达式 n]
END
11.4.4 WAITFOR语句
WAITFOR语句指定触发语句块、存储过程或事务执行的时间、时间间隔或事件。其语法格式为:
WAITFOR DELAY ‘时间’ |TIME ‘时间’
11.4.5 PRINT语句
SQL Server向客户程序返回信息的方法除了使用 SELECT语句外,还可以使用 PRINT 语句,
它的语法格式为:
PRINT 字符串 |函数 |局部变量 |全局变量
11,4.6 WHILE语句过逻辑表达式来设置一个循环条件,当条件为真时,重复执行一个 SQL语句或语句块,
否则退出循环,继续执行后面的语句。
WHILE语句的语法格式为:
WHILE 逻辑表达式
BEGIN
语句块 l
[BREAK]
语句块 2
[CONTINUE]
语句块 3
END
11.5 案例应用举例在查询分析器下创建脚本文件 chaxun.sql,
用来输出所有学生各门课程的成绩,并对课程加以备注,运行结果如图 11.11所示,操作步骤如下:
(1)打开查询分析器。
(2)在查询分析器窗口中输入代码。
(3)在查询分析器“文件”菜单下单击“保存”
命令,在对话框“保存查询”中输入文件名
chaxun.sql,单击“保存 (S)”按钮。
练 习 题
1,什么是全局变量?什么是局部变量?
2,什么是事务?事务有哪些特性?
3,怎样给变量赋值?
4,什么是批处理?批处理的结束标志是什么?
5,编写程序,求 2~ 500之间的所有素数。