2-1 T-SQL概述
u T-SQL代码的基本格式及注释
u T-SQL语法全局变量与局部变量
u T-SQL的临时表和全局表
u T-SQL的运算符号
T-SQL就是Transact-SQL,是标准 SQL 在MSSQL环境下程式设计语言的增强版,它是用来让应用程式与SQL Server沟通的主要语言。T-SQL提供标准SQL的DDL和 DML功能,加上延伸的函数、系统预存程序以及程式设计结构(例如IF和WHILE)让程式设计更有弹性,T-SQL的功能随著新版的SQL Server而持续成长。
2-1-1 格式化的T-SQL代码
T-SQL的批处理是一组的扩展SQL语句,在一个批处理中可以包含一条或多条Transact-SQL语句,成为一个语句组。两个GO之间的SQL语句作为一个批处理,见图2-1所示。这样的语句组从应用程序一次性地发送到SQL Server服务器进行执行。SQL Server服务器将批处理编译成一个可执行单元,称为执行计划。

图2-1 基本批处理是以GO语句为标识点
1. 注释
注释是程序代码中不执行的文本字符串(也称为注解)。使用注释对代码进行说明,不仅能使程序易读易懂,而且有助于日后的管理和维护。注释通常用于记录程序名称、作者姓名和主要代码更改的日期。注释还可以用于描述复杂的计算或者解释编程的方法。
在SQL Server中,可以使用两种类型的注释字符:
(1)单行注释:
该方法是ANSI标准的注释符“--”,它用于单行注释;
(2)多行注释:
该种方法是与C语言相同的程序注释符号,即“/* */”。“/*”用于注释文字的开头,“*/”用于注释文字的结尾,利用它们可以在程序中标识多行文字为注释。当然,单行注释也可以使用“/* */”,我们只需将注释行以“/*”开头并以“*/”结尾即可。反之,段落注释也可以使用“--”,只需使段落注释的每一行都以“--”开头即可。
实验:建立第一个T-SQL实验
首先,我们建立公司数据库sample,该数据库的基本表逻辑结构如图2-2所示。

图2-2 Sample数据库的基本表
Use sample --该批处理执行打开数据库sample
Go /*批处理结束标志*/
--该批处理检索项目部员工
Select * From 员工数据表 Where 所属部门=’项目部’ and 工资>2000 Order by 姓名
Go/*批处理结束标志*/
--下面的批处理创建视图
Create view PM_View
As
Select * from 员工数据表 where 所属部门=’项目部’
Go
2. 结束TSQL语句的标准
TSQL标准规定在每个命令行末尾使用分号结束该部分的批处理TSQL语句,但需要注意的是,TSQL编码时候分号是可选择的,但是请不要在下面的位置使用分号:
(1) 不要在try end后面添加分号
(2) 不要在if语句后面添加分号
(3) 必须在SET之前添加分号
2-1-2 T-SQL语法变量
变量是一种语言中必不可少的组成部分。Transact-SQL语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量。
1. 全局变量
SQL Server系统本身就提供了一些全局变量。全局变量是SQL Server系统内部使用的变量,其作用范围并不仅仅局限于某一程序,而是任何程序均可以随时调用。全局变量通常存储一些SQL Server的配置设定值和统计数据。用户可以在程序中用全局变量来测试系统的设定值或者是Transact-SQL命令执行后的状态值。在使用全局变量时应该注意以下几点:
(1) 全局变量不是由用户的程序定义的,它们是在服务器定义的。
(2) 用户只能使用预先定义的全局变量。
(3) 引用全局变量时,必须以标记符“@@”开头。
(4) 局部变量名称不能与全局变量名称相同,否则会在应用程序中出现不可预测的结果。
表2-1 基本全局变量含义表
全局变量名
|
含义
|
@@ERROR
|
最后一个T-SQL错误的错误号
|
@@IDENTITY
|
最后一次插入的标识值
|
@@LANGUAGE
|
当前使用的语言的名称
|
@@MAX_CONNECTIONS
|
可以创建的同时连接的最大数目
|
@@ROWCOUNT
|
受上一个SQL语句影响的行数
|
@@SERVERNAME
|
本地服务器的名称
|
@@TRANSCOUNT
|
当前连接打开的事务数
|
@@VERSION
|
SQL Server的版本信息
|
SQL-sever提供的全局变量共有33个,但是并不是每一个都会经常用到,基本的全局变量见表2-1所示。下面举例说明部分全局变量的用法:
实验: T-SQL全局变量实验
Use sample
Go
--例1:检测限制检查冲突
--将项目部的工资更新为
Update 员工数据表 Set 工资=3000 where 所属部门='项目部'
--检查是否出现限制检查冲突
If @@ERROR=547
print '出现限制检查冲突,请检查需要更新的数据'
--@@ERROR全局变量将返回最后执行的T-SQL语句的错误代码,数据类型为integer,如果成功@@ERROR返回0,否则返回错误代码。有关错误代码的信息请在sysmessages系统表中查找。
-- print关键词是打印输出的语句,既可以输出“字符串”或者“字符串常量”或者“字符串变量”
--例如:Print '你好吗?'
Print @@version
--例2:全局变量@@CONNECTIONS,检测连接次数
SELECT GETDATE( ) AS '当前的时期和时间', @@CONNECTIONS AS '试图登录的次数'
--例3:全局变量@@RowCount的用法
--@@RowCount全局变量用以判别查询是否成功,并返回查询到的行数。
Use school
GO
update student set sname='叮当' where sname='老叮当';
if @@rowcount=0
begin
print '没有修改任何行'
End
2. 局部变量
局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内部。局部变量被引用时要在其名称前加上标志“@”,而且必须先用DECLARE命令定义后才可以使用。
(1) 定义局部变量的语法形式如下:
DECLAER {@local_variable data_type} […n]
其中,参数@local_variable用于指定局部变量的名称,变量名必须以符号@开头,并且局部变量名必须符合SQL Server的命名规则。参数data_type用于设置局部变量的数据类型及其大小。data_type可以是任何由系统提供的或用户定义的数据类型。但是,局部变量不能是 text,ntext 或 p_w_picpath 数据类型。
(2) 定义局部变量的语法形式如下:
使用DECLARE命令声明并创建局部变量之后,会将其初始值设为NULL,如果想要设定局部变量的值,必须使用SELECT命令或者SET命令。两种语法形式为:
q SET { { @local_variable = expression }
q SELECT { @local_variable = expression }[ ,...n ]
其中,参数@local_variable是给其赋值并声明的局部变量,参数expression是任何有效的SQL Server表达式。
实验: T-SQL局部变量实验
--例1、通过SET进行附值实验
Use school
go
declare @char1 float,@num char(40)
select @char1=max(degree) from score,course where cname='高等数学' and score.cno=course.cno
set @num='高等数学的最高成绩是:'
print @num+Ltrim(STR(@char1)) --str函数的作用是将数值类型转换成为char类型;Ltrim函数是去除左边空格。
--问题说明:如果高等数学的最高成绩查询为空,则执行‘print @num+STR(@char1)’语句后显示为空,表示空值与字符串拼接后显示信息也为空。
--例2、通过SELECT进行附值,需要注意的事项是:
(1)如果查询之中select返回多个值,则仅仅将最后一个数值附值给变量
(2)如果没有返回值则保持当前的变量值
use school
go
declare @cc1 nvarchar(32)
select @cc1=sno from score
print @cc1 --此句话可以将局部变量@cc1正常显示出来
Go
print @cc1
--由于已经执行Go语句,批处理结束,因此此句话执行错误,@cc1局部变量生命周期已经结束
--例3、通过SELECT进行附值
declare @var1 nvarchar(30)
set @var1='张飞'
select @var1=sname from student where sno='0000'
print @var1
--0000编号的学生是没有的,此时@var1将显示初始值“张飞”,如果有则显示查询到的信息
select @var1=sname from student where sno='101'
print @var1
--例4、通过SELECT进行附值
Use sample --调用sample数据库
Go
--开始声明局部变量
Declare @max_salary int
--将其赋值为全体员工的工资最大值
Select @max_salary=max(工资) from 员工数据表
Go
--注意:局部变量的作用范围是从声明该局部变量的地方开始到声明局部变量的批处理或存储过程的结尾。在局部变量的作用范围以外引用该局部变量将引起语法错误。
2-1-3 临时表和全局表
除了基本表和视图意外,SQL Server还提供临时表和全局表供数据库访问者进行访问操作,从本质上来说,临时表和全局表都属于虚表,其生命周期视用户访问情况而生成或者消失,唯一不同的是为建立者提供数据临时访问,还是为所有数据库访问用户提供临时的访问。
1. 局部临时表
SQL Server支持局部临时表(简称临时表)。临时表就是那些名称以井号(#)开头的表。如果当用户断开连接时没有除去临时表,SQL Server将在一定时间后自动除去临时表。临时表不存储在当前数据库内,而是存储在系统数据库tempdb内。
局部临时表的创建方法与用户表相同,其生命周期自批处理开始生成,自该批处理结束终止,该临时表将从tempdb库中被删除。局部临时表往往在存储过程开发中被设计,至该存储过程结束终止。
实验: T-SQL建立局部临时表实验
--例1:
create table #stupass
( sno int primary key, sname varchar(20), sdegree int, cname varchar(20));
2. 全局临时表
以两个井号(##)开头的那些表名,在所有连接上都能够访问到的表就是全局临时表。如果在创建全局临时表的连接断开前没有显式地除去这些表,那么只要所有其它任务停止引用它们,这些表即被除去。当创建全局临时表的连接断开后,新的任务不能再引用它们。当前的语句一旦执行完,任务与表之间的关联即被除去;因此通常情况下,只要创建全局临时表的连接断开,全局临时表即被除去。
实验: T-SQL建立全局临时表实验
--例1:
create table ##stupass1
( sno int primary key, sname varchar(20), sdegree int, cname varchar(20));
3. 全局临时表和局部临时表的差异:
二者在名称、可见性和可用性上均不相同。本地临时表的名称以单个数字符号(#)打头;它们仅对当前的用户连接是可见的;当用户从SQL Server实例断开连接时被删除。全局临时表的名称以符号(##)打头,创建后对任何用户都是可见的,当所有引用该表的用户从SQL Server断开连接时被删除。
例如,如果创建名为employees的表,则任何人只要在数据库中有使用该表的安全权限就可以使用该表,除非它已删除。如果创建名为 #employees的本地临时表,只有您能对该表执行操作且在断开连接时该表删除。如果创建名为##employees的全局临时表,数据表中的任何用户均可对该表执行操作。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果该表在您创建后有其他用户使用,则SQL Server在所有用户断开连接后删除该表。
2-1-4 运算符
运算符是一些符号,它们能够用来执行算术运算、字符串连接、赋值以及在字段、常量和变量之间进行比较。在SQL Server 2005中,运算符主要有以下六大类:算术运算符、赋值运算符、位运算符、比较运算符、逻辑运算符和字符串串联运算符。
1. 算术运算符
算术运算符可以在两个表达式上执行数学运算,这两个表达式可以是数字数据类型分类的任何数据类型。算术运算符包括加(+)、减(-)、乘(*)、除(/)和取模(%)。
2. 赋值运算符
Transact-SQL 中只有一个赋值运算符,即(=)。赋值运算符使我们能够将数据值指派给特定的对象。另外,还可以使用赋值运算符在列标题和为列定义值的表达式之间建立关系。
3. 位运算符
位运算符使我们能够在整型数据或者二进制数据(p_w_picpath 数据类型除外)之间执行位操作。此外,在位运算符左右两侧的操作数不能同时是二进制数据。表2-2列出了所有的位运算符及其含义。
表2-2 位运算符
运算符
|
含义
|
&(按位 AND)
|
按位 AND(两个操作数)
|
|(按位 OR)
|
按位 OR(两个操作数)
|
^(按位互斥 OR)
|
按位互斥 OR(两个操作数)
|
4. 比较运算符
比较运算符亦称为关系运算符,用于比较两个表达式的大小或是否相同,其比较的结果是布尔值,即TRUE(表示表达式的结果为真)、FALSE(表示表达式的结果为假)以及UNKNOWN。除了text,ntext 或 p_w_picpath 数据类型的表达式外,比较运算符可以用于所有的表达式。
5. 逻辑运算符
逻辑运算符可以把多个逻辑表达式连接起来。逻辑运算符包括AND、OR和NOT等运算符。逻辑运算符和比较运算符一样,返回带有 TRUE 或 FALSE 值的布尔数据类型。 三个运算符的优先级别为:NOT,AND,OR。
6. 字符串串联运算符
字符串串联运算符允许通过加号(+)进行字符串串联,这个加号即被称为字符串串联运算符。例如对于语句SELECT ’abc’+’def’,其结果为abcdef。
7. 运算符的优先级
在SQL Server 2005中,运算符的优先等级从高到低如下所示,如果优先等级相同,则按照从左到右的顺序进行运算。
(1) 括号:();
(2) 乘、除、求模运算符:*,/,%;
(3) 加减运算符:+,-;
(4) 比较运算符:=,>,<,>=,<=,<>,!=,!>,!<;
(5) 位运算符:^,&,|;
(6) 逻辑运算符:NOT;
(7) 逻辑运算符:AND;
(8) 逻辑运算符:OR。