3.1 使用变量
变量是可以存储数据值的对象。可以使用局部变量向SQL语句传递数据。在T-SQL中执行一批SQL语句时,可以声明许多变量以便临时使用。声明变量以后,可以在批处理中用一条T-SQL语句设置该变量的值。该批处理中的下一条语句可以从该变量中检索数值,并给出结果。
T-SQL中的变量分为局部变量和全局变量。局部变量的使用也是先声明,再赋值。而全局变量右系统定义和维护,我们可以直接使用,但一般不自定义全局变量。
3.1.1 局部变量
局部变量的名称必须以标记@作为前缀。
声明局部变量的语句如下:
Declare @variable_name DataType
其中, variable_name 为局部变量的名称,DataType为数据类型。
例如:
Declare @name varchar(8) --- 声明一个存放学员姓名的变量name,最多可以存储8个字符
Declare @seat int --- 声明一个存放学员座位号的变量seat
局部变量的赋值有两种方法:使用SET 语句或 Select 语句。
语法:
Set @variable_name = value
或
Select @variable_name = value
假定使用insert语句,已向表stuInfo中插入了如下几条测试数据。
stuName | stuNo | stuSex | stuAge | stuSeat | stuAddress |
张秋丽 | s25301 | 男 | 18 | 1 | 北京海淀 |
李文才 | s25302 | 男 | 31 | 3 | 地址不详 |
李斯问 | s25303 | 女 | 22 | 2 | 河南洛阳 |
欧阳俊雄 | s25304 | 男 | 28 | 4 | 新疆 |
示例1
/*-- 查找'李文才'的信息 --*/
Declare @name varchar(8) ---学员姓名
set @name = '李文才' ---使用set赋值
select * from stuInfo where stuName = @name
/*-- 查找'李文才'的左右同桌 --*/
Declare @seat int --- 座位号
Select @seat = stuSeat from stuInfo where stuName = @name --- 使用Select赋值
Select * from stuInfo where (stuSeat = @seat + 1) or (stuSeat = @seat - 1)
从示例1可以看出,局部变量可用于在上下语句中传递数据(如本例的座位号@seat)。
set 赋值语句一般用于赋给变量指定的数据常量,如本例“李文才”。
Select 赋值语句一般用于从表中查询数据,然后再赋给变量。需要注意的是,Select 语句需要确保筛选的记录不多于一条。如果查询的记录多于一条,将把最后一条记录的值赋给变量。
3.1.2 全局变量
SQL Server 中的所有全局变量都使用两个@标志作为前缀。
常用的全局变量见下图。
变量 | 含义 |
@@ERROR | 最后一个T-SQL错误的错误号 |
@@IDENTITY | 最后一次插入的标识值 |
@@LANGUAGE | 当前使用的语言的名称 |
@@MAX_CONNECTIONS | 可以创建的同时连接的最大数目 |
@@ROWCOUNT | 受上一个SQL语句影响的行数 |
@@SERVERNAME | 本地服务器的名称 |
@@SERVICENAME | 该计算机上的SQL服务的名称 |
@@TIMETICKS | 当前计算机上每刻度的微妙数 |
@@TRANSCOUNT | 当前连接打开的事务数 |
@@VERSION | SQL SERVER的版本信息 |
3.2 输出语句
T-SQL中支持的输出语句,用于输出显示处理的数据结果。
常用的输出语句用两种,它们的语法分别如下。
pint 局部变量或字符串
select 局部变量 AS 自定义列名
其中,第二种方法就是查询语句的特殊应用。
示例2
pint '服务器的名称:' + @@SERVERNAME
select @@SERVERNAME AS '服务器名称'
用print 语句输出的结果将在消息窗口中以文本方式显示,用Select 语句输出的结果将在结果窗口中以表格方式显示。
由于使用print语句要求以单个局部变量或字符串表达式作为参数,所以如果我们这样编写SQL语句将会出错。
print '当前错误号' + @@ERROR
因为全局变量@@ERROR返回的是整型数值。那么如何解决呢?(转换函数,把数值转换成字符串)
print '当前错误号' + convert(varchar(5) , @@ERROR)
理解了输出语句后,我们再看看有关全局变量的示例。
示例3
insert into stuInfo( stuName, stuNo, stuSex, stuAge) values ('梅超风', 's25318', '女', '23')
print '当前错误号' + convert(varchar(5), @ERROR) ---如果大于0,表示上一条语句执行有错误
print '刚才报名的学员,座位号为:' + convert(varchar(5), @@IDENTITY)
Update stuInfo set stuAge = 85 where stuName = '李文才'
print '当前错误号:' + convert(varchar(5), @@ERROR)
print 'SQL Server 的版本' + @@VERSION
GO
@@ERROR 用于表示最近一条SQL语句是否有错误,如果有错误,将返回非零的值。第一次“insert”语句没错,所以为0。第二次“Update”语句违反年龄15~40的检查约束,所以错误号不为零。
@@IDENTITY可用来查询最后插入的标识值(自动编号值)。例如,本例stuInfo表的stuSeat(座位号)字段,我们前面已定义为标识列(自动标号列),该列的值将自动生成,所以在插入时不用跳鞋座位号的数据。一旦插入数据后,我们可以通过查询@@IDENTITY全局变量,来查看目前的自动编号值,即“梅超风”的座位号。
3.3 逻辑控制语句
3.3.1 IF-ELSE 条件语句
语法
IF (条件)
语句或语句块
ELSE
语句或语句块
同java语言一样,ELSE为可选。
如果有多条语句,需要使用语句块,语句块使用BEGIN···END表示,其作用类似java语言的“{}”符合。
IF(条件)
BEGIN
语句1
语句2
···
END
ELSE
···
假定我们已向学员成绩表stuMarks中添加以下测试数据。
ExamNo | stuNo | writtenExam | LabExam |
s271811 | s25303 | 80 | 58 |
s271813 | s25302 | 50 | 90 |
s271815 | s25302 | 65 | 0 |
s271816 | s25301 | 77 | 82 |
示例4
DECLARE @myavg float
Select @myavg = AVG(writtenExam) FROM stuMarks
print '本班平均分' + convert(varchar(5), @myavg)
IF(@myavg > 70)
Begin
print '本班笔试成绩优秀,前三名的成绩为:'
Select top 3 * from stuMarks Order by writtenExam DESC
End
Else
Begin
print '本班笔试成绩较差,后三名的成绩为:'
Select top 3 * from stuMarks order by writtenExam
End
为了把输出的表格数据和文本消息显示在同一个窗口中,需要做如下设置。
单击Microsoft SQL Server Management Studio 的菜单中“工具”-->“选项”命令,选择“查询结果”选项,将“显示结果的默认方式”设置为“以文本格式显示结果”。
3.3.2 WHILE 循环语句
While 循环语句可以根据某些条件重复执行一条SQL语句或一个语句块。通过使用While关键字,可以确保只要指定的条件为true,就会重复执行语句。可以在While循环中使用Coutinue 和 Break 关键字来控制语句的执行。
语法
While (条件)
语句或语句块
[Break]
使用 break 关键字从最内层的while 循环中退出。
示例5
Insert into stuMarks (examNo, stuNo, writtenExam, LabExam)
values ('s271819', 's25318', 56, 48)
Select * from stuMarks
Declare @n int
While (1=1)
Begin
Select @n = count (*) From stuMarks where writtenExam < 60
if(@n > 0)
Update stuMarks set writtenExam = writtenExam + 2
Else
Break
End
Print '加分后的成绩如下:'
Select * from stuMarks
3.3.3 Case 多分支语句
语法
Case
When 条件1 Then 结果1
When 条件2 Then 结果2
[Else 其他结果]
End
Case 语句表示如果'条件1'成立,则执行'结果1',其余类推。
示例6
Select * from stuMarks
Print 'ABCDE 五级显示成绩如下:'
Select stuNo , 成绩 = Case
When writtenExam < 60 Then 'E'
When writtenExam between 60 and 69 Then 'D'
When writtenExam between 70 and 79 Then 'C'
When writtenExam between 80 and 89 Then 'B'
Else 'A'
End
From stuMarks
3.4 批处理语句
批处理语句我们并不陌生,前面已用过的“GO”就是批处理的标志。它是一条或多条SQL语句的集合,SQL Server 将批处理语句编译成一个可执行单元,此单元成为执行计划。每个批处理可以编译成单个执行计划,从而提高执行效率。如果批处理包含多条SQL语句,则执行这些语句所需的所有优化的步骤将编译在单个执行计划中。
在多用户环境下,用户可能同时访问数据库,这将增加网络流量。在单用户环境中,用户可能需要对数据库执行多个任务,如更新表以及对Select查询语句的结果进行计算等,这需要向数据库发送一系列命令。
以一个包含员工详细信息及其工作详细信息的数据库为例。该数据库的一个用户想要根据基本薪水的详细信息、工作的总天数以及休假的总天数来计算每个员工的纯收入。
为了重复执行该任务(以便计算每个员工的收入),将这些命令存储在一个文件中,并作为单个执行计划向数据库发送所有命令,将会更容易。以一条命令的方式来处理一组命令的过程成为批处理。
批处理的主要好处是能够简化数据库的管理。例如,如果需要更改存储在用户计算机上的现有查询语句,可能需要在所有用户的计算机上进行更改。但是,如果将该查询语句集中存储在服务器上,不管是作为文件还是做作为存储过程,我们只需在服务器端更改一次即可。这样可以节省大量的时间和精力。
批处理示例如下:
Use Master
Go
Go关键字标志着批处理的结束。
另一个示例如下:
Select * from stuInfo
Select * from stuMarks
Update stuMarks set writtenExam = writtenExam + 2
GO
此时,把这3条语句组成一个执行计划,然后再执行。
一般是将一些逻辑相关的业务操作语句,放置在同一批中,这完全由代码编写者决定。但是,SQL Server 规定:如果是创建库、创建表语句,以及我们后面学习的存储过程和视图等,则必须在语句末尾添加“GO”批处理标志,所以前面我们创建表的语句格式如下。
Create Table stuInfo (···) GO
相关推荐
数理统计的第三章主要探讨了假设检验这一关键概念,它是统计推断的重要组成部分,用于根据样本数据来判断总体参数是否符合预设的假设。在实际应用中,假设检验经常被用来验证研究假设或者比较不同处理的效果。 1. ...
第三章通常涵盖了线性时不变系统(LTI系统)的分析方法,包括卷积积分、傅里叶变换、拉普拉斯变换及其在系统分析中的应用。以下是对该章节涉及的关键知识点的详细解析: ### 1. 线性时不变系统(LTI系统) 线性时...
信号与系统第三章课件 本节课件主要讲解了信号与系统的第三章内容,具体来说是关于傅立叶级数的表示。傅立叶级数是指对周期信号进行分解,得到一系列谐振频率的信号,称为傅立叶级数。 3.1 连续时间系统 连续时间...
第3章 T/TCP使用举例 …… 第二部分 TCP的其他应用 第13章 HTTP;超文本传送协议 第14章 在HTTP服务器上找到的分组 第15章 NNTP:网络新闻传送协议 第三部分 Unix 域协议 第16章 Unix域协议:概述 第17章 Unix域协议...
《原子物理学》是杨福家教授编著的一本经典教材,第三章主要涉及量子力学的基础概念,特别是关于粒子的能量、动量以及波长的计算。以下是根据提供的部分内容解析的几个关键知识点: 1. 德布罗意波长:德布罗意波长...
【标题】"accp5.0 C#第三章"涵盖了C#编程语言在北大青鸟教育体系中的第五个版本的第三个学习章节。这个章节可能是深入讲解C#的基础知识,包括但不限于变量、数据类型、控制流、函数、类与对象等核心概念。 【描述】...
《数字逻辑》第三章主要探讨了存储和控制数字信号稳定性的关键元件——锁存器和触发器,以及基于这些元件构建的各种数据处理单元,如寄存器和计数器。本章内容对于理解和设计数字系统至关重要。 首先,锁存器(如SR...
《信号与系统》是电子工程、通信工程以及自动化等相关专业的重要基础课程,第三章通常涉及的是线性时不变系统(LTI系统)及其分析方法。本章内容在深入理解信号处理和系统分析方面起着至关重要的作用。以下是对第三...
本文将结合《蒋立源编译原理第三版第三章习题与答案(修改后).pdf》的内容,深入探讨这些基本概念,并展示如何解决第三章中的具体习题。 首先,文法是定义语言结构的一种形式体系。在编译原理中,文法用于描述编程...
"数字图像处理第三章ppt" 数字图像处理第三章ppt主要讲解了图像的变换,包括图像增强(image enhancement)、空间域处理、频率域处理、亮度变换函数、灰度级变换空域增强等方面的知识点。 图像增强的目的:改进...
《第三章 模拟调制系统》 模拟调制系统是通信工程中的核心概念,它涉及到将低频的基带信号转换为适合信道传输的高频信号。在这一过程中,调制是关键步骤,通过调整载波信号的某些参数(如幅度、频率或相位)以跟随...
【北大青鸟ACCP5.0c#课件第三章】是北大青鸟教育机构针对C#编程语言开设的一门课程的重要组成部分。该课件详细介绍了C#的基础知识和进阶概念,旨在帮助学员深入理解和掌握这门强大的编程语言。在这一章中,学员将...
根据给定文件的信息,我们可以总结出以下相关的IT知识点: ...以上是对电工学第六版(秦曾煌)第三章习题答案的相关知识点的详细解析,包括了暂态分析的基本原理、换路定律的应用以及具体的习题解答步骤。
### 计算机网络自顶向下课本 第七版第三章习题解答 #### R3: 源端口号与目的端口号 - **知识点解析**:在网络通信中,每个TCP/IP连接都由一对端口号唯一标识,即源端口号和目的端口号。源端口号是由发起连接的...
这个压缩包包含了第一章至第三章的上机实践阶段的源代码以及指导学习1阶段的练习代码,对于想要自学或者巩固C#编程技能的人来说,是一份非常实用的学习资料。 首先,我们来详细了解这三个章节的知识点: **第一章...
针对你提到的“第三第四章”的答案,我们可以深入探讨这两章涉及的主要知识点。 第三章通常会集中在逻辑门电路和组合逻辑电路的设计上。这一章首先介绍了基础的逻辑门,包括与门、或门、非门以及它们的复合门,如与...
为此,我们可以采用信号分解的方法,即将复杂的激励信号分解为一些基本的单元信号,如冲激信号(δ(t))、阶跃信号(u(t))、指数信号(e^(-at))和正余弦信号(cos(ωt)或sin(ωt))的线性叠加。这样做可以利用线性...
### 第三章 时序逻辑 时序逻辑关注的是在时间序列中变化的信号处理,主要包括寄存器、计数器、移位寄存器等。 **3. 时序逻辑器件** - **寄存器**:能存储数据的电路,如D触发器、T触发器等,它们保持状态直到接收...
三、T-S 模型的辨识算法 T-S 模型的辨识算法包括:前件参数辨识、后件参数辨识和结构辨识。前件参数辨识是指确定隶属函数的参数;后件参数辨识是指确定输出函数的参数;结构辨识是指确定系统的结构。 T-S 模型的...