《SQL Server 二零零六从入门到理解》–20180717

3.3.CASE分支语句

示例10:将Student表的学员,性别和原籍打字与印刷出来,要求籍贯只好显示本省,本省或自治区。
Student表的多寡如图所示
亚洲必赢app 1
举行下列语句

SELECT stu_name AS 姓名,stu_sex AS 性别,
(CASE stu_native_place
WHEN '浙江' THEN '省内'
WHEN '内蒙古' THEN '自治区'
WHEN '西藏' THEN '自治区'
WHEN '宁夏' THEN '自治区'
WHEN '新疆' THEN '自治区'
WHEN '广西' THEN '自治区'
ELSE '省外'
END) AS 籍贯 
FROM Student

结果如图所示
亚洲必赢app 2

1.3.3.嵌套触发器

4.1.数据类型转换函数

私下认可意况下SQL
Server会对一部分数据类型实行活动转换,那种转移称为隐式转换。蒙受不能活动转换,则须求用CAST()函数和CONVERT()函数转换,那种转移称为显式转换。CAST()函数和CONVERT()函数的机能是平等的,CAST函数更便于接纳,CONVE奥迪Q5T函数的独到之处是能够钦赐日期和数值格式。
示例16:将Student表中的学号转换为日期格式
下边两句语句的功效是同一的,执行下列语句

SELECT stu_name,CAST(stu_no AS DATE) AS 学号转换成日期,stu_enter_score,stu_birthday FROM Student
SELECT stu_name,CONVERT(DATE,stu_no) AS 学号转换成日期,stu_enter_score,stu_birthday FROM Student

结果如图所示
亚洲必赢app 3
示例17:用CONVERT()函数将stu_birthday转化成钦定格式的日期
进行下列语句

SELECT stu_name,CONVERT(VARCHAR(20),stu_birthday,101) FROM Student
--CONVERT函数将DATE类型的stu_birthday字段转化为字符串,并限定了样式,代码101

结果如图所示
亚洲必赢app 4

注:在上述代码中,CONVE酷威T(DATE,stu_birthday,101)这么写是没用的。101格式码只对日期格式转化为字符串有效,别的格式转化为日期格式是没用的。

别的常用函数太不难了那边不写了,略。

1.3.4.4.启用递归触发器

能够运用SQL Server 2008的管理器工具来启用递归触发器。
亚洲必赢app 5

2.4.相比较运算符

也称关系运算符,用于比较多少个值的涉及,常见的有等于(=),大于(>),小于(<),大于等于(>=),小于等于(<=),不等于(<>或!=)
示例5:从Student表中查询入学战表在平均分以上的学习者新闻
Student表的数据如图所示
亚洲必赢app 6
推行下列语句

DECLARE @ave int
SET @ave=(SELECT AVG(stu_enter_score) FROM Student)
SELECT *FROM Student
WHERE stu_enter_score>=@ave;

结果如下图所示
亚洲必赢app 7

注:不可能直接把代码写成上边包车型地铁款式

SELECT * FROM Student
WHERE stu_enter_score>=AVG(stu_enter_score)

消息147,级别15,状态1,第2 行
聚拢不应出现在WHERE 子句中,除非该聚合位于HAVING
子句或采用列表所包涵的子查询中,并且要对其举行联谊的列是外部引用。

因为AVG是聚合函数。

1.3.4.递归触发器

2.2.赋值运算符

即等号(=),将表明式的值赋予另三个变量。举二个大约的例子。
示例2:计算Student表中学生的平分入学成绩并打字与印刷。
Student表的数额如图所示,stu_enter_score列存放了学生的入学战表
亚洲必赢app 8
进行上面包车型地铁言语

DECLARE @average int--声明@average变量
SET @average=(--将计算出的平均值赋值给@average
SELECT AVG(stu_enter_score)
FROM Student)
PRINT @average--打印@average的值

结果如图所示
亚洲必赢app 9

1.3.1.1.INSERT触发器

示例1:创制2个触发器Automatic_division,当在Student表中插入一条学生音信时,触发器依据入学分数(stu_enter_score)对学员实行自动分班,并在class_student表中插入一条记下。
分班要求:
|Stu_enter_score |Class_id |Class_name|
|——————-|——————|————–|
|stu_enter_score>=700| 01| 创新A班|
|650<=Stu_enter_score<700| 02| 重点B班|
|600<=Stu_enter_score<650| 03| 提高C班|
|550<=Stu_enter_score<600| 04| 普通D班|
|500<=Stu_enter_score<550| 05| 普通E班|
|Stu_enter_score<500| 06| 普通F班|
实践下列语句

CREATE TRIGGER automatic_division
ON student--新建一个检测student表的触发器,命名automatic_division
FOR INSERT--检测到INSERT操作时触发器工作
AS
DECLARE @score INT,@stu_no VARCHAR(8),@class_id CHAR(2)
--声明三个变量
DECLARE stu_cursor CURSOR LOCAL FORWARD_ONLY--声明一个指向inserted表的局部游标stu_cursor
FOR SELECT stu_no,stu_enter_score FROM inserted
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标指向inserted表的第一个数据并把游标指向的stu_no和stu_enter_score值分别赋值给@stu_no和@score
WHILE @@FETCH_STATUS=0--开始循环
BEGIN
BEGIN--先对@score的数值范围做判断,以确定该学生的班级编号
IF @score>=700
SET @class_id='01'
ELSE IF @score<700 AND @score>=650
SET @class_id='02'
ELSE IF @score<650 AND @score>=600
SET @class_id='03'
ELSE IF @score<600 AND @score>=550
SET @class_id='04'
ELSE IF @score<550 AND @score>=500
SET @class_id='05'
ELSE
SET @class_id='06'
END
--判断结束
INSERT INTO class_student(class_id,stu_no)
VALUES(@class_id,@stu_no)--将数据插入到class_student表中
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标移向inserted表的下一个数据,重复这个循环
END--循环结束
CLOSE stu_cursor--关闭游标
DEALLOCATE stu_cursor--释放游标资源
GO

证金朝码是不是科学
student表中插入数据,并查看class_student表中的数据是或不是正确

INSERT INTO student(stu_no,stu_name,stu_sex,stu_enter_score)
VALUES('20180001','邹莉莉','女','389'),
('20180002','万兴','男','701'),
('20180003','孙伟','男','652'),
('20180004','温佳静','女','676'),
('20180005','姜立夫','男','542')

Class_student表中的数据如图所示
亚洲必赢app 10
游标示例2:对student表中还未分班的学员实行分班
Student表中的数据如图所示
亚洲必赢app 11
其中stu_no20180001~20180005的学生早已在示例1中分班,剩下的上学的小孩子全都未分班。
履行下列语句

ALTER TABLE student
ADD stu_division_state bit--为student表新建一列记录是否已分班,true表示已分班
GO
DECLARE stu_class_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no FROM class_student
--新建游标stu_class_cursor指向class_student表的所有数据
OPEN stu_class_cursor--打开游标
DECLARE @stu_no VARCHAR(8)
FETCH NEXT FROM stu_class_cursor INTO @stu_no
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE student
SET stu_division_state=1
WHERE stu_no=@stu_no
FETCH NEXT FROM stu_class_cursor INTO @stu_no
END
CLOSE stu_class_cursor--关闭游标
DEALLOCATE stu_class_cursor--释放游标资源
---所有学生是否分班已经全部记录在stu_division_state中
GO
DECLARE @stu_no VARCHAR(8),@score INT,@class_id CHAR(2)
DECLARE stu_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no,stu_enter_score FROM student WHERE stu_division_state IS NULL
--新建student表的游标stu_cursor,指向所有未分班学生
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor INTO @stu_no,@score
WHILE @@FETCH_STATUS=0--循环开始
BEGIN
BEGIN--先对@score的数值范围做判断,以确定该学生的班级编号
IF @score>=700
SET @class_id='01'
ELSE IF @score<700 AND @score>=650
SET @class_id='02'
ELSE IF @score<650 AND @score>=600
SET @class_id='03'
ELSE IF @score<600 AND @score>=550
SET @class_id='04'
ELSE IF @score<550 AND @score>=500
SET @class_id='05'
ELSE
SET @class_id='06'
END
INSERT INTO class_student(class_id,stu_no)
VALUES(@class_id,@stu_no)--将数据插入到class_student表中
UPDATE student--将student表的stu_division_state改成已分班
SET stu_division_state=1
WHERE stu_no=@stu_no
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标移向inserted表的下一个数据,重复这个循环
END--循环结束
CLOSE stu_cursor
DEALLOCATE stu_cursor
GO

结果如图所示
Student表的多寡
亚洲必赢app 12
Class_student表的数据
亚洲必赢app 13
至此Student表中有所学生都已分班
为了以往福利,能够将游标示例2中的代码稍作修改封装成三个用户自定义存款和储蓄进度
亚洲必赢app,仓库储存进度示例3
修改后的代码如下

CREATE PROCEDURE student_division
AS
BEGIN
UPDATE student
SET stu_division_state=0--先将student表中所有学生的分班情况都标成未分班

DECLARE stu_class_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no FROM class_student
--新建游标stu_class_cursor指向class_student表的所有数据
OPEN stu_class_cursor--打开游标
DECLARE @stu_no VARCHAR(8)
FETCH NEXT FROM stu_class_cursor INTO @stu_no
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE student
SET stu_division_state=1
WHERE stu_no=@stu_no--利用游标找出student表中已分班的学生并标记分班状态
FETCH NEXT FROM stu_class_cursor INTO @stu_no
END
CLOSE stu_class_cursor--关闭游标
DEALLOCATE stu_class_cursor--释放游标资源
---所有学生是否分班已经全部记录在stu_division_state中

DECLARE @score INT,@class_id CHAR(2)
DECLARE stu_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no,stu_enter_score FROM student WHERE stu_division_state=0
--新建student表的游标stu_cursor,指向所有未分班学生
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor INTO @stu_no,@score
WHILE @@FETCH_STATUS=0--循环开始
BEGIN
BEGIN--先对@score的数值范围做判断,以确定该学生的班级编号
IF @score>=700
SET @class_id='01'
ELSE IF @score<700 AND @score>=650
SET @class_id='02'
ELSE IF @score<650 AND @score>=600
SET @class_id='03'
ELSE IF @score<600 AND @score>=550
SET @class_id='04'
ELSE IF @score<550 AND @score>=500
SET @class_id='05'
ELSE
SET @class_id='06'
END
INSERT INTO class_student(class_id,stu_no)
VALUES(@class_id,@stu_no)--将数据插入到class_student表中
UPDATE student--将student表的stu_division_state改成已分班
SET stu_division_state=1
WHERE stu_no=@stu_no
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标移向inserted表的下一个数据,重复这个循环
END--循环结束
CLOSE stu_cursor
DEALLOCATE stu_cursor
END
GO

注:和游标示例2的代码相比较,示例3的代码添加了将具有学员分班状态标记为0的经过,去掉了增进stu_division_state列的进度,但对原来已有的学员的分班状态赋值那几个手续没有删去,而是举办双重校验。并且删除了两段代码中的GO和第②段用于给学生分班的代码中对@stu_no变量的重复评释。

student表插入数据并运转student_division的积存进度

注:对student表插入数据前应先禁用示例1的触发器automatic_division

实践下列语句

ALTER TABLE student DISABLE TRIGGER automatic_division
--禁用automatic_division触发器
INSERT INTO student(stu_no,stu_name,stu_sex,stu_enter_score,stu_division_state)
VALUES('20180006','王洋','男','724',NULL),
('20180007','易阳','男','713',NULL),
('20180008','孙浩','男','584',NULL),
('20180009','张秋燕','女','420','False'),
('20180010','胡燕','女','527','True')

Student表的数目如图所示,红框内就是本人刚刚插入还未分班的数码,当中2018000920180010那多个学生的分班状态被笔者误标成FalseTrue
亚洲必赢app 14
实行存储进程

EXEC dbo.student_division

结果如图所示
Student表的数额(分班状态都为true了)
亚洲必赢app 15
Class_student表的多寡
亚洲必赢app 16

2.3.位运算符

位运算符包含与运算(&),或运算(|)和异或运算(^),能够对五个表明式进行位操作,那多少个表达式能够是整型数据或二进制数据。Transact-SQL首先把整型数据转换为二进制数据,然后按位运算。举个简单的例证。
示例3:申明二个int型变量@num1,@num2,对这多个赋值且做与或异或运算。
实践下边包车型大巴口舌

DECLARE @num1 int,@num2 int
SET @num1=5 
SET @num2=6
SELECT @num1&@num2 AS 与,
@num1|@num2 AS 或,
@num1^@num2 AS 异或

结果如图所示
亚洲必赢app 17
扩充示例4:写一个十进制转换为二进制的函数

CREATE FUNCTION Bin_con_dec(@dec int)--定义十进制转换为二进制函数
RETURNS varchar(20)
AS
BEGIN
DECLARE @quo int,@remainder varchar(20),@quo1 int
SET @quo=@dec
SET @remainder=''
WHILE @quo<>0
BEGIN
SET @quo1=@quo/2
SET @remainder=CAST(@quo%2 AS varchar(20))+@remainder
SET @quo=@quo1
END
RETURN @remainder
END

实践上边的函数后,运营下列语句验证函数正确性

PRINT dbo.Bin_con_dec(42)

结果为101010,函数定义正确。

1.2.DML触发器

当数据库服务器中生出多少操作语言(DML)事件时将被调用。如INSERT,DELETE,UPDATE等操作。将DML触发器和触发语句作为可在触发器内回滚的单个事务对待,借使检测到不当,则全体育工作作回滚。DML触发器在须臾地点丰盛管用:

  • 可完结数据库相关表之间的级联更改
  • 可以幸免恶意或不当的DML言语事件,并强制执行比CHECK封锁越来越复杂的任何限制
  • 能够评估数据修改前后表的情事,并基于该距离采取措施

1个表中的八个同类DML触发器,允许用八个不等的操作来响应同二个改动语句
SQL Server
2008
为每一种触发器创立了2个特别的表:INSERTED表和DELETED表。那是五个逻辑表,由系统来创设和护卫,用户不能够对她们开展改动。它们存放在内部存储器中,而不是在数据库中,并且协会与被DML触发器成效的表的构造同样。
INSERTED表中存放了由实践INSERTUPDATE语句而插入的富有行,在实践INSERTUPDATE话语时,新的就要同时被插入到触发器功用的表和INSERTED表中。INSERTED表中的行是触发器成效的表中央银行的副本。
DELETED表中存放了由进行DELETEUPDATE语句而删除的具有行,在执行DELETEUPDATE话语时,被剔除的就要由触发器功能的表中被挪动到DELETED表,七个表中不会有重复行。

1.施用Transact-SQL语言编制程序

就算SQL Server
2010提供了图形化界面,但唯有一种Transact-SQL语言能够一直与数据库引擎进行相互。依据实施职能特色能够将Transact-SQL语言分成3大类:数据定义语言DDL,数据操纵语言DML,数据控制语言DCL。

1.3.1.创建DML触发器

3.决定语句

1.3.4.3.直接递归

直接递归触发器是指任何递归进度有五个触发器参加,例如A激活B,B激活C,C激活A。能够作为是递归和嵌套的构成。
运用递归触发器时索要留意以下几点:
递归触发器很复杂,须求经过有系统的筹划和周密测试
在任意点的数额修改都会激活递归触发器。只可以按触发器被激活的特定顺序更新表。
具有触发器一起构成一个大事务,任意触发器的轻易地点上的ROLLBACK言语都将打消全数数据的输入,全体数据均被擦除。
触发器最四只好递归16层,一旦有第3几个触发器加入进来,结果与ROLLBACK命令一样,全部数据都将被擦除

2.6.连接运算符

加号(+)是字符串连接运算符,能够用它把字符串串连起来,在示例4的十进制转二进制函数中,就用上了加号。
示例7:将Student表的stu_name列和stu_enter_score列放在同等列显示,列名为score
Student表的数量如图所示
亚洲必赢app 18
履行下列语句

SELECT stu_name+CAST(stu_enter_score AS VARCHAR(3)) AS score FROM Student

执行结果如图所示
亚洲必赢app 19

注:stu_enter_score列数据类型为int,加号只对字符串类型数据有效,因而要用CAST函数将stu_enter_score的数据类型转换为varchar(3),那样才能兑现字符串拼接。

目录

1.4.1.2.局地变量

有个别变量能够拥有一定数据类型,有一定的功能域,一般用来充当计数器计算或控制循环执行次数,或许用于保存数据值。局地变量前唯有一个@符,用DECLARE语句表明局地变量。

USE test
DECLARE @StudentId varchar(20)
SET @StudentId=(
SELECT Student.stu_no
FROM Student
WHERE stu_enter_score='603')
SELECT @StudentId AS 入学分数为603的学生学号
GO

结果如图所示
亚洲必赢app 20

1.1.DDL触发器

当服务器或数据库中发出多少定义语言(DDL)事件时将被调用。如CREATE,ALTERDROP等操作。借使要履行以下操作,能够选取DDL触发器:

  • 制止对数据库架构举办改动
  • 期望数据库中生出一些境况以响应数据库架构中的更改
  • 要记录数据库架构中的更改或事件

1.3.数量控制语言DCL

关系到权力管理的言语称为数据控制语言,重要用来实施有关安全管理的操作。如授予权限(GRANT),收回权限(REVOKE),拒绝授予主体权限,并预防主体通过组或角色成员持续权限(DENY

1.3.3.2.查看触发器嵌套的层数

能够动用@@NESTLEVEL全局变量来查看当前触发器嵌套的层数
示例13:在示例11teacher_course_delete_batch触发器中应用@@NESTLEVEL全局变量查看当前触发器嵌套的层数
履行下列语句修改teacher_course_delete_batch触发器

ALTER TRIGGER teacher_course_delete_batch
ON teacher_course
FOR DELETE
AS
DECLARE @course_id CHAR(4)
DECLARE teacher_course_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT DISTINCT course_id FROM deleted
OPEN teacher_course_cursor
FETCH NEXT FROM teacher_course_cursor INTO @course_id
WHILE @@FETCH_STATUS=0
BEGIN
IF (SELECT COUNT(*) FROM teacher_course WHERE course_id=@course_id)=0
DELETE FROM course_selection WHERE course_id=@course_id
ELSE
PRINT 'course_id为'+@course_id+'的课程依然正常开课,该课程的学生选课情况不予删除'
FETCH NEXT FROM teacher_course_cursor INTO @course_id
SELECT @@NESTLEVEL AS NESTLEVEL
END
GO

测试teacher_course_delete_batch触发器(数据就不看了,未影响触发器原来的效率)
实践下列语句

DELETE FROM teacher_course WHERE teacher_id='0009'
--直接在teacher_course表中删除,激活teacher_course_delete_batch触发器

结果如图所示
亚洲必赢app 21
履行下列语句

DELETE FROM teacher WHERE teacher_id='0009'
--在teacher表中删除,触发teacher_delete_batch触发器,进而触发teacher_course_delete_batch触发器

结果如图所示
亚洲必赢app 22

3.6.RETUCR-VN无条件退出语句

该语句表示无条件结束查询,批处理或存款和储蓄进度的执行。存款和储蓄进度和批处理RETU悍马H2N语句后边的话语都不再履行。当在存款和储蓄进度中动用该语句时,能够钦定再次回到给调用应用程序、批处理或进程的整数值。假设RETU科雷傲N未钦赐重回值,则存款和储蓄进程的再次来到值是0

1.3.2.创建DDL触发器

DDL触发器只为了响应CREATEDROPALTER事件而激活,它的功能域是成套数据库大概服务器,而不是职能域某张表或试图。它能够使得控制哪位用户能够修改数据库结构以及如何修改。
示例10:创建1个DDL触发器,控制上班时间(8:00-18:00)不能对LibraryManagement数据库表和准备结构进行新建,修改和删除操作。
施行下列语句创造触发器deny_DDL_table

CREATE TRIGGER deny_DDL_table
ON DATABASE
WITH ENCRYPTION
FOR CREATE_TABLE,DROP_TABLE,ALTER_TABLE
AS
DECLARE @eventdata XML
SET @eventdata=EVENTDATA()
IF(DATEPART(HOUR,GETDATE()) BETWEEN 8 AND 17)
BEGIN
SELECT '触发器deny_DDL_table已禁止工作时间8:00-18:00对LibraryManagement数据库的CREATE,ALTER,DROP操作'
SELECT @eventdata.value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(max)') AS EventType,--事件类型
@eventdata.value('(/EVENT_INSTANCE/PostTime)[1]','nvarchar(max)') AS PostTime,--时间触发的时间
@eventdata.value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(max)') AS DatabaseName,--数据库名字
@eventdata.value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)') AS ObjectName,--操作的对象名称
@eventdata.value('(/EVENT_INSTANCE/ObjectType)[1]','nvarchar(max)') AS ObjectType,--操作的对象类型
@eventdata.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') AS CommandText--操作命令文本
ROLLBACK---对操作进行回滚,也可以不回滚
END
GO

实施以下代码以测试DDL触发器deny_DDL_table的正确

USE LibraryManagement
CREATE TABLE test(
t_id VARCHAR(2),
t_name VARCHAR(20)
)

结果如图所示
亚洲必赢app 23
亚洲必赢app 24

注:EVENTDATA()可在触发器内部选择,再次来到有关数据库和服务器事件的音信,以XML格式重返。唯有平素在DDL或登录触发器内部引用EVENTDATA时,EVENTDATA才会回到数据。借使EVENTDATA由别的例程调用(固然这么些例程由DDL或登录触发器进行调用),将重临
NULL

1.4.1.1.系统全局变量

系统全局变量分为两大类,一类是与自然SQL
Server连接或与方今处理有关的全局变量,如@@Rowcount表示近来三个言语影响的行数。@@error表示保留如今实施操作的荒谬状态。一类是与总体SQL
Server系统有关的全局变量,如@@Version表示近期SQL Server的版本音信。

SELECT @@VERSION AS 当前版本;--查看当前SQL Server的版本信息

结果如图所示
亚洲必赢app 25

1.触发器

触发器是一种新鲜的存款和储蓄进程,与表紧凑关系。

3.1.BEGIN END语句块

BEGIN END能够定义SQL
Server语句块,使这个话语作为一组语句执行,允许语句嵌套。举例请见示例4

1.3.1.2.DELETE触发器

当针对对象数据库运维DELETE讲话时就会激活DELETE触发器。用户平素运营DELETE言辞和利用DELETE触发器又有所分歧,当激活DELETE触发器后,从受触发器影响的表中删除的行会被放置在3个例外的临时表——DELETED表中。DELETED表还同意引用由初步化DELETE语句发生的日记数据。
DELETE触发器被激活时,要求考虑以下几点

  • 当某行被添加到DELETED表中时就不设有于数据库表,由此数据库表和DELETED表不容许存在相同行。
  • 系统活动创设DELETED表时,空间从内部存款和储蓄器中分红。DELETED表被储存在高速缓存中。
  • DELETE操作定义的触发器并不实行TRUNCATE
    TABLE
    讲话,原因在于日志不记录TRUNCATE TABLE语句。

示例4:为student表定义三个DELETE触发器,当删除一条学生音讯时,class_student表中该学生的分班音信也会被剔除
施行下边包车型地铁语句

CREATE TRIGGER delete_student
ON student
FOR DELETE
AS
DECLARE @stu_no VARCHAR(8)
DECLARE stu_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no FROM deleted
OPEN stu_cursor
FETCH NEXT FROM stu_cursor INTO @stu_no
WHILE @@FETCH_STATUS=0
BEGIN
DELETE FROM class_student
WHERE stu_no=@stu_no
FETCH NEXT FROM stu_cursor INTO @stu_no
END
CLOSE stu_cursor
DEALLOCATE stu_cursor
GO

测试delete_student触发器的没错
Student表的数目如图所示
亚洲必赢app 26
Class_student表的数码如图所示
亚洲必赢app 27
施行下列语句

DELETE FROM student
WHERE stu_enter_score<=351
--在student表中删除入学成绩小于分的学生

student表来看,唯有入学编号为2018001120180012的学员战表被剔除。该操作激活了delete_student触发器
Class_student表的数额如图所示
亚洲必赢app 28
入学编号为2018001120180012的上学的小孩子分班音讯已经从class_student表中自动删除。

2.5.逻辑运算符

逻辑运算符的意义是对规则举行测试。ALL,AND,ANY,BETWEEN,EXISTS,IN,LIKE,NOT,ALL,SOME。上边用SOME来比喻。SOME的成效是假设在一组相比中,有些为true那就为true。
示例6:查询Student表中是还是不是存在入学成绩超乎平均分的学员,若是存在,输出true,不存在输出false。
Student表的stu_enter_score列(入学成绩)数据如图所示
亚洲必赢app 29
实施下边包车型地铁语句

USE test
IF (SELECT AVG(stu_enter_score) FROM Student)<=SOME(SELECT stu_enter_score FROM Student)
PRINT 'true'
ELSE
PRINT 'false'
GO

结果如图所示
亚洲必赢app 30

1.3.成立触发器

2.运算符

1.3.3.3.禁止使用和启用嵌套触发器

EXEC sp_configure 'nested triggers',0;
GO
--禁用嵌套触发器
EXEC sp_configure 'nested triggers',1;
GO
--启用嵌套触发器

1.2.数据操纵语言DML

是用来操纵表和视图中的数据的言语,例如查询数据(SELECT),插入数据(INSERT),更新数据(UPDATE)和删除数据(DELETE)等。

1.3.4.2.直接递归

平昔递归触发器是指任何递归进度唯有它本人一个触发器的参与。本身激活了祥和。

3.8.T奥德赛Y CATCH错误处理语句

即便T翼虎Y块内部产生错误,会将决定传递给CATCH块内的语句组。TLX570Y
CATCH构造捕捉全部严重级别大于10但不会终止数据库连接的谬误。
示例15:TRY CATCH的示例
举办下列语句

BEGIN TRY
SELECT * FROM Student
SELECT 120/0 FROM Student
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS '错误信息'
END CATCH

推行结果如图所示
亚洲必赢app 31
语句中二个select语句全体都执行了。假如把报错的select语句放到不荒谬的select语句后面,符合规律的select语句还是能够无法实施呢?执行下列语句

BEGIN TRY
SELECT 120/0 FROM Student
SELECT * FROM Student
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS '错误信息'
END CATCH

结果如图所示
亚洲必赢app 32
不奇怪select语句不或然推行。TLX570Y
CATCH语句的逻辑是,一旦TCR-VY语句块中冒出难点讲话,立时跳转到CATCH语句块,TCR-VY语句块接下去的言辞不再实施。

1.3.1.3.UPDATE触发器

当针对对象数据库运转UPDATE说话时就会激活UPDATE触发器。对UPDATE触发器来说,一时半刻表INSERTEDDELETED依旧有效。UPDATE触发器被激活时,原始行被移入DELETED表中,更新行被移入到INSERTED表中。触发器检查DELETED表和INSERTED表以及被更新的表,来规定是或不是更新了多行和哪些实施触发器动作。
Student表的多寡如图所示
亚洲必赢app 33
Class_student表的数量如图所示
亚洲必赢app 34
示例5:当student表中的stu_no字段更新时,同步创新class_student表中的stu_no字段
执行下列语句新建触发器update_stu_no_single

CREATE TRIGGER update_stu_no_single
ON student
FOR UPDATE
AS
IF UPDATE(stu_no)
BEGIN
UPDATE class_student
SET stu_no=(SELECT stu_no FROM inserted)
WHERE stu_no=(SELECT stu_no FROM deleted)
END
GO

验证update_stu_no_single触发器是或不是正确,在Student表中进行下列语句,将student表中stu_no为“20180101”的学生的stu_no改成00000000

UPDATE student
SET stu_no='00000000'
WHERE stu_no='20180101'

施行成功后,update_stu_no_single触发器被激活,class_student表的数量如图所示
亚洲必赢app 35

注:update_stu_no_single触发器只可以对单行记录的UPDATE操作起效,若是批量UPDATE
stu_no
,执行语句时会提醒子查询再次来到的值持续二个。上边包车型地铁示例6将提供批量UPDATE
stu_no
的触发器

示例6:实现当student表的stu_no字段批量更新时,class_student表的stu_no也同步批量立异
首先将student表和class_student表的数量修改成原本的样板,并且删除update_stu_no_single触发器
Student表的数码如图所示
亚洲必赢app 36
Class_student表的多少如图所示
亚洲必赢app 37
实施下列语句新建触发器update_stu_no_batch

CREATE TRIGGER update_stu_no_batch
ON student
FOR UPDATE
AS
DECLARE @stu_no_insert VARCHAR(8),@stu_no_delete VARCHAR(8)
DECLARE stu_cursor_insert CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no FROM inserted
OPEN stu_cursor_insert
DECLARE stu_cursor_delete CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no FROM deleted
OPEN stu_cursor_delete
FETCH NEXT FROM stu_cursor_insert INTO @stu_no_insert
FETCH NEXT FROM stu_cursor_delete INTO @stu_no_delete
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE class_student
SET stu_no=@stu_no_insert
WHERE stu_no=@stu_no_delete
FETCH NEXT FROM stu_cursor_insert INTO @stu_no_insert
FETCH NEXT FROM stu_cursor_delete INTO @stu_no_delete
END
CLOSE stu_cursor_insert
CLOSE stu_cursor_delete
DEALLOCATE stu_cursor_insert
DEALLOCATE stu_cursor_delete
GO

验证update_stu_no_batch触发器的准确性,对student表执行下列语句,完结批量修改操作

UPDATE student
SET stu_no='00000000'
WHERE stu_no LIKE '201801%'
GO

Student表的多少如图所示
亚洲必赢app 38
Class_student表的多寡如图所示
亚洲必赢app 39
大家再来验证update_stu_no_batch触发器对立异单行stu_no数量是或不是管用。将student表class_student表的多寡改回原来的样板,然后实施下列语句

UPDATE student
SET stu_no='00000000'
WHERE stu_no='20180101'

Class_student表的数目如图所示
亚洲必赢app 40

注:在将表数据改成原本的楷模时,间接在编辑前200行中操作依然用T-SQL讲话操作,对student表数据操作,不成事的话要考虑受键和束缚的震慑,对class_student表数据操作,不成功的话要考虑受触发器影响。

1.4.1.常量与变量

常量不多说。在SQL Server
二零一零中,存在两种变量。一种是系统定义和维护的全局变量,一种是用户定义用来保存中间结果的有些变量。

1.3.1.4.INSTEAD OF触发器

INSTEAD
OF
触发器能够内定执行触发器,而不是实施触发SQL讲话,从而屏蔽原来的SQL言语,而转用执行触发器内部的言辞。各类表恐怕视图只好有3个INSTEAD
OF
触发器。INSTEAD
OF
触发器的风味是,能够使作为触发条件的SQL语句不执行。
Membership表的数目如图所示
亚洲必赢app 41
Call_slip表的数码如图所示
亚洲必赢app 42
示例7:对LibraryManagement数据Curry的membership表写四个防删除触发器,尚有借书未还的读者不能够被去除
履行下列语句创制member_delete_single触发器

CREATE TRIGGER member_delete_single
ON membership
INSTEAD OF DELETE
AS
BEGIN
IF NOT EXISTS(SELECT * FROM call_slip WHERE member_id=(SELECT member_id FROM deleted) AND borrow_state='未归还')
DELETE FROM membership WHERE member_id=(SELECT member_id FROM deleted)
ELSE
BEGIN
SELECT '该用户尚有图书未还,无法删除'
SELECT * FROM call_slip WHERE member_id=(SELECT member_id FROM deleted) AND borrow_state='未归还'
END
END
GO

表明触发器的不易,执行下列语句

DELETE FROM membership
WHERE member_id='20060128'

结果如图所示
亚洲必赢app 43
该触发器只针对DELETE一条数据有效
示例8:对LibraryManagement数据Curry的membership表写三个防批量删除触发器,尚有借书未还的读者不或然被删去
Membership表的数目如图所示
亚洲必赢app 44
Call_slip表的数额如图所示
亚洲必赢app 45
施行下列语句新建触发器(将示例7中的member_delete_single触发器先删除)

CREATE TRIGGER member_delete_batch
ON membership
INSTEAD OF DELETE
AS
BEGIN
DECLARE member_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT member_id FROM deleted
OPEN member_cursor
DECLARE @member_id VARCHAR(8)
FETCH NEXT FROM member_cursor INTO @member_id
WHILE @@FETCH_STATUS=0
BEGIN
BEGIN
IF NOT EXISTS(SELECT* FROM call_slip WHERE member_id=@member_id AND borrow_state='未归还')
DELETE FROM membership WHERE member_id=@member_id
ELSE
PRINT '用户'+@member_id+'无法删除'
END
FETCH NEXT FROM member_cursor INTO @member_id
END
CLOSE member_cursor
DEALLOCATE member_cursor
END
GO

结果如图所示
亚洲必赢app 46
Membership表的数码如图所示
亚洲必赢app 47
示例9:对LibraryManagement数据Curry的call_slip表写一个防超借触发器,三个读者的未还图书最四只好有5本,超出不能够再借(那里照旧针对批量甩卖多少创建触发器)
Call_slip表的多少如图所示
亚洲必赢app 48
实施下列语句创造provent_overborrowing_batch触发器

CREATE TRIGGER provent_overborrowing_batch
ON call_slip
INSTEAD OF INSERT
AS
BEGIN
DECLARE @member_id VARCHAR(8)
DECLARE borrow_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT DISTINCT member_id FROM inserted
OPEN borrow_cursor
FETCH NEXT FROM borrow_cursor INTO @member_id
WHILE @@FETCH_STATUS=0
BEGIN
BEGIN
IF (SELECT COUNT(*) FROM call_slip WHERE member_id=@member_id AND borrow_state='未归还')<5
INSERT INTO call_slip SELECT * FROM inserted WHERE member_id=@member_id
ELSE
PRINT '用户'+@member_id+'已借阅且未还的图书超过5本,无法再借'
END
FETCH NEXT FROM borrow_cursor INTO @member_id
END
END
GO

进行下列语句测试provent_overborrowing_batch触发器的科学,在那之中member_id为“20060128”的用户借书未还超越5本,应该是无力回天再借的。

--测试数据
INSERT INTO call_slip(book_id,member_id,loan_period,borrow_state)
VALUES('20130002','20060128','30','未归还'),
('20130001','20060128','20','未归还'),
('20130003','20060128','30','未归还'),
('20130004','20062919','30','未归还'),
('20130005','20150821','45','未归还')

结果如图所示
亚洲必赢app 49
Call_slip表的数目如图所示,红框里是新插入的数码
亚洲必赢app 50

目录

1.4.管理触发器

剥夺和启用触发器
举行下列语句禁止使用和启用触发器

ALTER TABLE student DISABLE TRIGGER update_stu_no_single
--禁用update_stu_no_single触发器
GO
ALTER TABLE student ENABLE TRIGGER update_stu_no_single
--启用update_stu_no_single触发器
GO

履行下列语句禁止使用和启用数据库级别触发器

DISABLE TRIGGER deny_DDL_table ON DATABASE
--禁用数据库级别触发器deny_DDL_table
GO
ENABLE TRIGGER deny_DDL_table ON DATABASE
--启用数据库级别触发器deny_DDL_table
GO

3.5.WAITFO奇骏推迟语句

WAITFO昂Cora延迟语句能够让在它将来的言辞在贰个钦点的天天或然时间距离后实施,能够悬挂起批处理,存款和储蓄进程或工作的执行。
示例12:在有些时间点查询Student表学号为20180101的学员信息

BEGIN
WAITFOR TIME '15:03'--在15点03分查询
SELECT * FROM Student
WHERE stu_no='20180101'
END

示例13:在3分钟后查询Student表学号为20180102的学生消息

BEGIN
WAITFOR DELAY '00:03'--在3分钟后查询
SELECT * FROM Student
WHERE stu_no='20180102'
END

亚洲必赢app 51

1.3.4.1.递归触发器

触发器被激活,更改了表中数量,那种变更又激活了它本身,那种触发器被叫作递归触发器。数据库成立时暗中同意递归触发器禁止使用。但足以选择ALTER
DATABASE
选取来启用它。递归触发器启用的先决条件是嵌套触发器必须是启用情况,倘诺嵌套触发器禁止使用,不管递归触发器的安插是什么样都将被剥夺。而在递归触发器中,inserted表和deleted表都只包涵被上3回触发器影响的行数据。
递归触发器有以下三种分歧品类(那边没有适合的运用示范可举,先不举例了)

3.7.GOTO跳转语句

该语句使T-SQL批处理的推行跳转至钦点标签。由于该语句破坏结构化语句的布局,尽量少用
示例13:将GOTO作为分支机制
实践下边语句

DECLARE @Counter int;  
SET @Counter = 1;  
WHILE @Counter < 10  
BEGIN   
    SELECT @Counter  
    SET @Counter = @Counter + 1  
    IF @Counter = 4 GOTO Branch_One --Jumps to the first branch.  
    IF @Counter = 5 GOTO Branch_Two  --This will never execute.  
END  
Branch_One:  
    SELECT 'Jumping To Branch One.'  
    GOTO Branch_Three; --This will prevent Branch_Two from executing.  
Branch_Two:  
    SELECT 'Jumping To Branch Two.'  
Branch_Three:  
SELECT 'Jumping To Branch Three.';

结果如图所示
亚洲必赢app 52
当Counter=4时,执行GOTO语句输出Branch
One,执行完这几个讲话之后就打破了WHILE循环,接着执行Branch_One语句中的GOTO,输出Branch
Three,截止。

注:在WHILE循环中应用GOTO会打破循环。

示例14:用GOTO语句完成示例1第11中学打字与印刷菱形的职能
实践下列语句

DECLARE @width int,@j int,@i int
SET @width=9--@width为菱形的最大宽度
SET @j=1--@j表示每行打印的“*”符号的个数
SET @i=1--@i表示下一行打印第i行
Set3:PRINT SPACE((@width-@j)/2)+REPLICATE('*',@j)--SPACE函数打印n个空字符,REPLICATE打印n个特定字符串
SET @i=@i+1
IF @i<=(@width+1)/2
GOTO Set1
ELSE
GOTO Set2
Set1:
SET @j=@j+2
GOTO Set3
Set2:
SET @j=@j-2
IF @j>=1
GOTO Set3

结果如图所示
亚洲必赢app 53

3.2.IF ELSE语句块

用以钦点T-SQL语句的执行标准,若条件为真,则实行标准表明式前面包车型的士话语,条件为假时,能够试用ELSE关键字钦定要履行的T-SQL语句。举例请见示例4

1.3.3.1.嵌套触发器

若果叁个触发器在履行操作时引发了另1个触发器,而以此触发器又抓住了下二个触发器,那么那些触发器正是嵌套触发器。嵌套触发器在装置时就被启用,然则足以选择sp_configure积存进程禁止使用和重复启用嵌套。
DML触发器和DDL触发器最多能够嵌套32层,能够透过nested
triggers
来布署是不是足以嵌套AFTER触发器,不过无论此设置哪些都得以嵌套INSTEAD
OF
触发器。假使嵌套触发器进入了格外循环,该触发器将被停止,并且回滚整个工作。嵌套触发器具有种种用处,比如保留前1个触发器所影响的行的副本。
采纳嵌套触发器时应当小心以下几点:

  • 默许情况下,嵌套触发器配置选项开启。
  • 在同一个触发器事务中,二个触发器不会被触发四次,触发器不会调用他自身来响应触发器中对同3个表的第三遍创新
  • 出于触发器是1个作业,一旦嵌套中其余一层的触发器出现错误,将回滚整个事情。

示例11:有teacher_course表(教授所教学程表),course表(课程表)和course_selection表(学生选课表),写三个嵌套触发器,完结课程撤消后,删除教师所教师程表中关于该课程的笔录,而老师所教学程表中该学科的记录被撤销,导致该学科的学习者选课记录也做相应废除。
施行下列语句

--创建course表上的触发器,删除course表中的课程,teacher_course表中的记录做对应删除
CREATE TRIGGER course_delete_batch
ON course
FOR DELETE
AS
DECLARE @course_id CHAR(4)
DECLARE course_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT course_id FROM deleted
OPEN course_cursor
FETCH NEXT FROM course_cursor INTO @course_id
WHILE @@FETCH_STATUS=0
BEGIN
DELETE FROM teacher_course WHERE course_id=@course_id
FETCH NEXT FROM course_cursor INTO @course_id
END
GO
--创建teacher_course表上的触发器,删除教师课程表的记录,学生选课表的记录也做对应删除
CREATE TRIGGER teacher_course_delete_batch
ON teacher_course
FOR DELETE
AS
DECLARE @course_id CHAR(4)
DECLARE teacher_course_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT DISTINCT course_id FROM deleted
OPEN teacher_course_cursor
FETCH NEXT FROM teacher_course_cursor INTO @course_id
WHILE @@FETCH_STATUS=0
BEGIN
IF (SELECT COUNT(*) FROM teacher_course WHERE course_id=@course_id)=0
DELETE FROM course_selection WHERE course_id=@course_id
ELSE
PRINT 'course_id为'+@course_id+'的课程依然正常开课,该课程的学生选课情况不予删除'
FETCH NEXT FROM teacher_course_cursor INTO @course_id
END
GO

course_delete_batch和**
teacher_course_delete_batch就形成了一个嵌套触发器,下边来表明嵌套触发器的正确。 Course表中的数据如图所示
亚洲必赢app 54
Teacher_course表中的数据如图所示
亚洲必赢app 55
Course_selection**表中的数据如图所示
亚洲必赢app 56
以课程0013为例,执行下列语句

DELETE FROM course WHERE course_id='0013'

Course表的数码如图所示
亚洲必赢app 57
Teacher_course表的数额如图所示
亚洲必赢app 58
Course_selection表的多寡如图所示
亚洲必赢app 59
负有关于0013课程的数量都被去除。嵌套触发器有效。

注:在触发器teacher_course_delete_batch中,作者额外插足了2个论断,当teacher_course表中还有老师在授课那门课程时,全数有关那门课程的学生选课信息都反对删除。这样做在嵌套触发器里是多余的,删除一门科目,必然会删除teacher_course表中拥有与那门课程有关的笔录,也自然删除course_selection表中享有与这门课程有关的笔录,但是,那样做能够保证该触发器能够单独于嵌套触发器被单独激活。Teacher_course_delete_batch触发器还是能用来其余嵌套触发器中,看示例12

示例12:有teacher表(教授音信表),teacher_course(教授所教学程表),和course_selection表(学生选课记录表),写3个嵌套触发器,实现当3个教育工我离职时,在剔除该助教所教课程音讯,假如没有导师教那门课程,再删除该学科选课记录。
其中teacher_course表的触发器teacher_course_delete_batch已经在示例11中写完,只需创造teacher表的teacher_delete_batch触发器即可
实施下列代码

CREATE TRIGGER teacher_delete_batch
ON teacher
FOR DELETE
AS
DECLARE @teacher_id CHAR(4)
DECLARE teacher_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT teacher_id FROM deleted
OPEN teacher_cursor
FETCH NEXT FROM teacher_cursor INTO @teacher_id
WHILE @@FETCH_STATUS=0
BEGIN
DELETE FROM teacher_course WHERE teacher_id=@teacher_id
FETCH NEXT FROM teacher_cursor INTO @teacher_id
END
GO

测试嵌套触发器的正确
Teacher表的数码如图所示
亚洲必赢app 60
Teacher_course表的数额如图所示
亚洲必赢app 61
Course_selection表的多少如图所示
亚洲必赢app 62
以删除0012号教授路易为例,0012号教师执教0013号课程,且teacher_course表中并无其余助教教学0013号课程,按照逻辑要刨除teacher_course表中0012号教授的所教课程记录和course_selection表中全体0013号课程的选课记录。执行下列语句

DELETE FROM teacher WHERE teacher_id='0012'

Teacher表的多少如图所示
亚洲必赢app 63
Teacher_course表的数据如图所示
亚洲必赢app 64
Course_selection表的数量如图所示
亚洲必赢app 65
测试结果正确
参考上边的多少,继续测试另一种状态,以删除0011号教授卢含笑为例,0011号教授执教0012号课程,在teacher_course表中还有其它导师教学该学科,因而嵌套触发器会去除teacher_course表中有关0011号教师教学课程记录,但不会删除course_selection表中关于0012号课程的选课记录。执行下列语句

DELETE FROM teacher WHERE teacher_id='0011'
GO

结果如图所示
亚洲必赢app 66
Teacher表的多寡如图所示
亚洲必赢app 67
Teacher_course表的数量如图所示
亚洲必赢app 68
Course_selection表的数目如图所示
亚洲必赢app 69

2.8.运算符的先行级

优先级 运算符
1 ~(位反)
2 *(乘),/(除),%(取模)
3 +(正),-(负),+(加),+(连接),-(减),&(位与)
4 =,>,<,>=,<=,<>,!=,!>,!<(比较运算符)
5 ^(位异或),位或(符号打不出来,前面有,自己翻)
6 NOT
7 AND
8 ALL,ANY,BETWEEN,IN,LIKE,ALL,SOME
9 =(赋值)

当表明式中的运算符有相同的预先级时,依照它们在表明式中的地点,一元运算符按从右往左运算,二元运算符(对四个表明式成效的运算符)按从左往右运算。
示例9:验证运算符优先级
实践下列语句

DECLARE @result INT,@num INT
SET @num=45
SET @result=@num+(~@num)*4-@num/(~@num)
SELECT @result AS result
GO

结果如图所示
亚洲必赢app 70
计量代码中的表明式
@result=@num+(~@num)4-@num/(~@num)
=@num+(-46)
4-@num/(-46)
=45+(-46)4-45/(-46)
=45+(-46)
4
=-139

1.1.数额定义语言DDL

是最基础的Transact-SQL语言类型,用来创制数据库和开创,修改,删除数据库中的各类对象,为别的语言的操作提供对象。例如数据库,表,触发器,存储进度,视图,函数,索引,类型及用户等都以数据库中的对象。常见的DDL语句包含

CREATE TABLE--创建表
DROP TABLE--删除表
ALTER TABLE--修改表

1.4.Transact-SQL言语功底

2.7.一元运算符

一元运算符只对一个表明式执行操作,该表明式能够是数字数据类型中的任何一种数据类型。SQL
Server 二〇一〇提供的一元运算符包涵正(+),负(-),位反(~)。
示例8:证明一(Wissu)个int数据类型变量@num并赋值,对该变量做正负位反操作。
施行下列语句

DECLARE @num INT
SET @num=45
SELECT +@num AS 正,-@num AS 负,~@num AS 位反
GO

结果如图所示
亚洲必赢app 71

注:位反操作符用于取一个数的补数,只可以用于整数。

2.1.算数运算符

在SQL Server
二〇〇九中,算数运算包罗加(+)减(-)乘(*)除(/)取模(%)。举多个不难的例子。
示例1:在Student表中添加一列,列名为stu_age,根据Student表的stu_birthday列计算stu_age列并插入数据。(演示插入整列数据的艺术)
Student表数据如图所示
亚洲必赢app 72
执行上面包车型客车讲话

ALTER TABLE Student
ADD stu_age int;--在Student表中添加stu_age列
CREATE TABLE #agetemp(stu_no varchar(8),age int);--新建一个临时表
INSERT INTO #agetemp(stu_no,age)--在临时表中插入学号和计算出来的年龄
SELECT Student.stu_no,YEAR(GETDATE())-YEAR(stu_birthday)--利用函数和运算符计算年龄
FROM Student;
UPDATE Student
SET Student.stu_age=#agetemp.age--将临时表中的age列数据整个复制到Student表的stu_age列
FROM #agetemp
WHERE Student.stu_no=#agetemp.stu_no--条件是两个表的stu_no列值相等
GO
SELECT * FROM Student

结果如图所示
亚洲必赢app 73

3.4.WHILE语句

用来安装双重执行T-SQL语句或语句块的原则。
示例11:用“*”在显示屏上输出1个大幅度为9的菱形。
实施下列语句

DECLARE @width int,@j int
SET @width=9--@width为菱形的最大宽度
SET @j=1--@j表示每行打印的“*”符号的个数
WHILE @j<=@width
BEGIN
PRINT SPACE((@width-@j)/2)+REPLICATE('*',@j)--SPACE函数打印n个空字符,REPLICATE打印n个特定字符串
SET @j=@j+2
END
SET @j=@width-2
WHILE @j>0
BEGIN
PRINT SPACE((@width-@j)/2)+REPLICATE('*',@j)
SET @j=@j-2
END

结果如图所示
亚洲必赢app 74

4.常用函数

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图