1
数据库原理与应用技术
1.10.1.2 9.1.2 常量与变量
9.1.2 常量与变量

常量与变量是T-SQL中不可或缺的,是T-SQL的基础,两者在使用时必须先定义。

1. 常量

常量是指在程序运行过程中始终固定不变的量,常量的格式取决于它所表示的值的数据类型。对于字符常量或时间日期型常量,需要使用单引号引起来。例如,

select je=$255.28;

select price=218.88

select rq='20130501:20:08:08‘ GO

2. 变量

变量是指在程序运行过程中其值可以变化的数据,是表示一个特定数据值的符号。T-SQL语言允许使用两种变量:一种是用户自己定义的局部变量(Local Variable),另一种是系统提供的全局变量(Global Variable)。

1)局部变量

局部变量是用户自己定义的变量,它的作用范围仅在程序内部。通常只能在一个批处理中或存储过程中使用,用于存储从表中查询到的数据,或作为程序执行过程中暂存变量使用。

局部变量使用DECLARE语句定义,并指定变量的数据类型,然后可以使用SET或SELECT语句为变量初始化;局部变量必须以“@”开头,而且必须先声明后使用。

DECLARE语法格式如下:

DECLARE

{

{{@local_variable [AS] data_type }| [ = value ] }

|{@cursor_variable_name CURSOR }

} [,…n]

.33205

| { @table_variable_name [AS] <table_type_definition> | <user-defined table type>}

其中:@local_variable代表变量的名称,变量名称必须以at(@)符开头,局部变量名称必须符合标识符规则。data_type代表任何系统提供的公共语言运行时(CLR)用户定义表类型或别名数据类型,变量的数据类型不能是text、ntext或image。=value代表以内联方式为变量赋值,值可以是常量或表达式,但它必须与变量声明类型匹配,或者可隐式转换为该类型。@cursor_variable_name代表游标变量的名称,游标变量名称必须以at(@)符开头,并符合有关标识符的规则。CURSOR代表指定变量是局部游标变量。@table_variable_name代表一个类型为table的变量名称,变量名称必须以at(@)符开头,并符合有关标识符的规则。<table_type_definition>代表定义table数据类型。表声明包括列定义、名称、数据类型和约束。允许的约束类型只包括PRIMARY KEY、UNIQUE、NULL和CHECK。如果类型绑定了规则或默认定义,则不能将别名数据类型用作列标量数据类型。n代表可以指定多个变量并对变量赋值的占位符。

声明table变量时,table变量必须是DECLARE语句中声明的唯一变量。

变量初始化语法格式如下:

SELECT @局部变量=变量值

SET @局部变量=变量值

例如,

变量声明为:Declare @num int,

变量定义为:SET @num=1

SELECT @num=1

打印变量为:PRINT num AS '数字'

要注意以下几点。

(1) 第一次声明变量时,其值设置为 NULL。

(2) 如果声明字符型的局部变量,一定要在变量类型中指明其最大长度,否则系统认为其长度为1。

【例9-1】应用系统中要求查询姓胡的学生信息,可设置局部变量findstu来记录学生的姓名信息,然后给该变量赋值'胡%'(以便于做模糊查询),试编写语句。

解:查询语句如下。

USE students

GO

DECLARE @findstu nvarchar(10) --定义局部变量

SET @findstu='胡%' --给局部变量赋值

SELECT * FROM student WHERE s Name LIKE @findstu

查询结果如图9-1所示。

图9-1 例9-1图

若要声明多个局部变量,则在定义的第一个局部变量后使用一个逗号,然后指定下一个局部变量名称和数据类型。例如,

DECLARE @student_no char(10) , @ student _name char(10);

变量的作用域就是可以引用该变量的T-SQL语句的范围。变量的作用域从声明变量的地方开始到声明变量的批处理或存储过程的结尾。

变量具有局部作用域,只在定义它们的批处理或过程中可见。局部(用户定义)变量的作用域限制在一个批处理中,不可在GO语句后引用。

如果SELECT语句返回多行而且变量引用一个非标量表达式,则变量被设置为结果集最后一行中表达式的返回值。

【例9-2】要求查询学生的学号和姓名,可设置局部变量student_no、student_name 来记录学生的学号和姓名信息,查询返回多行信息。变量为返回的最后一行的sno、sname的值,试编写语句。

解:查询语句如下。

USE students

GO

DECLARE @student_no char(10),

@student_name char(10)

SELECT @student_no=sno, @student_name=sname

FROM student ORDER BY sno DESC;

SELECT @student_no as '学号', @student_name AS '姓名'

GO

查询结果如图9-2所示。

图9-2 例9-2图

2)全局变量

全局变量是SQL Server 系统内部使用的变量,通常存储一些SQL Server 的配置设置值和效能统计数据。用户可在程序中用全局变量来测试系统的设定值或T_SQL语句执行后的状态值。引用全局变量时,全局变量的名字前面要有两个标记符“@@”。从SQL Server 7.0开始,全局变量就以系统函数的形式使用。全局变量的符号及其功能如表9-1所示。

表9-1 全局变量及其功能

续表

【例9-3】要求查询学生表中前两位的学生的信息,编写语句。

解:查询语句如下。

SELECT top 2 * FROM student;

SELECT @@ROWCOUNT AS '查询记录数'

查询结果如图9-3所示。如果表中的数据量不小于2,那么SELECT@@ROWCOUNT就会返回2;如果只有1条或0条数据,那么SELECT@@ROWCOUNT就会返回1或者0。

使用全局变量时应该注意以下几点。

(1) 全局变量不是由用户的程序定义的,它们是在服务器级定义的。

(2) 用户只能使用预先定义的全局变量。

(3) 引用全局变量时,必须以标记符“@@”开头。

(4) 局部变量的名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结果。

图9-3 例9-3图