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

第三章 T-SQL 编程的更多相关文章

  1. 第三章 PL/SQL编程

    3.1 PL/SQL基础知识    3.1.1 什么是PL/SQL?        PL/SQL是结合Oracle过程语言和结构化查询语言的一种扩展语言        3.1.1.1 PL/SQL体系 ...

  2. 简学Python第三章__函数式编程、递归、内置函数

    #cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...

  3. 第三章————用SQL语句操作数据

    第三章————用SQL语句操作数据 *********************新增**************************** 1. insert into 表名(列名1,列名2...) ...

  4. Linux/Unix系统编程手册 第三章:系统编程概念

    本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...

  5. Solidity 文档--第三章:Solidity 编程实例

    Solidity 编程实例 Voting 投票 接下来的合约非常复杂,但展示了很多Solidity的特性.它实现了一个投票合约.当然,电子选举的主要问题是如何赋予投票权给准确的人,并防止操纵.我们不能 ...

  6. ORACLE PL/SQL 实例精解之第三章 PL/SQL中的SQL

    3.1 在PL/SQL中使用DML 在PL/SQL语块中,两种变量赋值a. := 初始化.b. select into语法,PL/SQL语块的声明部分被声明的变量,后期可以使用选择语句进行赋值. 3. ...

  7. Netty学习第三章 Linux网络编程使用的I/O模型

    一.同步阻塞IO:blocking IO(BIO) 1.过程分析: 当进程进行系统调用时,内核就会去准备数据,当数据准备好后就复制数据到内核缓冲器,复制完成后将数据拷贝到用户进程内存,整个过程都是阻塞 ...

  8. Object-C 1.0 第三章:面向对象编程基础知识(OOP)

    1. 间接(indirection)        1.1 变量和间接(使用变量来代替一些数字)        1.2 使用文件名的间接                const  表示一个变量不允许 ...

  9. C语言程序设计:现代方法(第2版)第三章全部习题答案

    前言 本人在通过<C语言程序设计:现代方法(第2版)>自学C语言时,发现国内并没有该书完整的课后习题答案,所以就想把自己在学习过程中所做出的答案分享出来,以供大家参考.这些答案是本人自己解 ...

  10. Java Persistence with MyBatis 3(中文版) 第三章 使用XML配置SQL映射器

    关系型数据库和SQL是经受时间考验和验证的数据存储机制.和其他的ORM 框架如Hibernate不同,MyBatis鼓励开发者可以直接使用数据库,而不是将其对开发者隐藏,因为这样可以充分发挥数据库服务 ...

随机推荐

  1. C#秘密武器之LINQ to SQL

    LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操 ...

  2. 使用tornado实现用户认证

    关于用户的登录状态,一部分的应用程序是采用session实现的. HTTP是一个无状态协议,用户的每次请求都是相互独立的,HTTP本身意识不到用户是否登录. 很多web框架选择将session存放在c ...

  3. Json_decode:详解

    Json_decode:详解 json_decode - 对 JSON 格式的字符串进行编码   mixed json_decode ( string $json [, bool $assoc = f ...

  4. (转)JavaScript: in, hasOwnProperty, delete, for/in

    in 运算符 判断对象是否拥有某一属性只要对象拥有该属性,就会返回true,否则false var point = { x:1, y:1 };alert( 'x' in point );  //tru ...

  5. (六)Oracle学习笔记—— 约束

    1. 约束介绍 表虽然建立完成了,但是表中的数据是否合法并不能有所检查,而如果要想针对于表中的数据做一些过滤的话,则可以通过约束完成,约束的主要功能是保证表中的数据合法性. 按照约束的分类,一共有五种 ...

  6. Easy Explore插件:在eclipse里快速打开文件所在的目录

    下载:easyexplore_1.0.4 安装:把文件”org.sf.easyexplore_1.0.4.jar”文件解压出来,然后复制到eclipse安装目录的”plugins”文件夹里 http: ...

  7. tcp/ip ---数据封装过程

  8. Error: [vuex] vuex requires a Promise polyfill in this browser. 与 babel-polyfill 的问题

    Error: [vuex] vuex requires a Promise polyfill in this browser. 与 babel-polyfill 的问题 采用最笨重的解决方案就是npm ...

  9. Spring Boot(五):Spring Boot的启动器Starter大全及自定义Starter

    现有启动器Starter目录 Spring Boot应用启动器基本的一共有44种,具体如下: 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和 ...

  10. Dart Essentials(读书笔记)——这本书非常大篇幅都在谈AngularDart,Zones概念没谈到

    Dart Essentials 文件夹 1 Getting Started 2 Practical Dart 3 The Power of HTML5 with Dart 4 Developing a ...