第十一章 SQL程序设计
?程序中的批, 脚本, 注释
?程序中的事务
? SQL Server变量
?程序中的流程控制
第十一章 SQL程序设计
?程序中的批处理, 脚本, 注释
当要完成的任务不能由单独的 Transact-SQL语句来完成时, SQL
Server使用批处理, 脚本, 存储过程, 触发器等来组织多条 Transact-
SQL语句 。
1,批处理
批处理就是一个或多个 Transact-SQL语句的集合, 从应用程序 — 次性发
送到 SQL Server并由 SQL Server编译成 — 个可执行单元, 此单元称为执行计
划 。 执行计划中的语句每次执行一条 。 建立批处理时, 使用 GO语句作为批处
理的结束标记 。 在一个 GO语句行中不能包括其他 Transact-SQL语句, 但可以
使用注释文字 。 当编译器读取到 GO语句时, 它会把 GO语句前面所有的语句
当作一个批处理, 并将这些语句打包发送给服务器 。 GO语句本身并不是
Transact-SQL语句的组成部分, 它只是一个用于表示批处理结束的前端指令 。
如果在一个批处理中包含任何语法错误, 如:引用了一个并不存在的对象,
则整个批处理就不能被成功地编译和执行 。 如果一个批处理中某句有执
行错误, 如违反了约束, 它仅影响该语句的执行, 并不影响批处理中其他语
句的执行 。
第十一章 SQL程序设计
?程序中的批处理, 脚本, 注释
建立批处理时,应当注意以下几点:
1,CREATE DEFAULT,CREATE PROCEDURE,CREATE
RULE,CREATE TRIGGER及 CREATE VIEW语句不能与其他语句
放在一个批处理中。
2、不能在删除一个对象之后,在同一批处理中再次引用这个对象。
3、不能在一个批处理中引用其他批处理中所定义的变量。
4、不能把规则和默认值绑定到表字段或用户自定义数据类型之后,
立即在同 — 个批处理中使用它们。
5、不能定义一个 CHECK约束之后,立即在同一个批处理中使用该
约束。
6、不能在修改表中的一个字段名之后,立即在同一个批处理中引用
新字段名。
7、如果一个批处理中的第一个语句是执行某个存储过程的
EXECUTE 语句,则 EXECUTE关键字可以省略;如果该语句不是第
一个语句,则必须使用 EXECUTE关键字,或者省写为,EXEC”。
第十一章 SQL程序设计
?程序中的批处理, 脚本, 注释
2,脚本
脚本是存储在文件中的一系列 SQL语句,即一系列按顺序提交的
批处理。
Transact-SQL脚本中可以包含一个或多个批处理。 GO语句是批
处理结束的标志。如果没有 GO语句,则将它作为单个批处理执行。
使用脚本可以将创建和维护数据库时的操作步骤保存为一个磁盘文件
。将 Transact-SQL语句保存为脚本文件,不仅可以建立起可再用的模
块化代码,还可以在不同计算机之间传送 Transact-SQL语句,使两台
计算机执行同样的操作。
脚本可以在查询分析器中执行,也可以在 isql或 osql实用程序中执
行。查询分析器是建立、编辑和使用脚本的一个最好的环境。在查询
分析器中,不仅可以新建、保存、打开脚本文件,而且可以输入和修
改 Transact-SQL语句,还可以通过执行 Transact-SQL语句来查看脚本
的运行结果,从而检验脚本内容的正确性。
第十一章 SQL程序设计
?程序中的批处理, 脚本, 注释
3,注释
注释是指程序中用来说明程序内容的语句,它不能执行且不参与
程序的编译。注释用于语句代码的说明,或暂时禁用的部分语句。为
程序加上注释不仅能增强程序的可读性,而且有助于日后的管理和维
护。
1)行内注释。如果整行都是注释而并非所要执行的程序行,则该行可用行
内注释,语法为:
--注释语句:这种注释形式用来标志一行注释,可以与要执行的代码处在同
一行,也可以另起一行。从双连字符( - -)开始到行尾均为注释。
2)块注释如果要给程序所加的注释内容较长,则可使用块注释,语法为:
/*注释语句 */:这种注释形式用来标志多行注释,可以与要执行的代码处在同
一行,也可以另起一行,甚至可以放在可执行代码内。对于多行注释,必须
使用开始注释字符对( /*)开始注释,使用结束注释字符对( */)结束注释,
*/和 */之间的全部内容都是注释部分。注意多行注释不能跨越批处理,整个注
释必须包含在一个批处理中。
第十一章 SQL程序设计
?程序中的事务
事务是最小的工作单元。这个工作单元要么成功完成所有操作,
要么就是失败,并将所做的一切复原。
1,概述
事务可以用于确保数据能够正确地被修改,避免造成数据只修改
一部分而导致数据不完整,或是在修改途中受到其他用户的干扰。事
务有 4个特性。:
原子性( Atomic) 事务是原子的,要么完成整个操作,要么退出所有操作
。如果任何语句失败,则所有作为事务一部分的语句都不会运行。
一致性( ConDemoltent)在事务完成或失败时,要求数据库处于一致状态。
由事务引发的从一种状态到另一种状态的变化是一致的。
独立性( Isolated)事务是独立的。它不与数据库的其他事务交互或冲突。
持久性( Durable)称事务是持久的,是因为在事务完成后它无须考虑和数
据库发生的任何事情。如果系统掉电且数据库服务器崩溃,事务保证在服务
器重启后仍是完整的。
第十一章 SQL程序设计
?程序中的事务的类型
1)显式事务
显示事务是手工配置的事务。用保留字标识显式事务的开始和结束
。保留字包括 BEGIN TRANSACTION,COMMIT TRANSACTION,ROLLBACK
TRANSACTION和 SAVE TRANSACTION,其中 TRANSACTION可以简写为 TRAN
。
要开始显式事务,首先输入关键词 BEGIN TRAN。
要结束显示事务,使用 COMMIT TRAN。
如果要取消事务,使用 ROLL BACK TRAN命令,ROLLBACK TRAN将完全
取消事务,或将事务恢复到初始状态。
可以使用 SAVE TRAN命令生成存储点,然后有选择性地恢复到那些
点。事务内部存储点的数目没有明确的约束,而且可以在一个事务中
出现重复的存储点名字。然而,只有最后那个存储点名字会被用于复
原到指定点。
第十一章 SQL程序设计
?程序中的事务的类型
2) 隐式事务
有时候看起来没有使用事务,但它们可能隐藏在幕后,这种事务叫
做隐式事务。
要使用这种模式,必须使用 Set Implicit_Transactions On语句
来设置连接。 SQLServer的任何数据修改语句,都是隐式事务。下列的
任何一条语句都可以作为一个隐式事务的开始,ALTER TABLE,CREATE
,DELETE,DROP,FETCH,GRANT,INSERT,OPEN,REVOKE,SELECT
,TRUNCATE TABLE,UPDATE。
要结束隐式事务,必须使用 COMMIT TRANSACTION或 ROLLBACK
TRANSACTION语句。之后,任何指令的命令都将会开始另一个事务。
第十一章 SQL程序设计
?程序中的事务的工作机制
例,BEGIN TRAN
INSERT INTO 课程 (课程号,课程名,备注 ) VALUES('0001','大学语文 ','')
UPDATE 教学计划 SET 启始周 =2 WHERE 专业代码 ='0101'
DELETE 教师 WHERE 姓名 IS NULL
COMMIT TRAN
1) 当 BEGIN TRAN语句到达数据库时,SQL Server分析出这是显式事务的开始,
SQL Server找到下一个可用的内存日志页面,并给新事务分配一个事务 ID。
2) 接着运行 INSERT语句,新的行被记录到事务日志中,数据页面在内存中进
行修改,如果所需页面不在内存中,则从磁盘调出。
3)下一个语句以相似方式运行。 UPDATE语句记录在事务日志中,数据页在内
存中进行了修改。
4)当 SQL Server收到 COMMITTRAN时,日志页面被写到数据库的日志设备上,
这样才能保证日志可以被恢复。由于日志变化写入了硬盘,它保证事务是可恢
复的,即使 掉电了或在数据页写入磁盘时数据库崩溃了,也能进行事务
恢复。
第十一章 SQL程序设计
?程序中的检查点的处理
SQL Server中有二类检查点:自动检查点和手工检查点 。
自动检查点是基于 SQL Server计算的 。 可在 RECOVERY INTERVAL配
置选项中规定检查点处理的频率 。 该选项指出以分钟为单位的用来恢
复系统中数据库的最大时间间隔 。 如果 SQL Server认为恢复数据库要
大量时间, 它将发出自动检查点 。 这时, 所有修改过的内存中的数据
页面将写入磁盘 ( 包括日志页面 ), 自动检查点每 60秒检查一次, 并
在各数据库之间循环, 以决定该数据库是否需要赋予检查点 。 注意,
对带有, trunc.log on Chkpt.”选项设置的数据库, 该过程将从日志
中截断已提交的事务 。
手工检查点可在任何时候输入 Transact-SQL命令 CHECKPOINT来强
制执行 。 注意, 只有 SA或数据库的 DBA才能执行该命令 。 发出手工检查
点指令后, 内存中所有修改过的页面记入磁盘, 就象自动检查点处理
时所发生的情况一样 。 注意, 手工检查点对事务日志无效 ( 即不将它
写入磁盘 ), 不考虑是否设置了, trunk.log on Chkpt.”数据库选项 。
第十一章 SQL程序设计
?锁
锁用来提供数据库的并发性控制。如果没有锁,SQL Server就没
有防止多个用户同时更新同一数据的机制。一个锁就是在多用户环境
中对某一种正在使用中的资源的一个限制,它阻止其他用户访问或修
改资源中的数据。 SQL Server为了保证用户操作的一致性,自动对资
源设置和释放锁。例如,当用户正在更新一个表时,没有任何其他用
户能修改甚至查看已经更新过的记录。当所有的与该用户相关的更新
操作都完成后,锁便会释放,并且记录变成可访问的。
通常,SQL Server中有三类锁:
共享锁:也称为读锁,是加在正在读取的数据上的。共享锁防止别的
用户在加锁的情况下修改该数据,共享锁和别的共享锁是相容的。
更新锁:和独占锁很相似,更新锁防止别人在改变数据的过程中修改
数据。
独占锁:当要改变数据时使用独占锁。它防止别的用户读取或修改正
在工作的数据。直到将锁释放为止,独占锁不与别的锁兼容。
第十一章 SQL程序设计
?编写有效的事务
在实际程序设计和管理过程中,应尽可能使事务保持简短,以减少
并发连接间的资源锁定争夺。在有少量用户的系统中,运行时间长、
效率低的事务可能不会成为问题,但是在拥有成千上万用户的大型数
据库系统中,这样的事务将导致无法预知的后果。设计时,需要遵循
以下原则:
不要在事务处理期间要求用户输入。
在事务启动之前,获得所有需要的用户输入。
在浏览数据时,尽量不要打开事务。
在所有预备的数据分析完成之前,不应启动事务。
保持事务尽可能简短。
在知道了必须要进行的修改之后,启动事务,执行修改语句,然后立即提交
或回滚。只有在需要时,才打开事务。
灵活使用更低的事务隔离级别。
灵活地使用更低的游标并发选项。
在事务中尽量使访问的数据量最小。
尽量减少锁定的行数,从而减少事务之间的争夺。
小心地管理隐性事务,以便避免并发问题。
第十一章 SQL程序设计
?程序中的变量
变量是 SQL Server用来在语句之间传递数据的方式之一 。 SQL Server中的
变量分为两种, 即全局变量和局部变量, 其中, 全局变量的名称以两个 @@字符
开始, 由系统定义和维护;局部变量的名称以一个 @字符开始, 由用户自己定
义和赋值 。
全局变量是 SQL Server系统提供并赋值的变量 。 用户不能建立全局变量,
也不能修改全局变量 。 在 SQL Server 2000中, 全局变量是 — 组特殊的函数,
它们的名称是以 @@开始, 而且不需要任何参数, 在调用时无需在函数名后面加
上 — 对圆括号, 这些函数也称为无参函数 。
第十一章 SQL程序设计
?程序中的变量
局部变量是指在批处理或脚本中用来保存数据值的对象 。 局部变量常用于
作为计数器计算循环执行的次数或控制循环执行的次数, 也可以用于保存由存
储过程代码返回的数据值, 此外, 还可以使用 Table数据类型的局部变量来代
替临时表 。
1,声明局部变量
使用一个局部变量之前, 必须使用 DECLARE语句来声明这个局部变量, 给它指
定一个变量名和数据类型, 对于数值变量, 还需要指定其精度和小数位数 。
DECLARE语句的语法格式为:
DECLARE @局部变量 数据类型 [,… n]
局部变量名总是以 @符号开始, 变量名最多可以包含 128个字符, 局部变量名必
须符合标识符命名规则, 局部变量的数据类型可以是系统数据类型, 也可以是
用户自定义数据类型, 但不能把局部变量指定为 TEXT,NTEXT或 IMAGE数据类型 。
在一个 DECLARE语句中可以定义多个局部变量, 只需用逗号 (,) 分隔即可 。
第十一章 SQL程序设计
?程序中的变量
2,绐局部变量赋值
使用 DECLARE语句声明一个局部变量之后, 该变量的值将被初始化为 NULL,
若赋其他的值, 可以使用 SET语句, 语法格式如下:
SET @局部变量 =表达式 [,… n]
SET语句的功能是将表达式的值赋给局部变量, 其中表达式是 SQL Server
的任何有效的表达式 。
除了可以使用 SET语句对局部变量赋值外, 还可以使用 SELECT语句对局部
变量赋值, 即通过在 SELECT子句的选择列表中引用一个局部变量而使它获得一
个值, 语法格式如下:
SELECT @局部变量 =表达式 [,… n]
如果使用 — 个 SELECT语句对一个局部变量赋值时, 这个语句返回了多个值, 则
这个局部变量将取得该 SELECT语句所返回的最后一个值 。 此外, 使用 SELECT语
句时, 如果省略赋值号 ( =) 及其后面的表达式, 则可以将局部变量的值显示
出来 。
第十一章 SQL程序设计
?程序中的变量
3,局部变量的作用域
局部变量的作用域指可以引用该变量的范围, 局部变量的作用域从声明它们的地
方开始到声明它们的批处理或存储过程的结尾 。 也就是说, 局部变量只能在声明
它的批处理, 存储过程或触发器中使用, 一旦这些批处理或存储过程结束, 局部
变量将自动消除 。
例:声明一个局部变量, 把学生表中学号为, 010101001001” 的学生姓名赋给局
部变量, 并输出 。 在查询分析器里运行结果如图 11.4所示, 代码如下:
DECLARE @NAME CHAR(12) --声明局部变量
SELECT @NAME=姓名 FROM 学生 WHERE 学号 ='010101001001' --将结果存储
PRINT '学生表中学号为, 010101001001” 的学生姓名为,'+@NAME --输出字符串
GO
--该批处理结束, 局部变量 @NUM自动清除
PRINT '如果继续引用该变量, 将会出现声明局部变量的错误提示 '
GO
PRINT '学生表中学号为 010101001001的学生姓名为,'+@NAME --输出字符串
GO
第十一章 SQL程序设计
?程序中的 流程控制
流程控制语句是用来控制程序执行和流程分支的命令, 这些命令包括条件控
制语句, 无条件转移语句和循环语句 。 使用这些命令, 可以使程序具有结构性和
逻辑性, 并可完成较复杂的操作 。
BEGINN… END语句块
IF… ElSE语句
CASE表达式
WAITFOR语句
WHILE语句
PRINT语句
第十一章 SQL程序设计
?程序中的 流程控制
1, BEGINN…END 语句块
在条件和循环等流程控制语句中,要执行两个或两个以上的
Transact-SQL语句时,就需要使用 BEGIN…END 语句,这些语句可
以作为一个单元来执行。也就是说 BEGIN…END 语句用于将多个
Transact-SQL语句组合成一个语句块,将它们视为一个整体来处理。
BEGIN…END 语句的语法格式为:
BEGIN
语句 I
……
END
BEGIN…END 语句通常用于下列情况,WHILE循环需要包含语
句块 ;CASE语句的元素需要包含语句块 ;IF或 ELSE子句需要包含语句
块。 位于 DEGIN和 END之间的各个语句既可以是单个的 Transact-
SQL语句,也可以是使用 BEGIN和 END定义的语句块,即 BEGIN …
END语句块可以嵌套。
第十一章 SQL程序设计
?程序中的 流程控制
1, BEGINN…END 语句块
例:使用 BEGIN…END 语句显示系部代码为,01”的班级代码和班级
名称。代码如下:
USE STUDENT
GO
IF EXISTS (SELECT * FROM 班级 WHERE 系部代码 ='01')
BEGIN
PRINT '满足条件的班级,'
SELECT 班级代码,班级名称 FROM 班级 WHERE 系部代码 ='01'
END
GO
第十一章 SQL程序设计
?程序中的 流程控制
2, IF…ElSE 语句
在程序中,经常需要根据特定条件指示执行不同的操作和运算,
也就是进行流程控制。 SQL Server利用 IF…ELSE 命令使程序有不同
的条件分支,从而完成各种不同条件环境下的操作。
IF…ELSE 语句的语法格式为:
IF 布尔表达式
语句 1
[ELSE
语句 2]
其中布尔表达式表示 — 个测试条件,其取值为 TRUE或 FALSE。语句
1和语句 2可以是单个的 Transact-SQL语句,也可以是用语句 BEGIN…
END定义的语句块。该语句的执行过程是:如果 IF后面的布尔表达式
返回 TRUE,则执行语句 1,否则执行语句 2。若无 ELSE,如果测试
条件成立,则执行语句 1,否则执行 IF语句后面的其他语句。
第十一章 SQL程序设计
?程序中的 流程控制
例:使用 IF…ELSE 语句实现以下功能:如果存在职称为副教授或教授
的教师,那么输出这些教师的姓名、学历、职务、职称,否则输出没
有满足条件的教师。代码如下:
IF EXISTS (SELECT * FROM 教师 WHERE 职称 ='副教授 ' OR 职称 ='教授 ')
BEGIN
SELECT 姓名,学历,职务,职称
FROM 教师
WHERE 职称 ='副教授 ' OR 职称 ='教授 '
PRINT '以上教师是具有高级职称的 '
END
ELSE
BEGIN
PRINT '没有满足条件的教师 '
END
GO
第十一章 SQL程序设计
?程序中的 流程控制
3,CASE表达式
CASE表达式是一个特殊的 Transact-SQL表达式,它能够实现多重
选择的情况。 CASE表达式不同于 — 个普通的 Transact-SQL语句,它不
能单独执行,而只能作为 — 个可以单独执行的语句的一部分来使用。
简单 CASE表达式
CASE表达式
搜索 CASE表达式
1)简单 CASE表达式
简单 CASE表达式将一个测试表达式与一组简单表达式进行比较,
如果某个简单表达式与测试表达式的值相等,则返回相应结果表达式
的值。
第十一章 SQL程序设计
?程序中的 流程控制
简单 CASE表达式的语法格式为:
CASE 测试表达式
WHEN测试值 1 THEN结果表达式 1
[WHEN测试值 2 THEN结果表达式 2
[… ]]
[ELSE 结果表达式 n]
END
其中测试表达式用于做条件判断,测试值用于与测试表达式作比较,
测试表达式必须与测试值的数据类型相同。
简单 CASE表达式必须以 CASE开头并以 END结束,它能够将一个表
达式和一系列的测试值进行比较,并返回符合条件的结果表达式。
简单 CASE表达式的执行过程是:用测试表达式的值依次与每一个
WHEN子句的测试值作比较,直到找到第一个与测试表达式的值完全
相同的测试值时,便将该 WHEN子句指定的结果表达式返回。如果
没有任何一个 WHEN子句的测试值和测试表达式相同,SQL Server将
检查是否有 ELSE子句存在,如果存在 ELSE子句,便将 ELSE子句之
第十一章 SQL程序设计
?程序中的 流程控制
简单 CASE表达式的执行过程是:
用测试表达式的值依次与每一个 WHEN子句的测试值作比较,直
到找到第一个与测试表达式的值完全相同的测试值时,便将该
WHEN子句指定的结果表达式返回。如果没有任何一个 WHEN子句
的测试值和测试表达式相同,SQL Server将检查是否有 ELSE子句存
在,如果存在 ELSE子句,便将 ELSE子句之后的结果表达式返回;如
果不存在 ELSE子句,便返问一个 NULL值。
注意:
在一个简单 CASE表达式中,一次只能有一个 WHEN子句指定的
结果表达式返回。若同时有多个测试值与测试表达式的值相同,则只
有第 — 个与测试表达式的值相同的 WHEN子句指定的结果表达式返
回。
第十一章 SQL程序设计
?程序中的 流程控制
2)搜索 CASE表达式
CASE关键字后面不跟任何表达式,各个 WHEN子句后都是布尔表达
式。搜索 CASE表达式的语法格式为:
CASE
WHEN布尔表达式 1 THEN结果表达式 1
WHEN布尔表达式 2 THEN结果表达式 2
[…n ]]
[ELSE 结果表达式 n]
END
搜索 CASE表达式的执行过程是:测试每个 WHEN子句后的布尔表达式,如
果结果为 TRUE,则返回相应的结果表达式,否则检查是否有 ELSE子句存在
。如果存在 ELSE子句,便将 ELSE子句之后的结果表达式返回;如果不存在
ELSE子句,便返回 — 个 NULL值。
注意:在一个搜索 CASE表达式中,一次只能有一个 WHEN子句指定的结果
表达式返回,如果有多个布尔表达式为 TRUE,则只返回第一个为 TRUE的
WHEN子句指定的结果表达式。
第十一章 SQL程序设计
?程序中的 流程控制
例:使用搜索 CASE表达式实现以下功能:分别输出班级代码、班级
名称,并根据系部代码判别年级。运行结果见图 11.8所示。
USE STUDENT
GO
SELECT 班级代码,班级名称,年级 =
CASE
WHEN 系部代码 =' 01' THEN '一年级 '
WHEN系部代码 = ' 02' THEN '二年级 '
END
FROM 班级
GO
第十一章 SQL程序设计
?程序中的 流程控制
4, WAITFOR语句
WAITFOR语句可以暂停执行程序 — 段时间之后再继续执行,也可以
暂停执行程序到所指定的时间后再继续执行。 WAITFOR语句的语法
格式为:
WAITFOR DELAY ‘时间’ |TIME ‘时间’
其中 DELAY指定 — 段时间间隔过去之后执行一个操作。 TIME表示从
某个时刻开始执行一个操作。时间参数必须为可接受的 DATETIME
数据格式。在 DATETIME数据中不允许有日期部分,即采用
HH:MM:SS的格式。
例:使用 WAITFOR实现以下功能:输出系部代码为,01”的班级代码
、班级名称、系部代码之前等待二秒。代码如下:
WAITFOR DELAY '00:00:02'
SELECT 班级代码,班级名称,系部代码 FROM 班级 WHERE 系部代
码 ='01'
GO
第十一章 SQL程序设计
?程序中的 流程控制
5, WHILE语句
在程序中当需要多次重复处理某项工作时,就需使用 WHILE循环
语句。 WHILE语句通过布尔表达式来设置一个循环条件,当条件为
真时,重复执行一个 SQL语句或语句块,否则退出循环,继续执行后
面的语句。 WHILE语句的语法格式为:
WHILE布尔表达式
BEGIN
语句序列 1 [BREAK]
语句序列 2 [CONTINUE]
语句序列 3
END
第十一章 SQL程序设计
?程序中的 流程控制
5, WHILE语句
其中布尔表达式用来设置循环执行的条件。当表达式取值为
TRUE时,循环将重复执行;取值为 FALSE时,循环将停止执行。如
果布尔表达式中包含一个 SELECT语句,必须将该 SELECT语句包含
在一对小括号中。
可选命令 BREAK可以提前退出循环,并将控制权转移给循环之后
的语句。可选命令 CONTINUE可使程序直接跳回到 WHILE命令行,
重新执行循环,忽略 CONTINUE之后的语句。
循环体中的各语句序列可以是单个的 Transact-SQL语句,也可以是用
BEGIN和 END定义的语句块。循环允许嵌套,在嵌套循环中,内层
循环的 BREAK命令将使控制权转移到外一层的循环并继续执行。
第十一章 SQL程序设计
?程序中的 流程控制
例:使用 WHILE语句实现以下功能:求 2~300之间的所有素数。
DECLARE @I INT,@J INT
SET @I=2
WHILE @I<=300
BEGIN
SET @J=2
WHILE @J<=@I-1
BEGIN
IF @I%@J=0
BREAK
ELSE
SET @J=@J+1
END
IF @I=@J
PRINT CONVERT(VARCHAR,@I)+'是素数! '
SET @I=@I+1
END
第十一章 SQL程序设计
?程序中的 流程控制
6,PRINT语句
SQL Server向客户程序返回信息的方法除了使用 SELECT语句外
,还可以使用 PRINT语句,它的语法格式为:
PRINT ‘字符串’ |局部变量 |全局变量
例,PRINT语句举例。
USE STUDENT
GO
DECLARE @STR CHAR(20)
SET @STR=”欢迎使用 PRINT语句”
PRINT @STR
GO
?程序中的批, 脚本, 注释
?程序中的事务
? SQL Server变量
?程序中的流程控制
第十一章 SQL程序设计
?程序中的批处理, 脚本, 注释
当要完成的任务不能由单独的 Transact-SQL语句来完成时, SQL
Server使用批处理, 脚本, 存储过程, 触发器等来组织多条 Transact-
SQL语句 。
1,批处理
批处理就是一个或多个 Transact-SQL语句的集合, 从应用程序 — 次性发
送到 SQL Server并由 SQL Server编译成 — 个可执行单元, 此单元称为执行计
划 。 执行计划中的语句每次执行一条 。 建立批处理时, 使用 GO语句作为批处
理的结束标记 。 在一个 GO语句行中不能包括其他 Transact-SQL语句, 但可以
使用注释文字 。 当编译器读取到 GO语句时, 它会把 GO语句前面所有的语句
当作一个批处理, 并将这些语句打包发送给服务器 。 GO语句本身并不是
Transact-SQL语句的组成部分, 它只是一个用于表示批处理结束的前端指令 。
如果在一个批处理中包含任何语法错误, 如:引用了一个并不存在的对象,
则整个批处理就不能被成功地编译和执行 。 如果一个批处理中某句有执
行错误, 如违反了约束, 它仅影响该语句的执行, 并不影响批处理中其他语
句的执行 。
第十一章 SQL程序设计
?程序中的批处理, 脚本, 注释
建立批处理时,应当注意以下几点:
1,CREATE DEFAULT,CREATE PROCEDURE,CREATE
RULE,CREATE TRIGGER及 CREATE VIEW语句不能与其他语句
放在一个批处理中。
2、不能在删除一个对象之后,在同一批处理中再次引用这个对象。
3、不能在一个批处理中引用其他批处理中所定义的变量。
4、不能把规则和默认值绑定到表字段或用户自定义数据类型之后,
立即在同 — 个批处理中使用它们。
5、不能定义一个 CHECK约束之后,立即在同一个批处理中使用该
约束。
6、不能在修改表中的一个字段名之后,立即在同一个批处理中引用
新字段名。
7、如果一个批处理中的第一个语句是执行某个存储过程的
EXECUTE 语句,则 EXECUTE关键字可以省略;如果该语句不是第
一个语句,则必须使用 EXECUTE关键字,或者省写为,EXEC”。
第十一章 SQL程序设计
?程序中的批处理, 脚本, 注释
2,脚本
脚本是存储在文件中的一系列 SQL语句,即一系列按顺序提交的
批处理。
Transact-SQL脚本中可以包含一个或多个批处理。 GO语句是批
处理结束的标志。如果没有 GO语句,则将它作为单个批处理执行。
使用脚本可以将创建和维护数据库时的操作步骤保存为一个磁盘文件
。将 Transact-SQL语句保存为脚本文件,不仅可以建立起可再用的模
块化代码,还可以在不同计算机之间传送 Transact-SQL语句,使两台
计算机执行同样的操作。
脚本可以在查询分析器中执行,也可以在 isql或 osql实用程序中执
行。查询分析器是建立、编辑和使用脚本的一个最好的环境。在查询
分析器中,不仅可以新建、保存、打开脚本文件,而且可以输入和修
改 Transact-SQL语句,还可以通过执行 Transact-SQL语句来查看脚本
的运行结果,从而检验脚本内容的正确性。
第十一章 SQL程序设计
?程序中的批处理, 脚本, 注释
3,注释
注释是指程序中用来说明程序内容的语句,它不能执行且不参与
程序的编译。注释用于语句代码的说明,或暂时禁用的部分语句。为
程序加上注释不仅能增强程序的可读性,而且有助于日后的管理和维
护。
1)行内注释。如果整行都是注释而并非所要执行的程序行,则该行可用行
内注释,语法为:
--注释语句:这种注释形式用来标志一行注释,可以与要执行的代码处在同
一行,也可以另起一行。从双连字符( - -)开始到行尾均为注释。
2)块注释如果要给程序所加的注释内容较长,则可使用块注释,语法为:
/*注释语句 */:这种注释形式用来标志多行注释,可以与要执行的代码处在同
一行,也可以另起一行,甚至可以放在可执行代码内。对于多行注释,必须
使用开始注释字符对( /*)开始注释,使用结束注释字符对( */)结束注释,
*/和 */之间的全部内容都是注释部分。注意多行注释不能跨越批处理,整个注
释必须包含在一个批处理中。
第十一章 SQL程序设计
?程序中的事务
事务是最小的工作单元。这个工作单元要么成功完成所有操作,
要么就是失败,并将所做的一切复原。
1,概述
事务可以用于确保数据能够正确地被修改,避免造成数据只修改
一部分而导致数据不完整,或是在修改途中受到其他用户的干扰。事
务有 4个特性。:
原子性( Atomic) 事务是原子的,要么完成整个操作,要么退出所有操作
。如果任何语句失败,则所有作为事务一部分的语句都不会运行。
一致性( ConDemoltent)在事务完成或失败时,要求数据库处于一致状态。
由事务引发的从一种状态到另一种状态的变化是一致的。
独立性( Isolated)事务是独立的。它不与数据库的其他事务交互或冲突。
持久性( Durable)称事务是持久的,是因为在事务完成后它无须考虑和数
据库发生的任何事情。如果系统掉电且数据库服务器崩溃,事务保证在服务
器重启后仍是完整的。
第十一章 SQL程序设计
?程序中的事务的类型
1)显式事务
显示事务是手工配置的事务。用保留字标识显式事务的开始和结束
。保留字包括 BEGIN TRANSACTION,COMMIT TRANSACTION,ROLLBACK
TRANSACTION和 SAVE TRANSACTION,其中 TRANSACTION可以简写为 TRAN
。
要开始显式事务,首先输入关键词 BEGIN TRAN。
要结束显示事务,使用 COMMIT TRAN。
如果要取消事务,使用 ROLL BACK TRAN命令,ROLLBACK TRAN将完全
取消事务,或将事务恢复到初始状态。
可以使用 SAVE TRAN命令生成存储点,然后有选择性地恢复到那些
点。事务内部存储点的数目没有明确的约束,而且可以在一个事务中
出现重复的存储点名字。然而,只有最后那个存储点名字会被用于复
原到指定点。
第十一章 SQL程序设计
?程序中的事务的类型
2) 隐式事务
有时候看起来没有使用事务,但它们可能隐藏在幕后,这种事务叫
做隐式事务。
要使用这种模式,必须使用 Set Implicit_Transactions On语句
来设置连接。 SQLServer的任何数据修改语句,都是隐式事务。下列的
任何一条语句都可以作为一个隐式事务的开始,ALTER TABLE,CREATE
,DELETE,DROP,FETCH,GRANT,INSERT,OPEN,REVOKE,SELECT
,TRUNCATE TABLE,UPDATE。
要结束隐式事务,必须使用 COMMIT TRANSACTION或 ROLLBACK
TRANSACTION语句。之后,任何指令的命令都将会开始另一个事务。
第十一章 SQL程序设计
?程序中的事务的工作机制
例,BEGIN TRAN
INSERT INTO 课程 (课程号,课程名,备注 ) VALUES('0001','大学语文 ','')
UPDATE 教学计划 SET 启始周 =2 WHERE 专业代码 ='0101'
DELETE 教师 WHERE 姓名 IS NULL
COMMIT TRAN
1) 当 BEGIN TRAN语句到达数据库时,SQL Server分析出这是显式事务的开始,
SQL Server找到下一个可用的内存日志页面,并给新事务分配一个事务 ID。
2) 接着运行 INSERT语句,新的行被记录到事务日志中,数据页面在内存中进
行修改,如果所需页面不在内存中,则从磁盘调出。
3)下一个语句以相似方式运行。 UPDATE语句记录在事务日志中,数据页在内
存中进行了修改。
4)当 SQL Server收到 COMMITTRAN时,日志页面被写到数据库的日志设备上,
这样才能保证日志可以被恢复。由于日志变化写入了硬盘,它保证事务是可恢
复的,即使 掉电了或在数据页写入磁盘时数据库崩溃了,也能进行事务
恢复。
第十一章 SQL程序设计
?程序中的检查点的处理
SQL Server中有二类检查点:自动检查点和手工检查点 。
自动检查点是基于 SQL Server计算的 。 可在 RECOVERY INTERVAL配
置选项中规定检查点处理的频率 。 该选项指出以分钟为单位的用来恢
复系统中数据库的最大时间间隔 。 如果 SQL Server认为恢复数据库要
大量时间, 它将发出自动检查点 。 这时, 所有修改过的内存中的数据
页面将写入磁盘 ( 包括日志页面 ), 自动检查点每 60秒检查一次, 并
在各数据库之间循环, 以决定该数据库是否需要赋予检查点 。 注意,
对带有, trunc.log on Chkpt.”选项设置的数据库, 该过程将从日志
中截断已提交的事务 。
手工检查点可在任何时候输入 Transact-SQL命令 CHECKPOINT来强
制执行 。 注意, 只有 SA或数据库的 DBA才能执行该命令 。 发出手工检查
点指令后, 内存中所有修改过的页面记入磁盘, 就象自动检查点处理
时所发生的情况一样 。 注意, 手工检查点对事务日志无效 ( 即不将它
写入磁盘 ), 不考虑是否设置了, trunk.log on Chkpt.”数据库选项 。
第十一章 SQL程序设计
?锁
锁用来提供数据库的并发性控制。如果没有锁,SQL Server就没
有防止多个用户同时更新同一数据的机制。一个锁就是在多用户环境
中对某一种正在使用中的资源的一个限制,它阻止其他用户访问或修
改资源中的数据。 SQL Server为了保证用户操作的一致性,自动对资
源设置和释放锁。例如,当用户正在更新一个表时,没有任何其他用
户能修改甚至查看已经更新过的记录。当所有的与该用户相关的更新
操作都完成后,锁便会释放,并且记录变成可访问的。
通常,SQL Server中有三类锁:
共享锁:也称为读锁,是加在正在读取的数据上的。共享锁防止别的
用户在加锁的情况下修改该数据,共享锁和别的共享锁是相容的。
更新锁:和独占锁很相似,更新锁防止别人在改变数据的过程中修改
数据。
独占锁:当要改变数据时使用独占锁。它防止别的用户读取或修改正
在工作的数据。直到将锁释放为止,独占锁不与别的锁兼容。
第十一章 SQL程序设计
?编写有效的事务
在实际程序设计和管理过程中,应尽可能使事务保持简短,以减少
并发连接间的资源锁定争夺。在有少量用户的系统中,运行时间长、
效率低的事务可能不会成为问题,但是在拥有成千上万用户的大型数
据库系统中,这样的事务将导致无法预知的后果。设计时,需要遵循
以下原则:
不要在事务处理期间要求用户输入。
在事务启动之前,获得所有需要的用户输入。
在浏览数据时,尽量不要打开事务。
在所有预备的数据分析完成之前,不应启动事务。
保持事务尽可能简短。
在知道了必须要进行的修改之后,启动事务,执行修改语句,然后立即提交
或回滚。只有在需要时,才打开事务。
灵活使用更低的事务隔离级别。
灵活地使用更低的游标并发选项。
在事务中尽量使访问的数据量最小。
尽量减少锁定的行数,从而减少事务之间的争夺。
小心地管理隐性事务,以便避免并发问题。
第十一章 SQL程序设计
?程序中的变量
变量是 SQL Server用来在语句之间传递数据的方式之一 。 SQL Server中的
变量分为两种, 即全局变量和局部变量, 其中, 全局变量的名称以两个 @@字符
开始, 由系统定义和维护;局部变量的名称以一个 @字符开始, 由用户自己定
义和赋值 。
全局变量是 SQL Server系统提供并赋值的变量 。 用户不能建立全局变量,
也不能修改全局变量 。 在 SQL Server 2000中, 全局变量是 — 组特殊的函数,
它们的名称是以 @@开始, 而且不需要任何参数, 在调用时无需在函数名后面加
上 — 对圆括号, 这些函数也称为无参函数 。
第十一章 SQL程序设计
?程序中的变量
局部变量是指在批处理或脚本中用来保存数据值的对象 。 局部变量常用于
作为计数器计算循环执行的次数或控制循环执行的次数, 也可以用于保存由存
储过程代码返回的数据值, 此外, 还可以使用 Table数据类型的局部变量来代
替临时表 。
1,声明局部变量
使用一个局部变量之前, 必须使用 DECLARE语句来声明这个局部变量, 给它指
定一个变量名和数据类型, 对于数值变量, 还需要指定其精度和小数位数 。
DECLARE语句的语法格式为:
DECLARE @局部变量 数据类型 [,… n]
局部变量名总是以 @符号开始, 变量名最多可以包含 128个字符, 局部变量名必
须符合标识符命名规则, 局部变量的数据类型可以是系统数据类型, 也可以是
用户自定义数据类型, 但不能把局部变量指定为 TEXT,NTEXT或 IMAGE数据类型 。
在一个 DECLARE语句中可以定义多个局部变量, 只需用逗号 (,) 分隔即可 。
第十一章 SQL程序设计
?程序中的变量
2,绐局部变量赋值
使用 DECLARE语句声明一个局部变量之后, 该变量的值将被初始化为 NULL,
若赋其他的值, 可以使用 SET语句, 语法格式如下:
SET @局部变量 =表达式 [,… n]
SET语句的功能是将表达式的值赋给局部变量, 其中表达式是 SQL Server
的任何有效的表达式 。
除了可以使用 SET语句对局部变量赋值外, 还可以使用 SELECT语句对局部
变量赋值, 即通过在 SELECT子句的选择列表中引用一个局部变量而使它获得一
个值, 语法格式如下:
SELECT @局部变量 =表达式 [,… n]
如果使用 — 个 SELECT语句对一个局部变量赋值时, 这个语句返回了多个值, 则
这个局部变量将取得该 SELECT语句所返回的最后一个值 。 此外, 使用 SELECT语
句时, 如果省略赋值号 ( =) 及其后面的表达式, 则可以将局部变量的值显示
出来 。
第十一章 SQL程序设计
?程序中的变量
3,局部变量的作用域
局部变量的作用域指可以引用该变量的范围, 局部变量的作用域从声明它们的地
方开始到声明它们的批处理或存储过程的结尾 。 也就是说, 局部变量只能在声明
它的批处理, 存储过程或触发器中使用, 一旦这些批处理或存储过程结束, 局部
变量将自动消除 。
例:声明一个局部变量, 把学生表中学号为, 010101001001” 的学生姓名赋给局
部变量, 并输出 。 在查询分析器里运行结果如图 11.4所示, 代码如下:
DECLARE @NAME CHAR(12) --声明局部变量
SELECT @NAME=姓名 FROM 学生 WHERE 学号 ='010101001001' --将结果存储
PRINT '学生表中学号为, 010101001001” 的学生姓名为,'+@NAME --输出字符串
GO
--该批处理结束, 局部变量 @NUM自动清除
PRINT '如果继续引用该变量, 将会出现声明局部变量的错误提示 '
GO
PRINT '学生表中学号为 010101001001的学生姓名为,'+@NAME --输出字符串
GO
第十一章 SQL程序设计
?程序中的 流程控制
流程控制语句是用来控制程序执行和流程分支的命令, 这些命令包括条件控
制语句, 无条件转移语句和循环语句 。 使用这些命令, 可以使程序具有结构性和
逻辑性, 并可完成较复杂的操作 。
BEGINN… END语句块
IF… ElSE语句
CASE表达式
WAITFOR语句
WHILE语句
PRINT语句
第十一章 SQL程序设计
?程序中的 流程控制
1, BEGINN…END 语句块
在条件和循环等流程控制语句中,要执行两个或两个以上的
Transact-SQL语句时,就需要使用 BEGIN…END 语句,这些语句可
以作为一个单元来执行。也就是说 BEGIN…END 语句用于将多个
Transact-SQL语句组合成一个语句块,将它们视为一个整体来处理。
BEGIN…END 语句的语法格式为:
BEGIN
语句 I
……
END
BEGIN…END 语句通常用于下列情况,WHILE循环需要包含语
句块 ;CASE语句的元素需要包含语句块 ;IF或 ELSE子句需要包含语句
块。 位于 DEGIN和 END之间的各个语句既可以是单个的 Transact-
SQL语句,也可以是使用 BEGIN和 END定义的语句块,即 BEGIN …
END语句块可以嵌套。
第十一章 SQL程序设计
?程序中的 流程控制
1, BEGINN…END 语句块
例:使用 BEGIN…END 语句显示系部代码为,01”的班级代码和班级
名称。代码如下:
USE STUDENT
GO
IF EXISTS (SELECT * FROM 班级 WHERE 系部代码 ='01')
BEGIN
PRINT '满足条件的班级,'
SELECT 班级代码,班级名称 FROM 班级 WHERE 系部代码 ='01'
END
GO
第十一章 SQL程序设计
?程序中的 流程控制
2, IF…ElSE 语句
在程序中,经常需要根据特定条件指示执行不同的操作和运算,
也就是进行流程控制。 SQL Server利用 IF…ELSE 命令使程序有不同
的条件分支,从而完成各种不同条件环境下的操作。
IF…ELSE 语句的语法格式为:
IF 布尔表达式
语句 1
[ELSE
语句 2]
其中布尔表达式表示 — 个测试条件,其取值为 TRUE或 FALSE。语句
1和语句 2可以是单个的 Transact-SQL语句,也可以是用语句 BEGIN…
END定义的语句块。该语句的执行过程是:如果 IF后面的布尔表达式
返回 TRUE,则执行语句 1,否则执行语句 2。若无 ELSE,如果测试
条件成立,则执行语句 1,否则执行 IF语句后面的其他语句。
第十一章 SQL程序设计
?程序中的 流程控制
例:使用 IF…ELSE 语句实现以下功能:如果存在职称为副教授或教授
的教师,那么输出这些教师的姓名、学历、职务、职称,否则输出没
有满足条件的教师。代码如下:
IF EXISTS (SELECT * FROM 教师 WHERE 职称 ='副教授 ' OR 职称 ='教授 ')
BEGIN
SELECT 姓名,学历,职务,职称
FROM 教师
WHERE 职称 ='副教授 ' OR 职称 ='教授 '
PRINT '以上教师是具有高级职称的 '
END
ELSE
BEGIN
PRINT '没有满足条件的教师 '
END
GO
第十一章 SQL程序设计
?程序中的 流程控制
3,CASE表达式
CASE表达式是一个特殊的 Transact-SQL表达式,它能够实现多重
选择的情况。 CASE表达式不同于 — 个普通的 Transact-SQL语句,它不
能单独执行,而只能作为 — 个可以单独执行的语句的一部分来使用。
简单 CASE表达式
CASE表达式
搜索 CASE表达式
1)简单 CASE表达式
简单 CASE表达式将一个测试表达式与一组简单表达式进行比较,
如果某个简单表达式与测试表达式的值相等,则返回相应结果表达式
的值。
第十一章 SQL程序设计
?程序中的 流程控制
简单 CASE表达式的语法格式为:
CASE 测试表达式
WHEN测试值 1 THEN结果表达式 1
[WHEN测试值 2 THEN结果表达式 2
[… ]]
[ELSE 结果表达式 n]
END
其中测试表达式用于做条件判断,测试值用于与测试表达式作比较,
测试表达式必须与测试值的数据类型相同。
简单 CASE表达式必须以 CASE开头并以 END结束,它能够将一个表
达式和一系列的测试值进行比较,并返回符合条件的结果表达式。
简单 CASE表达式的执行过程是:用测试表达式的值依次与每一个
WHEN子句的测试值作比较,直到找到第一个与测试表达式的值完全
相同的测试值时,便将该 WHEN子句指定的结果表达式返回。如果
没有任何一个 WHEN子句的测试值和测试表达式相同,SQL Server将
检查是否有 ELSE子句存在,如果存在 ELSE子句,便将 ELSE子句之
第十一章 SQL程序设计
?程序中的 流程控制
简单 CASE表达式的执行过程是:
用测试表达式的值依次与每一个 WHEN子句的测试值作比较,直
到找到第一个与测试表达式的值完全相同的测试值时,便将该
WHEN子句指定的结果表达式返回。如果没有任何一个 WHEN子句
的测试值和测试表达式相同,SQL Server将检查是否有 ELSE子句存
在,如果存在 ELSE子句,便将 ELSE子句之后的结果表达式返回;如
果不存在 ELSE子句,便返问一个 NULL值。
注意:
在一个简单 CASE表达式中,一次只能有一个 WHEN子句指定的
结果表达式返回。若同时有多个测试值与测试表达式的值相同,则只
有第 — 个与测试表达式的值相同的 WHEN子句指定的结果表达式返
回。
第十一章 SQL程序设计
?程序中的 流程控制
2)搜索 CASE表达式
CASE关键字后面不跟任何表达式,各个 WHEN子句后都是布尔表达
式。搜索 CASE表达式的语法格式为:
CASE
WHEN布尔表达式 1 THEN结果表达式 1
WHEN布尔表达式 2 THEN结果表达式 2
[…n ]]
[ELSE 结果表达式 n]
END
搜索 CASE表达式的执行过程是:测试每个 WHEN子句后的布尔表达式,如
果结果为 TRUE,则返回相应的结果表达式,否则检查是否有 ELSE子句存在
。如果存在 ELSE子句,便将 ELSE子句之后的结果表达式返回;如果不存在
ELSE子句,便返回 — 个 NULL值。
注意:在一个搜索 CASE表达式中,一次只能有一个 WHEN子句指定的结果
表达式返回,如果有多个布尔表达式为 TRUE,则只返回第一个为 TRUE的
WHEN子句指定的结果表达式。
第十一章 SQL程序设计
?程序中的 流程控制
例:使用搜索 CASE表达式实现以下功能:分别输出班级代码、班级
名称,并根据系部代码判别年级。运行结果见图 11.8所示。
USE STUDENT
GO
SELECT 班级代码,班级名称,年级 =
CASE
WHEN 系部代码 =' 01' THEN '一年级 '
WHEN系部代码 = ' 02' THEN '二年级 '
END
FROM 班级
GO
第十一章 SQL程序设计
?程序中的 流程控制
4, WAITFOR语句
WAITFOR语句可以暂停执行程序 — 段时间之后再继续执行,也可以
暂停执行程序到所指定的时间后再继续执行。 WAITFOR语句的语法
格式为:
WAITFOR DELAY ‘时间’ |TIME ‘时间’
其中 DELAY指定 — 段时间间隔过去之后执行一个操作。 TIME表示从
某个时刻开始执行一个操作。时间参数必须为可接受的 DATETIME
数据格式。在 DATETIME数据中不允许有日期部分,即采用
HH:MM:SS的格式。
例:使用 WAITFOR实现以下功能:输出系部代码为,01”的班级代码
、班级名称、系部代码之前等待二秒。代码如下:
WAITFOR DELAY '00:00:02'
SELECT 班级代码,班级名称,系部代码 FROM 班级 WHERE 系部代
码 ='01'
GO
第十一章 SQL程序设计
?程序中的 流程控制
5, WHILE语句
在程序中当需要多次重复处理某项工作时,就需使用 WHILE循环
语句。 WHILE语句通过布尔表达式来设置一个循环条件,当条件为
真时,重复执行一个 SQL语句或语句块,否则退出循环,继续执行后
面的语句。 WHILE语句的语法格式为:
WHILE布尔表达式
BEGIN
语句序列 1 [BREAK]
语句序列 2 [CONTINUE]
语句序列 3
END
第十一章 SQL程序设计
?程序中的 流程控制
5, WHILE语句
其中布尔表达式用来设置循环执行的条件。当表达式取值为
TRUE时,循环将重复执行;取值为 FALSE时,循环将停止执行。如
果布尔表达式中包含一个 SELECT语句,必须将该 SELECT语句包含
在一对小括号中。
可选命令 BREAK可以提前退出循环,并将控制权转移给循环之后
的语句。可选命令 CONTINUE可使程序直接跳回到 WHILE命令行,
重新执行循环,忽略 CONTINUE之后的语句。
循环体中的各语句序列可以是单个的 Transact-SQL语句,也可以是用
BEGIN和 END定义的语句块。循环允许嵌套,在嵌套循环中,内层
循环的 BREAK命令将使控制权转移到外一层的循环并继续执行。
第十一章 SQL程序设计
?程序中的 流程控制
例:使用 WHILE语句实现以下功能:求 2~300之间的所有素数。
DECLARE @I INT,@J INT
SET @I=2
WHILE @I<=300
BEGIN
SET @J=2
WHILE @J<=@I-1
BEGIN
IF @I%@J=0
BREAK
ELSE
SET @J=@J+1
END
IF @I=@J
PRINT CONVERT(VARCHAR,@I)+'是素数! '
SET @I=@I+1
END
第十一章 SQL程序设计
?程序中的 流程控制
6,PRINT语句
SQL Server向客户程序返回信息的方法除了使用 SELECT语句外
,还可以使用 PRINT语句,它的语法格式为:
PRINT ‘字符串’ |局部变量 |全局变量
例,PRINT语句举例。
USE STUDENT
GO
DECLARE @STR CHAR(20)
SET @STR=”欢迎使用 PRINT语句”
PRINT @STR
GO