SQL Server 编程语言T-SQL

  • 4.1.1 变量
  • 4.1.2 显示信息
  • 4.1.3 注释语句
  • 4.1.4 批处理
  • 4.1.5 流程控制语句


4.1.1 变量

  • 定义
  1. 变量是SQL Server 中由系统或用户定义的可赋值的条件,分为全局变量局部变量
  2. 全局变量不能由用户定义,也不能被显示地赋值或声明(修改),其名称以两个@字符(即@@)开头
  3. 局部变量可由用户自己定义,格式如下:
  • 声明格式
  1. 格式
    Declare @局部变量名 数据类型[, @局部变量名 数据类型 ,···]
    在同一个Declare语句中可以同时声明多个变量,变量之间用逗号隔开。
  2. 例子
Declare @variable1 int,@variable2 datetime
  • 赋值语句
  1. 赋值语句SET:
    采用SET语句的语法格式为:
      SET @变量名 = 表达式
  2. 赋值语句SELECT
    采用SETECT语句的语句格式为:
      SELECT @变量名 = 表达式

      SELECT @变量名 = 列名或表达式[,@变量名2 = 列名或表达式, ···]
      FROM 表名
      条件表达式
  3. 注意如果SELECT语句返回多个数值,则局部变量取最后一个返回值。
  4. 举例:从表S中查询学号为‘S7’的学生的学号和姓名,并将查询的学号和姓名分别复制给@sno和@sn
declare @sno varchar(20),@sn varchar(10)
select @sno=studentno,@sn=name
from s
where studentno='S7';

4.1.2 显示信息

  • 概念
    在执行SQL语句的过程中,如果需要为用户或应用程序提供信息,则可以使用PRINT语句或RAISERROR语句。
  • PRINT语句
  1. 作用
    PRINT语句用于在指定设备上(显示器)显示信息,可以显示ASCⅡ字符串或变量,可以输出的数据类型只有char,nchar,varchar,nvarchar,所输出的字符串可以用“+”连接。
  2. 例子
    PRINT ‘你好,现在是’+CAST(year(getdate())as varchar(10))+‘年!’;
  3. 注意
    使用PRINT语句只能显示字符数据类型,如果是非字符类型,则需要**使用COUVERT()或者CAST()**函数进行转换。
  • RAISERROR语句:
  1. 作用:
    RAISERROR语句用于在SQL Server返回错误消息的同时返回用户指定的信息,它设置了一个系统标记,记录产生的错误。
  2. 语法:
    RAISERROR(<错误号>|<‘错误消息’>,[严重度][,状态[,参数1][,参数2]])
    错误号是整型表达式,是用户指定的错误或信息号,取值范围为50 000~2 147 483 647,最后一个错误代码存储在全局变量@@ERROR中。错误信息用于指定用户定义的错误信息,文本最长为255个字符,严重度默认为16。

4.1.3 注释语句

  • 语法:
    /* 注释文本*/(多行注释)  或  - - 注释文本(单行注释)

4.1.4 批处理

  • 定义
    批处理系统是包含一个或多个T-SQL语句的组(成组执行),批处理的所有语句被整合成一个执行计划。
  • go语句
    批处理是使用GO语句表示批处理的技术。
    GO语句用于指定批处理语句的介绍处,单独占一行。

4.1.5 流程控制语句

  • BEGIN···END语句:
  1. 描述
      使用BEGIN···END语句可以将多条SQL语句封装起来,形成一个语句块,使这些语句作为一个整体执行。
  2. 格式
BEGIN
	语句
	···
END
  • IF···ELSE语句:
  1. 描述
      IF···ELSE语句是条件判断语句,根据表达式的真假选择执行某个语句或者语句块。
  2. 语法
IF 条件表达式
	语句
[ELSE[IF 条件表达式]
	语句]
  1. 例子:在电力抢修工程数据库中,如果Stock表中存在库存量低于1的物资,就显示文本“the amount is not enough!”,否则显示所有物资信息。其语法形式如下:
IF exists (Select * from Stock where amount < 1 )
	PRINT ' the amount is not enough! '
ELSE
	begin
		SELECT * 
		FROM Stock
	end
  1. 注意:IF语句常与关键字exists 结合使用,用于检测是否存在满足条件的记录,只要检测有一行记录存在就为真。
  • WHILE循环语句:
  1. 描述
      在WHILE语句中,还可以使用BREAK和CONTINUE使程序从循环中跳出。BREAK语句在程序中跳出以后接着执行END后面的第一条语句。CONTINUE语句使程序跳过循环内COUNTUNE语句后面的语句,重新判断逻辑条件,如果满足条件,则重新执行循环体内的SQL语句。
  2. 语法
WHIlE 逻辑表达式
	语句
  1. 例子:将Stock表中所有物资的单价增加10%,直到有一个物资单价超过15000或单价总和超过50000为止。其语法形式如下:
WHILE (SELECT SUM(unit) FROM stock)<50000
BEGIN 
	UPDATE stock SET nuit = unit * 1.1
	IF EXISTS (SELECT * FROM stock WHERE unit > 15000)
		Break
	ELSE
		CONTINUE
END
  • GOTO语句:
  1. 描述
      使用GOTO语句可以使SQL语句的执行流程无条件地转移到指定的标号位置,GOTO语句和标号可以用在用户巨快,批处理和存储过程中,标号的命名符合标识符命名规则。GOTO语句经常用在WHILE和IF语句中,以跳出循环或分支处理。
  2. 语法
GOTO lable
···
lable;
  • WAITFOR语句:
  1. 描述
      WAITFOR语句可以在某一个时刻或某一个时间间隔之后执行SQl语句、语句块、存储过程等。
  2. 语法
WAITFRO{DELAY'时间’|TIME‘时间’}

其中,DELAY表示等候由“时间‘参数指定的时间间隔;TIME表示等候到指定的”时间“为止。
时间参数的数据类型为datetime,但不带日期,格式为”hh.mm.ss“。
  1. 例子:使用WAITFOR语句表示等候一分钟后显示Stock表,等到12:00:00时显示Salvaging表。
WAITFOR DELAY '00:01:00'
SELECT *
FROM Stock


WAITFOR TIME '12:00:00'
SELECT *
FROM Salvaging
  • CASE语句:
  1. 描述
    CASE语句用于根据多个分支条件确定执行内容。CASE语句列出一个或多个分支条件,并对每个分支条件给出候选值。
    然后按顺序测试分支条件是否得到满足,一旦有一个分支条件满足,CASE语句就将该条件对应的候选值返回。
  2. 格式一
CASE<表达式>
	WHEN<条件表达式1>THEN<表达式1>
	[WHEN<条件表达式2>THEN<表达式2>[···]]
	[ELSE<表达式n>]
END
  1. 格式一例子:用CASE语句的格式一实现:在堆Stock表的查询中,当仓库号的值是“供电局1#仓库”、“供电局2#仓库”、“供电局3#仓库”时分别返回“北京”、“上海”、“广州”,否则返回“未知”。
SELECT mat_num,mat_name,speci,warehouse=CASE warehouse
	WHEN '供电局1#仓库' THEN '北京'
	WHEN '供电局2#仓库' THEN '上海'
	WHEN '供电局3#仓库' THEN '广州'
	ELSE '未知'
	END
,amount,unit,total
FROM Stock
  1. 格式二
CASE
	WHEN<条件表达式1>THEN<表达式1>
	[WHEN<条件表达式2>THEN<表达式2>[···]]
	[ELSE<表达式n>]
END
  1. 格式二例子
SELECT mat_num,mat_name,speci,warehouse=CASE 
	WHEN warehouse='供电局1#仓库' THEN '北京'
	WHEN warehouse='供电局2#仓库' THEN '上海'
	WHEN warehouse='供电局3#仓库' THEN '广州'
	ELSE '未知'
	END
,amount,unit,total
FROM Stock
  • RETURN语句:
  1. 描述
    RETURN语句可以使程序从查询或存储过程返回,使用RETURN语句可以立即从当前程序结构中退出,并且RETURN后面的语句不再执行。
  2. 语法
RETURN 整型表达式
  1. 使用情况
    一般情况下,只有存储过程中才回用到返回的整型结果,调用存储过程的语句可以根据RETURN返回的值判断下一步应该执行的操作。