SQL Server 编程语言T-SQL
- 4.1.1 变量
- 4.1.2 显示信息
- 4.1.3 注释语句
- 4.1.4 批处理
- 4.1.5 流程控制语句
4.1.1 变量
- 定义:
- 变量是SQL Server 中由系统或用户定义的可赋值的条件,分为全局变量和局部变量。
- 全局变量不能由用户定义,也不能被显示地赋值或声明(修改),其名称以两个@字符(即@@)开头。
- 局部变量可由用户自己定义,格式如下:
- 声明格式:
- 格式:
Declare @局部变量名 数据类型[, @局部变量名 数据类型 ,···]
在同一个Declare语句中可以同时声明多个变量,变量之间用逗号隔开。 - 例子:
Declare @variable1 int,@variable2 datetime
- 赋值语句:
- 赋值语句SET:
采用SET语句的语法格式为:
SET @变量名 = 表达式 - 赋值语句SELECT:
采用SETECT语句的语句格式为:
SELECT @变量名 = 表达式
或
SELECT @变量名 = 列名或表达式[,@变量名2 = 列名或表达式, ···]
FROM 表名
条件表达式 - 注意:如果SELECT语句返回多个数值,则局部变量取最后一个返回值。
- 举例:从表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语句:
- 作用:
PRINT语句用于在指定设备上(显示器)显示信息,可以显示ASCⅡ字符串或变量,可以输出的数据类型只有char,nchar,varchar,nvarchar,所输出的字符串可以用“+”连接。 - 例子:
PRINT ‘你好,现在是’+CAST(year(getdate())as varchar(10))+‘年!’; - 注意:
使用PRINT语句只能显示字符数据类型,如果是非字符类型,则需要**使用COUVERT()或者CAST()**函数进行转换。
- RAISERROR语句:
- 作用:
RAISERROR语句用于在SQL Server返回错误消息的同时返回用户指定的信息,它设置了一个系统标记,记录产生的错误。 - 语法:
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语句:
- 描述:
使用BEGIN···END语句可以将多条SQL语句封装起来,形成一个语句块,使这些语句作为一个整体执行。 - 格式:
BEGIN
语句
···
END
- IF···ELSE语句:
- 描述:
IF···ELSE语句是条件判断语句,根据表达式的真假选择执行某个语句或者语句块。 - 语法:
IF 条件表达式
语句
[ELSE[IF 条件表达式]
语句]
- 例子:在电力抢修工程数据库中,如果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
- 注意:IF语句常与关键字exists 结合使用,用于检测是否存在满足条件的记录,只要检测有一行记录存在就为真。
- WHILE循环语句:
- 描述:
在WHILE语句中,还可以使用BREAK和CONTINUE使程序从循环中跳出。BREAK语句在程序中跳出以后接着执行END后面的第一条语句。CONTINUE语句使程序跳过循环内COUNTUNE语句后面的语句,重新判断逻辑条件,如果满足条件,则重新执行循环体内的SQL语句。 - 语法:
WHIlE 逻辑表达式
语句
- 例子:将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语句:
- 描述:
使用GOTO语句可以使SQL语句的执行流程无条件地转移到指定的标号位置,GOTO语句和标号可以用在用户巨快,批处理和存储过程中,标号的命名符合标识符命名规则。GOTO语句经常用在WHILE和IF语句中,以跳出循环或分支处理。 - 语法:
GOTO lable
···
lable;
- WAITFOR语句:
- 描述:
WAITFOR语句可以在某一个时刻或某一个时间间隔之后执行SQl语句、语句块、存储过程等。 - 语法:
WAITFRO{DELAY'时间’|TIME‘时间’}
其中,DELAY表示等候由“时间‘参数指定的时间间隔;TIME表示等候到指定的”时间“为止。
时间参数的数据类型为datetime,但不带日期,格式为”hh.mm.ss“。
- 例子:使用WAITFOR语句表示等候一分钟后显示Stock表,等到12:00:00时显示Salvaging表。
WAITFOR DELAY '00:01:00'
SELECT *
FROM Stock
WAITFOR TIME '12:00:00'
SELECT *
FROM Salvaging
- CASE语句:
- 描述:
CASE语句用于根据多个分支条件确定执行内容。CASE语句列出一个或多个分支条件,并对每个分支条件给出候选值。
然后按顺序测试分支条件是否得到满足,一旦有一个分支条件满足,CASE语句就将该条件对应的候选值返回。 - 格式一:
CASE<表达式>
WHEN<条件表达式1>THEN<表达式1>
[WHEN<条件表达式2>THEN<表达式2>[···]]
[ELSE<表达式n>]
END
- 格式一例子:用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
- 格式二:
CASE
WHEN<条件表达式1>THEN<表达式1>
[WHEN<条件表达式2>THEN<表达式2>[···]]
[ELSE<表达式n>]
END
- 格式二例子:
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语句:
- 描述:
RETURN语句可以使程序从查询或存储过程返回,使用RETURN语句可以立即从当前程序结构中退出,并且RETURN后面的语句不再执行。 - 语法:
RETURN 整型表达式
- 使用情况:
一般情况下,只有存储过程中才回用到返回的整型结果,调用存储过程的语句可以根据RETURN返回的值判断下一步应该执行的操作。