突出重围:Transact-SQL管理与开发实例精粹
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.5 变量

Transact-SQL语言中,经常需要使用变量来临时赋值。变量通常用于在Transact-SQL代码中作为存储执行的计数器,或作为临时数据存储场所。

下面重点介绍学习变量要把握的几个问题。

1.5.1 变量的数据类型

所有Transact-SQL支持的数据类型都可以是变量的数据类型。

1.5.2 变量的分类

Transact-SQL程序中的变量分为全局变量和局部变量两类。

1.全局变量

Transact-SQL中的全局变量是由SQL Server系统定义和使用的变量。DBA和用户可以使用全局变量的值,但不能自己定义全局变量。

全局变量以两个@@为标记,如@@CONNECTIONS等。

2.局部变量

Transact-SQL中的局部变量是由用户定义和使用的变量,其作用范围仅仅局限在定义的Transact-SQL程序内。局部变量以一个@为标记,如@A等。

1.5.3 局部变量的声明

Transact-SQL程序中要使用局部变量,首先需要声明。

在Transact-SQL程序中,定义局部变量的语法如下。

        DECLARE
        {{ @local_variable data_type }
        | { @cursor_variable_name CURSOR }
        | { table_type_definition }
        } [ , ...n]

其中主要的参数说明如下。

● @local_variable:局部变量的名称,必须以at符号(@)开头,符合标识符规则。

● data_type:任何由系统提供的或用户定义的数据类型,但不能是text、ntext或image数据类型。

● @cursor_variable_name:游标变量的名称。

● CURSOR:指定变量是局部游标变量。

● table_type_definition:定义表数据类型。

1.5.4 局部变量的赋值

Transact-SQL程序中给局部变量赋值有三种方法。

1.SET语句赋值

在Transact-SQL程序中,用SET语句给局部变量赋值的语法如下。

        SET @local_variable=expression

其中,@local_variable为局部变量名称,expression为有效的表达式,表示将表达式的值赋予局部变量。

2.SELECT语句赋值

与上述语句等效的赋值语句是将SET替换为SELECT。

        SELECT @local_variable=expression

3.通过选择语句赋值

很多情况下,局部变量需要获取通过选择语句查询某个表后得到的字段值。比如下面的Transact-SQL代码中,变量@EmpIDVariable就是通过聚合函数MAX得到的表中的EmployeeID字段的最大值。

        USE AdventureWorks;
        GO
        DECLARE @EmpIDVariable int;
        SELECT @EmpIDVariable = MAX(EmployeeID)
        FROM HumanResources.Employee;
        GO

提示:通过选择获得变量值,变量应该是标量,而且选择语句获得的值应该是唯一的,返回的数据记录行唯一。

如果查询语句返回的值不止一行,而且变量引用一个非标量表达式,那么最后变量的值将是最后一行记录的特定字段的值。比如下面的代码中变量最后将得到HumanResources架构的Employee表的最后一行的EmployeeID字段的值。

        USE AdventureWorks;
        GO
        DECLARE @EmpIDVariable int;
        SELECT @EmpIDVariable = EmployeeID
        FROM HumanResources.Employee
        ORDER BY EmployeeID DESC;
        SELECT @EmpIDVariable;
        GO

1.5.5 局部变量的作用域

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

下面的代码中,局部变量@MyVariable的作用域在于定义其的批处理,由于GO结束了批处理,所以在后面代码中使用局部变量将发生错误。

        USE AdventureWorks;
        GO
        DECLARE @MyVariable int;
        SET @MyVariable = 1;
        GO –此处为局部变量的作用域
        SELECT EmployeeID, NationalIDNumber, Title
        FROM HumanResources.Employee
        WHERE EmployeeID = @MyVariable;