1.4 变量
内存中存储的可以变化的量叫作变量。为了在内存中存储信息,用户必须指定存储信息的单元,并为该存储单元命名,以方便获取信息,这就是变量的功能。SQL语句可以使用两种变量:一种是局部变量(Local Variable),另外一种是全局变量(Global Variable)。局部变量和全局变量的主要区别在于存储的数据作用范围不同。
1.4.1 局部变量
局部变量是用户可以自定义的变量,它的作用范围仅限于程序内部。局部变量的名称由用户自行定义,符合标识符命名规则,以@开头。
1.声明局部变量
局部变量的声明需要使用DECLARE语句。语法格式如下:
DECLARE { @varible_name datatype [ ,… n ] }
参数说明如下。
@varible_name:局部变量的名称,必须以@开头,变量名形式符合SQL标识符的命名方式。
datatype:局部变量的数据类型,可以是除text、ntext或者image类型以外所有的系统数据类型和用户自定义数据类型。一般来说,如果没有特殊的用途,建议使用系统提供的数据类型,这样做可以减少维护应用程序的工作量。
例如,声明局部变量@ stuid,SQL语句如下:
DECLARE @stuid int
2.为局部变量赋值
为局部变量赋值的方式一般有两种:一种是使用SELECT语句,一种是使用SET语句。
使用SELECT语句为变量赋值的语法格式如下:
SELECT @varible_name = expression [FROM table_name [ ,… n ] WHERE clause]
参数说明如下。
@varible_name:局部变量的名称。
table_name:数据表的名称。
说明
上面的SELECT语句的作用是为了给变量赋值,而不是为了从表中查询数据。使用SELECT语句赋值时,不一定非要使用FROM关键字和WHERE子句。
【例1.3】 把查询内容赋值给局部变量。(实例位置:资源包\TM\sl\1\3)
在db_mrsql数据库中,使用SELECT查询学生姓名是“田丽”的学生所在班级的信息情况,并将查询到的信息赋值给局部变量@class,并把该局部变量的值用PRINT关键字显示出来。SQL语句如下:
use db_mrsql --使用db_mrsql数据库 DECLARE @class varchar(20) --声明一个局部变量 SELECT @class=班级 FROM tb_student WHERE 姓名='田丽' PRINT '田丽同学所在班级为:'+@class --使用PRINT关键字显示局部变量的值
执行此SQL语句,运行结果如图1.4所示。
图1.4 把查询内容赋值给局部变量
除以上SELECT语句的应用外,还需要注意SELECT语句赋值和查询不能混淆。
例如,声明一个局部变量@ b,使用SELECT关键字为该变量赋值,SQL语句如下:
DECLARE @b int --声明一个局部变量名是@b SELECT @b=1 --使用SELECT关键字为该变量赋值
另一种为局部变量赋值的方式是使用SET语句。使用SET语句对变量赋值的常用语法如下:
{ SET @varible_name = expression } [ ,… n ]
其中,@varible_name为局部变量的名称。
下面是一个简单的赋值语句:
DECLARE @x char(20) SET @x = 'I Love word'
另外,还可以为多个变量一起赋值,相应的SQL语句如下:
DECLARE @x char(10), @y char(10),@z char(10) --使用DECLARE关键字声明3个变量 SELECT @b='I', @c='like',@a='dog' --使用SELECT关键字为这3个变量赋值
注意
数据库语言和编程语言有一些关键字,关键字是在某一环境下能够促使某一操作发生的字符组。为避免冲突和产生错误,在命名表、列、变量以及其他对象时应避免使用关键字。
1.4.2 全局变量
全局变量是SQL Server系统内部事先定义好的变量,不用用户参与定义,对用户而言是只读的。其作用范围并不局限于某一程序,而是任何程序均可随时调用。全局变量通常用于存储SQL Server的配置设定值和功能统计数据。
SQL Server一共提供了30多个全局变量,本节只对一些常用变量的功能和使用方法进行介绍。全局变量的名称都是以@@开头的。
1.@@CONNECTIONS
@@CONNECTIONS用于记录自最后一次服务器启动以来,所有针对本服务器进行的连接数目,包括没有连接成功的尝试。
使用@@CONNECTIONS,系统管理员可以很容易地得到当天所有试图连接本服务器的连接数目。
2.@@CUP_BUSY
@@CUP_BUSY用于记录自最近一次服务器启动以来,以ms为单位的CPU工作时间。
3.@@CURSOR_ROWS
@@CURSOR_ROWS用于返回在本次服务器连接中,打开游标取出数据行的数目。
4.@@DBTS
@@DBTS用于返回当前数据库中timestamp数据类型的当前值。
5.@@ERROR
@@ERROR用于返回执行上一条SQL语句所返回的错误代码。
在SQL Server服务器执行完一条语句后,如果该语句执行成功,则将返回@@ERROR的值为0;如果该语句执行过程中发生错误,则将返回错误的信息,而@@ERROR将返回相应的错误编号,该编号将一直保持下去,直到下一条语句执行为止。
由于@@ERROR在每一条语句执行后被清除并且重置,因此应在语句验证后立即检查它,或将其保存到一个局部变量中以备事后查看。
6.@@FETCH_STATUS
@@FETCH_STATUS用于返回上一次使用游标FETCH操作所返回的状态值。返回值描述如表1.6所示。
表1.6 @@FETCH_STATUS返回值的描述
例如,到了最后一行数据后,还要接着提取下一行数据,则返回值为−2。
7.@@IDENTITY
@@IDENTITY用于返回最近一次插入的identity列的数值,返回值是numeric。
【例1.4】 使用select @@identity显示新行的标识值。(实例位置:资源包\TM\sl\1\4)
SQL语句如下:
use db_mrsql--使用db_mrsql数据库 --使用@@identity显示插入“学生编号”的数值情况 INSERT INTO tb_student03 VALUES('王自在','男','4101班','90') SELECT @@identity AS '学生编号'
执行此SQL语句,运行结果如图1.5所示。
图1.5 显示新行的标识值
8.@@IDLE
@@IDLE用于返回以ms为单位计算的SQL Server服务器自最近一次启动以来处于停顿状态的时间。
9.@@IO_BUSY
@@IO_BUSY用于返回以ms为单位计算的SQL Server服务器自最近一次启动以来用在输入和输出上的时间。
10.@@LOCK_TIMEOUT
@@LOCK_TIMEOUT用于返回当前对数据锁定的超时设置。
11.@@PACK_RECEIVED
@@PACK_RECEIVED用于返回SQL Server服务器自最近一次启动以来从网络上接收数据分组的数目。
12.@@PACK_SENT
@@PACK_SENT用于返回SQL Server服务器自最近一次启动以来向网络上发送数据分组的数目。
13.@@PROCID
@@PROCID用于返回当前存储过程的ID标识。
14.@@REMSERVER
@@REMSERVER用于返回在登录记录中记载远程SQL Server服务器的名字。
15.@@ROWCOUNT
@@ROWCOUNT用于返回上一条SQL语句所影响到数据行的数目。对所有不影响数据库数据的SQL语句,该全局变量返回的结果是0。在进行数据库编程时,经常要检测@@ROWCOUNT的返回值,以便明确所执行的操作是否实现了目标。
16.@@SPID
@@SPID用于返回当前服务器进程的ID标识。
17.@@TOTAL_ERRORS
@@TOTAL_ERRORS用于返回自SQL Server服务器启动以来所遇到读写错误的总数。
18.@@TOTAL_READ
@@TOTAL_READ用于返回自SQL Server服务器启动以来读磁盘的次数。
19.@@TOTAL_WRITE
@@TOTAL_WRITE用于返回自SQL Server服务器启动以来写磁盘的次数。
20.@@TRANCOUNT
@@TRANCOUNT用于返回当前连接中处于活动状态事务的数目。
21.@@VERSION
@@VERSION用于返回当前SQL Server服务器的安装日期、版本以及处理器的类型。