1
数据库技术及应用
1.9.1.4 6.1.4 Transact-SQL语言变量
6.1.4 Transact-SQL语言变量

变量是指在程序运行过程中,其值可以发生变化的量,通常用来保存程序运行过程中的输入数据、计算获得的中间结果和最终结果。变量有名字和数据类型两个属性。变量名用于标识该变量,以便被引用,变量的数据类型(参考情景4)确定了该变量存放数据的格式以及允许的运算。

1.变量

变量名必须是一个合法的标识符(有效的字符序列)。

1)标识符

在SQL Server中标识符分为以下两类。

(1)常规标识符。以ASCII字母、Unicode字母、下划线(_)、at符号(@)或数字符号(#)开头,后续可跟一个或若干个ASCII字符、Unicode字符、at符号、美元符号($)、数字符号或下划线。

注意:常规标识符一定不能是T-SQL保留字。不允许嵌入空格或其他特殊字符。

(2)分隔标识符。包含在双引号(")或者方括号([])内的常规标识符或不符合常规标识符规则的标识符。

注意:带分隔符的标识符可以包含的字符数与常规标识符相同。可以包含1~128个字符,但不包括分隔符字符。对不符合常规标识符规则的标识符必须进行分隔,例如,"My#User ID"、"My DB"、[My.Table]等。

2)变量的分类

SQL Server中变量可以分为以下两类:

(1)全局变量。全局变量由系统提供且预先声明,通过在名称前加两个at符号(@)区别于局部变量。

注意:在SQL Server的早期版本中,@@functions被称为全局变量,但它们不是变量,也不具备变量的行为。在SQL Server7.0及以上版本中,@@functions作为系统函数引用,它们的语法遵循函数的规则。例如,@@ROWCOUNT:返回受上一语句影响的行数。

(2)局部变量。局部变量用于保存单个特定类型的数据值。例如,保存运算的中间结果,作为计数器计算循环执行的次数或控制循环执行的次数,保存存储过程返回代码要返回的数据值或函数返回值等。

当首字母为“@”时,表示该标识符为局部变量名;当首字母为“#”时,表示该标识符为一个临时数据库对象名,若开头含一个“#”,表示该标识符为局部临时数据库对象名,若开头含两个“#”,表示该标识符为全局临时数据库对象名。

2.局部变量的使用

以下介绍局部变量的定义与赋值。

1)局部变量的定义

在批处理或程序中用DECLARE语句声明局部变量,声明后其值设置为NULL。

语法格式:

参数说明如下:

●local_variable:局部变量名,应为合法常规标识符。前面的“@”表示局部变量。

●data_type:数据类型,用于定义局部变量的类型,可为系统类型或自定义类型。

●n:表示可以定义多个变量,各变量之间用“,”号分开。

2)局部变量的赋值

(1)用SET语句赋值。

将先前使用DECLARE@local_variable语句创建的指定局部变量设置为指定值。在初始化多个变量时,为每个局部变量使用单独的SET语句。

语法格式:

参数说明如下:

●local_variable:除cursor、text、ntext、image或table以外的任何类型变量的名称。变量名称必须以at符号(@)开头。变量名称必须符合标识符规则。

●expression:任何有效的SQL Server表达式。

【例6-5】创建@myvar变量,将字符串值放入变量,然后输出@myvar变量的值。

【例6-6】创建一个名为SEX的局部变量,并在SELECT语句中使用该局部变量查找表Student_info中所有男同学的学号和姓名,如图6-4所示。

图6-4 局部变量的使用

(2)用SELECT语句赋值。

语法格式如下:

参数说明如下:

●local_variable:除cursor、text、ntext、image或table以外的任何类型变量的名称。变量名称必须以at符号(@)开头。

●expression:任何有效的SQL Server表达式,包括标量子查询。

●n:表示可以给多个变量赋值,各变量之间用“,”号分开。

注意:@local_variable通常用于将单个值返回到变量中。如果expression为列名,则返回多个值,此时将返回的最后一个赋值给变量;如果SELECT语句没有返回行,变量将保留当前值;如果expression是不返回值的标量子查询,则将变量设为NULL;包含变量赋值的SELECT语句不能也用于执行通常的结果集检索操作。

【例6-7】为变量@var1赋值“张三”。由于Student_info表中不存在为Sid指定的值,因此对该表的查询不返回任何行。变量的值仍为“张三”。

执行结果如图6-5所示。

图6-5 例6-7的执行结果

【例6-8】使用一个子查询为@var1赋值。

由于为Sid请求的值不存在,因此子查询不返回值,并将变量设为NULL,代码如下: