数据在内存中存储可以变化的量叫作变量。为了在内存中存储信息,用户必须指定存储信息的单元,并为该存储单元命名,以方便获取信息,这就是变量的功能。SQL可以使用两种变量:一种是局部变量,另一种是全局变量。局部变量和全局变量的主要区别在于存储的数据作用范围不同。
局部变量是用户可自定义的变量,它的作用范围仅在程序内部。局部变量的名称是用户自定义的,命名的局部变量名要符合SQL Server标识符命名规则,局部变量名必须以@开头。
局部变量的声明需要使用DECLARE语句。语法如下:
DECLARE { @varaible_name datatype [ ,… n ] }
参数说明如下。
@varaible_name:局部变量的变量名必须以@开头,另外变量名的形式必须符合SQL Server标识符的命名方式。
datatype:局部变量使用的数据类型,可以是除text、ntext或者image类型外所有的系统数据类型和用户自定义数据类型。一般来说,如果没有特殊的用途,建议在应用时尽量使用系统提供的数据类型。这样做可以减少维护应用程序的工作量。
例如,声明局部变量@songname。SQL语句如下:
declare @songname char(10)
为变量赋值的方式一般有两种:一种是使用SELECT语句,另一种是使用SET语句。使用SELECT语句为变量赋值的语法如下:
SELECT @varible_name = expression [FROM table_name [ ,… n ] WHERE clause ]
SELECT语句的作用是给变量赋值,而不是从表中查询数据,并且在使用SELECT语句赋值的过程中,不一定必须使用FROM关键字和WHERE子句。
【例5.2】 在tb_Student数据表中,把“所学专业”是“会计学”的信息赋值给局部变量@songname,并把它的值用print关键字显示。运行结果如图5.2所示。 (实例位置:资源包\ TM\sl\5\2)
图5.2 把查询内容赋值给局部变量
SQL语句如下:
USE db_Test declare @songname nchar(10) select @songname=Name from tb_Student where Spe='会计学' print @songname
SELECT语句赋值和查询不能混淆。例如,声明一个局部变量名是@b并给它赋值的SQL语句如下:
declare @b int select @b=1
另一种为局部变量赋值的方式是使用SET语句,常用语法如下:
{ SET @varible_name = expression } [ ,… n ]
下面是一个简单的赋值语句:
DECLARE @song char(20) SET @song = 'I love flower'
还可以为多个变量一起赋值,相应的SQL语句如下:
declare @b int, @c char(10),@a int select @b=1, @c='love',@a=2
数据库语言和编程语言都有一些关键字。关键字是在某一环境下能够促使某一操作发生的字符组。为避免冲突和产生错误,在命名表、列、变量以及其他对象时应避免使用关键字。
全局变量是SQL Server系统内部事先定义好的变量,不需用户参与定义,对用户而言,其作用范围并不局限于某一程序,任何程序均可随时调用。全局变量通常用于存储一些SQL Server的配置设定值和效能统计数据。
SQL Server一共提供了30多个全局变量,本节只对一些常用的全局变量的功能和使用方法进行介绍。全局变量的名称都是以@@开头的。
@@CONNECTIONS:记录自最后一次服务器启动以来,所有针对这台服务器进行的连接次数,包括没有连接成功的尝试。使用@@CONNECTIONS可以让系统管理员很容易地得到今天所有试图连接本服务器的连接次数。
@@CUP_BUSY:记录自上次启动的工作时间,无论连接成功还是失败,都是以ms为单位的CPU工作时间。
@@CURSOR_ROWS:返回在本次服务器连接中,打开游标(游标是获取一组数据并能够一次与一个单独的数据进行交互的方法)取出数据行的行数。
@@DBTS:返回当前数据库中timestamp数据类型的当前值。
@@ERROR:返回执行上一条SQL语句所返回的错误代码。在SQL Server服务器执行完一条语句后,如果执行成功,则返回@@ERROR的值为0;如果发生错误,则返回错误信息,返回@@ERROR的值为错误代码,该代码将一直保持下去,直到下一条语句执行为止。由于@@ERROR在每一条语句执行后被清除并且重置,因此应在语句验证后立即检查,或将其保存到一个局部变量中以备事后查看。
@@FETCH_STATUS:返回上一次使用游标FETCH操作所返回的状态值,且返回值为整型,其描述如表5.1所示。
表5.1 @@FETCH_STATUS返回值的描述
例如,到了最后一行数据还要取下一行数据时,返回的值为−2,表示行不存在。
@@IDENTITY:返回最近一次插入的identity列的数值,返回值是numeric。
@@IDLE:返回以ms为单位计算SQL Server服务器自最近一次启动以来处于停顿状态的时间。
@@IO_BUSY:返回以ms为单位计算的SQL Server服务器自最近一次启动以来输入和输出使用的时间。
@@LOCK_TIMEOUT:返回当前对数据锁定的超时设置。
@@PACK_RECEIVED:返回SQL Server服务器自最近一次启动以来从网络接收数据分组的总数。
@@PACK_SENT:返回SQL Server服务器自最近一次启动以来向网络发送数据分组的总数。
@@PROCID:返回当前存储过程的ID标识。
@@REMSERVER:返回在登录记录中记载远程的SQL Server服务器名。
@@ROWCOUNT:返回上一条SQL语句影响数据行的行数。对所有不影响数据库数据的SQL语句,这个全局变量返回的结果是0。在进行数据库编程时,经常要检测@@ROWCOUNT的返回值,以便明确执行的操作是否达到了目标。
@@SPID:返回当前服务器进程的ID标识。
@@TOTAL_ERRORS:返回自SQL Server服务器启动以来,遇到读写错误的总数。
@@TOTAL_READ:返回自SQL Server服务器启动以来,读磁盘的次数。
@@TOTAL_WRITE:返回自SQL Server服务器启动以来,写磁盘的次数。
@@TRANCOUNT:返回当前连接中,处于活动状态事务的总数。
@@VERSION:返回当前SQL Server服务器安装日期、版本以及处理器的类型。