9.2.2 T-SQL语言基础
(1)标识符
数据库对象的名称即为其标识符,如表、视图、列、索引、触发器、过程、约束及规则等的名称。标识符的命名规则如下:
以英文字母、汉字、_(下画线)、@或者#开头的字符组合。但不能包含空格,不能是SQL Server的保留字和其他特殊字符。
以@@开头的标识符为系统全局变量,以##开头的标识符是系统全局临时对象,都具有特殊意义。
(2)常量
常量是其值不会发生变化的量,是代表一个特定数据值的符号。不同数据类型的常量,其表示格式不同。
1)字符串常量
字符串分为ASCII类型和Unicode类型。ASCII类型的每个字符用一个字节存储,而Uni-code类型用两个字节存储。
ASCII字符常量括在单引号内并包含字母数字字符(a~z,A~Z和0~9)以及特殊字符,如感叹号(!)、at符(@)和数字号(#)。例如,′chongqing′′计算机′′C03′和′′(空字符)等。
Unicode字符的格式与普通字符相似,但它前面有一个大写N字母作为标识符。例如,′Michél′是字符串常量而N′Michél′则是Unicode常量。
2)位类型常量
位(Bit)类型常量使用数字0或1表示,并且不括在引号中。如果使用一个大于1的数字,则该数字将转换为1。
3)日期时间型常量
日期时间型(Datetime)常量使用特定格式的字符日期值来表示,并被单引号括起来。例如,′2013-02-28 9:05:19 AM′、′2013-02-28′、′9:05:19 AM′。可见,日期时间型常量可以包括时期和时间,也可以只有日期或时间。
4)十进制数值型常量
整型(Integer)常量是不包含小数点的一串数字,如13,768。浮点(Float)常量和实型(Re-al)常量是包含小数点的数字,用科学计数法来表示,如34.5E-3,1.02E2等。Decimal类型是包含小数点的数字,如123.45,3.141 59。
5)二进制数常量
二进制常量具有前辍0x并且是十六进制数字字符串。如0x12ED,oxBA等。
(3)变量
变量是那些在程序运行中其值可能发生变化的量。变量分为全局变量(也称系统变量)和局部变量。系统全局变量是由SQL Server预先定义,用于系统跟踪特定信息。用户可以引用它们,但不能显式地改变其值。系统变量以两个@符号开头,如@@VERSION(它返回系统版本)。系统变量的种类及其详情请参见联机手册等资料。
局部变量由用户定义、作用域为一定的局部区域内,作为程序中临时保存数据的对象。
1)局部变量的声明
局部变量必须遵循先定义、后使用的原则。声明局部变量的基本语法为:
DECLARE{@变量名1 [AS]数据类型}[,爥n]
注意:局部变量名必须以一个@开头,后跟其他字符构成合法的标识符;变量的类型不允许是text,ntext和image。局部变量声明后其初始值是NULL。
2)局部变量赋值
局部变量可使用SET或SELECT两个命令来赋值。其语法格式如下:
SET {@变量名=表达式}
或
SELECT{@变量名=表达式[,爥n]}
说明:
一个SET语句只能给一个变量赋值,而一个SELECT语句可以给多个变量赋值。
SET将值直接赋予变量,而SELECT是先查询值,然后赋予变量。如果查询无返回值则变量的值不变;若查询的结果是多个值,则仅将最后一个值赋予变量,如图9.6所示。

图9.6 SELECT将查询结果中最后一个值赋予变量
能从student表中查出的学生姓名有若干个,但只把结果集的最后一个赋予给了变量@ssn。
(4)函数
函数是具有某种特定功能并返回处理结果的程序。SQL Server提供了大量内置函数,也允许用户定义自己的函数。SQL Server中的常用的内置函数有字符串函数、日期时间函数、数学函数、聚合函数、游标函数等13类。下面分类介绍一些最常用的函数。
1)字符串函数
①ASCII(ch)和CHAR(num)
ASCII()函数返回字符串ch的第一个字符的ASCII值。CHAR(num)函数返回以整型值num为ASCII值的字符。例如,ASCII(‘Chongqing’),返回值为67。CHAR(89)的返回值为‘Y’。
②LEFT(ch,len)和RIGHT(ch,len)
分别返回给定字符串ch左起和右起指定长度len的子字符串。例如,LEFT(′CHONGQING′,5)返回′CHONG′。RIGHT(′CHONGQING′,4)返回′QING′。
③SUBSTRING(ch,start,len)
返回字符串ch中左起start位开始、长度len位的子字符串。例如,SUBSTRING(′中国重庆市′,3,2)返回结果为′重庆′。
④LTRIM(ch)和RTRIM(ch)
LTRIM(ch)去除给定字符串ch前面的所有空字符,RTRIM(ch)去除给定字符串ch末尾的空字符。
⑤UPPER(ch)和LOWER(ch)
UPPER(ch)将字符串ch中的小写字母转换为对应的大写字母,LOWER(ch)将字符串ch中大写字母转换为对应的小写字母。
⑥STR(num)
将数字num转换为数字字符。例如,Ltrim(STR(785))返回′785′。
⑦LEN(ch)函数
返回给定字符串ch的长度(即字符个数)。
2)日期时间函数
①GETDATE()
返回系统当前日期时间,注意括号中为空。
②YEAR(),MONTH()和DAY()
分别返回给定日期时间中的年份、月份和日期数值(整型值)。例如,YEAR(′2013-09-19′),MONTH(′2013-09-19′)和DAY(′2013-09-19′)的返回值分别是2013,9和19。
③DATEADD()
返回给定日期时间加上一个日期时间间隔后的日期、时间。例如,dateadd(mi,25,′2013-09-19 12:15:00′)的结果为′2013-09-19 12:40:00′。
说明:该函数的第一个参数是一个datepart变元。常用的datepart变元见表9.1。
表9.1 datepart取值表

④Datepart()
Datepart(datepart,datetime)返回给定日期时间datetime中由时间变元所指定的部分,类型为整型数。例如,datepart(yy,′2013-04-12 12:15:00am′)返回2013,而datepart(w,′2013-04-12 12:15:00am′)返回值为6(即星期五)。
⑤Datename()
Datename(datepart,datetime)返回给定日期时间datetime中由时间变元所指定的部分,类型为字符型。例如,datename(mm,′2013-04-12 12:15:00am′)返回′04′。
⑥Datediff()
该函数的使用格式为datediff(datepart,date1,date2),用于计算date2减去date1后的日期时间差,并以datepart指定的时间变元返回相应的值。例如,datediff(mm,′2012-04-10′,′2013-04-10′)返回值12。
3)数学函数
数学函数包括计算三角函数值、反三角函数、对数、平方根及绝对值等。
4)类型转换函数CAST()和CONVERT()
它用于显式转换数据类型。其语法格式如下:
CAST(表达式AS数据类型[(长度)])
或
CONVERT(数据类型[(长度)],表达式[,样式])
例如,datepart(mm,′1920-04-02′)+′月′,字符串′月′不能与整型数相加。执行时会报错。可将整型数转成字符串′04′然后与′月′连接成一个字符串,如图9.7所示。